[
  {
    "path": ".gitattributes",
    "content": "# Set default behaviour, in case users don't have core.autocrlf set.\n* text=auto\n"
  },
  {
    "path": ".gitignore",
    "content": "*/target\ntarget\ntmp\n*~\nbin\n*/test-output\ntemp-testng-customsuite.xml\n**pom.xml.releaseBackup\nrelease.properties\ngen\n*/seed.txt\nnotes\nlogs\ngen-external-apklibs\n.idea\n*.iml\n.DS_Store\n*.swp\nout\n.gradle\n/local.properties\n/build\n\n###OSX###\n\n.DS_Store\n.AppleDouble\n.LSOverride\n\n# Icon must ends with two \\r.\nIcon\n\n\n# Thumbnails\n._*\n\n# Files that might appear on external disk\n.Spotlight-V100\n.Trashes\n\n\n###Linux###\n\n*~\n\n# KDE directory preferences\n.directory\n\n\n###Android###\n\n# Built application files\n*.apk\n*.ap_\n\n# Files for ART and Dalvik VM\n*.dex\n\n# Java class files\n*.class\n\n# Generated files\nbin/\ngen/\n\n# Gradle files\n.gradle/\n.gradletasknamecache\nbuild/\n\n# Local configuration file (sdk path, etc)\nlocal.properties\n\n# Proguard folder generated by Eclipse\nproguard/\n\n# Lint\nlint-report.html\nlint-report_files/\nlint_result.txt\n\n# Mobile Tools for Java (J2ME)\n.mtj.tmp/\n\n# Package Files #\n*.war\n*.ear\n\n# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml\nhs_err_pid*\n\n\n###IntelliJ###\n\n*.iml\n*.ipr\n*.iws\n.idea/\n\n\n###Eclipse###\n\n*.pydevproject\n.metadata\ntmp/\n*.tmp\n*.bak\n*.swp\n*~.nib\n.settings/\n.loadpath\n\n# External tool builders\n.externalToolBuilders/\n\n# Locally stored \"Eclipse launch configurations\"\n*.launch\n\n# CDT-specific\n.cproject\n\n# PDT-specific\n.buildpath\n\n# sbteclipse plugin\n.target\n\n# TeXlipse plugin\n.texlipse\n\n#GitHub application codes (local and personal)\ngithub.properties\n"
  },
  {
    "path": ".travis.yml",
    "content": "language: android\nandroid:\n   components:\n   - tools\n   - tools #Running this twice get's the latest build tools (https://github.com/codepath/android_guides/wiki/Setting-up-Travis-CI)\n   - platform-tools\n   - android-28\n   - build-tools-28.0.3\n   - extra\n   licenses:\n   - 'android-sdk-license-.+'\n\njdk: oraclejdk8\n\nnotifications:\n  email: false\n\nsudo: required #The build runs out of memory and is killed if we use the container system\n\nbefore_install:\n  - yes | sdkmanager \"platforms;android-28\"\n\nscript:\n  - ./gradlew clean build\n  - ./gradlew test\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "Contributing\n============\n\n## Reporting issues\n\n* IMPORTANT: Any issues reported regarding the old Play Store version of the original GitHub app will be closed without investigation. Please only report issues regarding the current repo version (i.e. you must confirm this issue exists in the latest master). This is a different app now, and many old issues with the original app (such as 2FA) were resolved in master but not released.\n* Make sure there's not already an issue (open or closed) regarding your issue.\n* Include detailed information and steps to reproduce. Any issues opened with no description will be ignored.\n* Include a screenshot(s) of the issue. Brownie points for a screen recording of the issue.\n\n## ALL pull requests\n\nPlease include a descriptive title and description. If you changed anything with the UI, please include screenshots of how\nit looks. Use descriptive messages for your commits, and be sure to explain the *why* for commits where appropriate.\n\nPlease **don't** squash all your commits into one before opening the PR. Commits are easier to review when they're split up and in the\norder they happened. Of course, do squash smaller commits together as needed to ensure a clean history.\n\nIf you open a pull request, you are responsible for engaging with us in the review and discussion afterward. If you don't respond\nto comments after opening, we will probably just close it.\n\n## Translations\n\nAlways welcome, but please be prepared to have someone else that speaks if available to review it. Chances are that we cannot\nreview it ourselves, for obvious reasons.\n\n## Bugfixes for existing issues\n\nAlways welcome. Please reference the issue number you're addressing in the PR, and let us know in the issue tracker if\nyou're working on it.\n\n## New features, UI changes, and infrastructure changes\n\nPlease make sure you discuss these with us in the issue tracker before opening a pull request. It's good to get a conversation\ngoing first to make sure that everyone is on the same page, and this way you don't accidentally invest a lot of time into\nsomething we don't want to merge. That said, we're always open to these, so please don't hesitate to start the discussion!\n"
  },
  {
    "path": "ISSUE_TEMPLATE.md",
    "content": "## If the issues at hand is a BUG, please follow this template. Otherwise feel free to ignore it.\n\n## Description\nA concise description of what the problem is.\n\n### Versions and device\nWhat version of the app does this happen on?\\\nWas the version downloaded from the Play Store?\\\nWhat version of Android does it happen on?\\\nWhat model of phone does it happen on?\n\n## Steps to Reproduce\n1. Step by step instructions on how to reproduce this bug.\n2. The more detailed your list of instructions, the easier it is for the developer to track down the problem!\n\n### Actual behaviour\nDescribe what happens when you perform the steps above.\n\n### Expected behaviour\nDescribe what you expected to happen when performing the steps above.\n\n## Logs\nPlease include any relevant log output that might assist in tracking down the problem.\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.\n"
  },
  {
    "path": "README.md",
    "content": "# PocketHub [![Build Status](https://travis-ci.org/pockethub/PocketHub.svg?branch=master)](https://travis-ci.org/pockethub/PocketHub) <a style=\"margin-bottom: 0;\" href='https://play.google.com/store/apps/details?id=com.github.pockethub.android&utm_source=global_co&utm_medium=prtnr&utm_content=Mar2515&utm_campaign=PartBadge&pcampaignid=MKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1'><img alt='Get it on Google Play' src='https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png' height=\"80px\"/></a>\n\nThis repository contains the source code for the PocketHub Android app.\n\nThis is the *same* repository as the now-defunct official GitHub Android app.\n\n## What's going on here?\n\n> What happened to the old app?\n\nGitHub didn't want to maintain the app anymore, so it's been released to the community and maintained as a public project.\nWe are actively working towards a re-release to the Play Store, and this app will be the spiritual successor to the original GitHub app.\n\n> What's PocketHub?\n\nA name we decided that sounded good. We're a team of a few people helping organizing and prepare this. \n\n> What about the other forks out there?\n\nThey'll remain forks. Obviously we'd prefer them to focus on improving this project, but otherwise we're not coordinating anything with them.\n\n> What's the immediate plan?\n\nWe're shooting for an initial re-release just to get the app out there. There have been a significant number of changes since the app was last updated, with many functional and design changes that we need to make sure are good to go.\n\n> What's the less-immediate plan?\n\nAfter the initial release, we'll start working on giving this app a proper refresh. Much of the UI has already been touched up with elements of Material Design, but we have a long ways to go. Android has changed a lot since this was actively developed, and it's time we take advantage of those changes.\n\n> How can I help?\n\nPlease see the [issues](https://github.com/pockethub/PocketHub/issues) section to report any bugs or feature requests and to see the list of known issues. We can't promise fast response times since we all have full time jobs of our own, but we will do our best to respond in a timely fashion.  If you'd like to contribute, please fork this repository and contribute back using [pull requests](https://github.com/pockethub/PocketHub/pulls).\n\nAny contributions, large or small, major features, bug fixes, additional language translations, unit/integration tests are welcomed and appreciated but will be thoroughly reviewed and discussed. **Please read [CONTRIBUTING.md](https://github.com/pockethub/PocketHub/blob/master/CONTRIBUTING.md) first!**\n\n## Setup Environment\n\n1. Create a GitHub application (https://github.com/settings/applications/new)\n2. Set the following gradle properties via one of the ways described [here](https://docs.gradle.org/current/userguide/build_environment.html#sec:gradle_properties_and_system_properties):\n  - `pockethub_github_client`=your_application_client_id\n  - `pockethub_github_secret`=your_application_client_secret\n  - `pockethub_github_callback`=your_callback_url\n\n### Callback URL\n- The callback URL needs to be in the format `your_schema://whatever_you_want`\n- Use a custom schema like `myawesomeschema` (not `http` or `https`)\n- The schema must be lowercase ([Reference](https://developer.android.com/guide/topics/manifest/data-element.html))\n\n## Legacy Notes\n\nIf you had a current installation of the Github App installed and then enabled 2FA (2 Factor Authentication), then you must delete the Personal Access Token (PAT) from your configuration (via the web interface). A thanks to @landstander668 for posting this workaround.\n\n## License\n\n* [Apache Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.html)\n"
  },
  {
    "path": "app/build.gradle",
    "content": "apply plugin: 'com.android.application'\napply plugin: 'kotlin-android'\napply plugin: 'kotlin-android-extensions'\napply plugin: 'kotlin-kapt'\napply plugin: 'com.github.ben-manes.versions'   // ./gradlew dependencyUpdates -Drevision=release\napply plugin: 'com.squareup.sqldelight'\n//apply from: 'quality.gradle'\n\nrepositories {\n    flatDir {\n        dirs 'libs'\n    }\n}\n\n// Manifest version information!\ndef versionMajor = 0\ndef versionMinor = 5\ndef versionPatch = 1\ndef versionBuild = 0 // bump for dogfood builds, public betas, etc.\n\ndef isTravis = \"true\".equals(System.getenv(\"TRAVIS\"))\ndef preDexEnabled = \"true\".equals(System.getProperty(\"pre-dex\", \"true\"))\ndef clientIdIsNotSet = true;\ndef clientSecretIsNotSet = true;\n\ndef addConfigValues = { name, isDebug, suffix = \"\" ->\n    def value = (isDebug ? \"com.github.debug\" : \"com.github\") + suffix\n\n    android.defaultConfig.buildConfigField \"String\", name, \"\\\"${value}\\\"\"\n    android.defaultConfig.resValue \"string\", name.toLowerCase(), value\n}\n\nsqldelight {\n    Database {\n        packageName = \"com.github.pockethub.android\"\n    }\n}\n\nandroid {\n    compileSdkVersion 28\n\n    defaultConfig {\n        applicationId 'com.github.pockethub.android'\n        minSdkVersion 19\n        targetSdkVersion 28\n        multiDexEnabled true\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n        testOptions.unitTests.includeAndroidResources = true\n\n        versionCode versionMajor * 10000 + versionMinor * 1000 + versionPatch * 100 + versionBuild\n        versionName \"${versionMajor}.${versionMinor}.${versionPatch}\"\n        vectorDrawables.useSupportLibrary = true\n\n        addConfigValues(\"ACCOUNT_TYPE\", false)\n        addConfigValues(\"PROVIDER_AUTHORITY_SYNC\", false, \".sync\")\n        addConfigValues(\"PROVIDER_AUTHORITY_SEARCH_SUGGEST_ISSUES\", false, \".search.suggest.recent.issues\")\n        addConfigValues(\"PROVIDER_AUTHORITY_SEARCH_SUGGEST_REPOS\", false, \".search.suggest.recent.repos\")\n\n        if (project.hasProperty('pockethub_github_client')) {\n            resValue \"string\", \"github_client\", pockethub_github_client\n            clientIdIsNotSet = false\n        } else {\n            resValue \"string\", \"github_client\", \"dummy_client\"\n        }\n\n        if (project.hasProperty('pockethub_github_secret')) {\n            resValue \"string\", \"github_secret\", pockethub_github_secret\n            clientSecretIsNotSet = false\n        } else {\n            resValue \"string\", \"github_secret\", \"dummy_secret\"\n        }\n\n        if (clientIdIsNotSet || clientSecretIsNotSet) {\n            logger.warn(\"You won't be able to login, because the oauth client or secret isn't set\")\n            logger.warn(\"Read the README.md: https://github.com/pockethub/PocketHub#setup-environment\")\n        }\n\n        if (project.hasProperty('pockethub_bugsnag_api_key')) {\n            resValue \"string\", \"bugsnag_api_key\", pockethub_bugsnag_api_key\n        } else {\n            resValue \"string\", \"bugsnag_api_key\", \"bugsnag-api-key\"\n        }\n\n        String oauth = \"\"\n        if (project.hasProperty('pockethub_github_callback')) {\n            oauth = pockethub_github_callback\n        } else {\n            oauth = \"http://dummy.example.com\"\n        }\n\n        resValue \"string\", \"github_oauth\", oauth\n        resValue \"string\", \"github_oauth_scheme\", oauth.split(\"://\")[0]\n    }\n\n\n    buildTypes {\n        debug {\n            addConfigValues(\"ACCOUNT_TYPE\", true)\n            addConfigValues(\"PROVIDER_AUTHORITY_SYNC\", true, \".sync\")\n            addConfigValues(\"PROVIDER_AUTHORITY_SEARCH_SUGGEST_ISSUES\", true, \".search.suggest.recent.issues\")\n            addConfigValues(\"PROVIDER_AUTHORITY_SEARCH_SUGGEST_REPOS\", true, \".search.suggest.recent.repos\")\n            applicationIdSuffix \".debug\"\n        }\n\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_1_8\n        targetCompatibility JavaVersion.VERSION_1_8\n    }\n\n    kotlinOptions {\n        jvmTarget = JavaVersion.VERSION_1_8.toString()\n    }\n\n    testOptions {\n        animationsDisabled = true\n        unitTests {\n            includeAndroidResources = true\n        }\n    }\n\n    configurations {\n        implementation.exclude group: 'org.jetbrains', module: 'annotations'\n    }\n\n    packagingOptions {\n        exclude 'META-INF/DEPENDENCIES'\n        exclude 'META-INF/LICENSE'\n        exclude 'META-INF/NOTICE'\n    }\n\n    lintOptions {\n        warning 'MissingTranslation'\n        abortOnError true\n        check 'NewApi', 'InlinedApi'\n        fatal 'NewApi', 'InlinedApi'\n        checkReleaseBuilds true\n        \n        textReport isTravis\n        textOutput 'stdout'\n        \n        htmlReport !isTravis\n        xmlReport !isTravis\n    }\n\n    dexOptions {\n        // Skip pre-dexing when running on Travis CI or when disabled via -Dpre-dex=false.\n        preDexLibraries = preDexEnabled && !isTravis\n    }\n}\n\nandroidExtensions {\n    experimental = true\n}\n\nkapt {\n    correctErrorTypes = true\n}\n\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n\n    implementation \"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version\"\n\n    implementation 'androidx.core:core-ktx:1.2.0'\n    implementation 'androidx.appcompat:appcompat:1.1.0'\n    implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.0.0'\n    implementation 'com.google.android.material:material:1.1.0'\n\n    final def markwon_version = '4.3.0'\n    implementation \"io.noties.markwon:core:$markwon_version\"\n    implementation \"io.noties.markwon:ext-strikethrough:$markwon_version\"\n    implementation \"io.noties.markwon:ext-tasklist:$markwon_version\"\n    implementation \"io.noties.markwon:html:$markwon_version\"\n    implementation \"io.noties.markwon:image:$markwon_version\"\n    implementation \"io.noties.markwon:image-glide:$markwon_version\"\n    implementation \"io.noties.markwon:linkify:$markwon_version\"\n    implementation \"io.noties.markwon:recycler-table:$markwon_version\"\n    implementation \"io.noties.markwon:syntax-highlight:$markwon_version\"\n\n    implementation \"com.caverock:androidsvg:1.4\"\n    implementation \"pl.droidsonroids.gif:android-gif-drawable:1.2.19\"\n\n    implementation 'com.github.bumptech.glide:glide:4.11.0'\n    implementation \"com.github.bumptech.glide:okhttp3-integration:4.11.0\"\n    kapt 'com.github.bumptech.glide:compiler:4.11.0'\n\n    kapt 'io.noties:prism4j-bundler:2.0.0'\n\n    implementation 'com.squareup.okhttp3:okhttp:3.10.0'\n    implementation \"com.squareup.sqldelight:android-driver:1.2.2\"\n\n    implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'\n    implementation 'io.reactivex.rxjava2:rxjava:2.1.10'\n    implementation 'com.uber.autodispose:autodispose:0.6.1'\n    implementation 'com.uber.autodispose:autodispose-android-archcomponents:0.6.1'\n\n    implementation 'com.bugsnag:bugsnag-android:4.3.1'\n\n    implementation 'com.google.dagger:dagger:2.27'\n    implementation 'com.google.dagger:dagger-android:2.27'\n    implementation 'com.google.dagger:dagger-android-support:2.27'\n    \n    kapt 'com.google.dagger:dagger-compiler:2.27'\n    kapt 'com.google.dagger:dagger-android-processor:2.27'\n\n    compileOnly 'com.episode6.hackit.auto.factory:auto-factory-annotations:1.0-beta5'\n    kapt 'com.google.auto.factory:auto-factory:1.0-beta7'\n\n    implementation 'com.github.meisolsson:githubsdk:0.7.0'\n    implementation \"com.squareup.moshi:moshi:1.9.2\"\n    implementation 'com.afollestad.material-dialogs:core:0.9.6.0'\n    implementation 'com.xwray:groupie:2.3.0'\n    implementation 'com.xwray:groupie-kotlin-android-extensions:2.3.0'\n\n    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.1.0'\n    androidTestImplementation 'com.android.support:support-annotations:28.0.0'\n    androidTestImplementation 'com.android.support.test:runner:1.0.2'\n    androidTestImplementation 'com.android.support.test:rules:1.0.2'\n\n    //Libs for testing\n    testImplementation 'junit:junit:4.12'\n    testImplementation \"org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version\"\n    testImplementation \"androidx.test:core:1.2.0\"\n    testImplementation \"org.mockito:mockito-core:2.18.3\"\n    testImplementation \"org.robolectric:robolectric:4.2.1\"\n}\n"
  },
  {
    "path": "app/quality.gradle",
    "content": "apply plugin: 'checkstyle'\n\ncheck.dependsOn 'checkstyle'\n\ncheckstyle {\n    toolVersion = '7.5.1'\n}\n\ntask checkstyle(type: Checkstyle) {\n    configFile file(\"${project.rootDir}/script/style/checkstyle.xml\")\n    source 'src'\n    include '**/*.java'\n    exclude '**/gen/**'\n\n    classpath = files()\n\n    reports {\n        html {\n            enabled true\n            destination \"$project.buildDir/reports/checkstyle/checkstyle.html\"\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/androidTest/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.github.pockethub.android.tests\"\n    android:versionCode=\"100\"\n    android:versionName=\"1.0\" >\n\n    <application>\n        <uses-library android:name=\"android.test.runner\" />\n    </application>\n</manifest>\n"
  },
  {
    "path": "app/src/androidTest/java/com/github/pockethub/android/tests/NewsEventTextTest.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.tests;\n\nimport android.content.Context;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.widget.TextView;\nimport androidx.test.annotation.UiThreadTest;\nimport androidx.test.filters.SmallTest;\nimport androidx.test.runner.AndroidJUnit4;\nimport com.github.pockethub.android.R;\nimport com.github.pockethub.android.ui.item.news.NewsItem;\nimport com.github.pockethub.android.util.AvatarLoader;\nimport com.meisolsson.githubsdk.model.*;\nimport com.meisolsson.githubsdk.model.payload.*;\nimport com.xwray.groupie.ViewHolder;\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\n\nimport java.util.Collections;\nimport java.util.Date;\n\nimport static androidx.test.InstrumentationRegistry.getInstrumentation;\nimport static junit.framework.Assert.assertNotNull;\nimport static org.junit.Assert.assertEquals;\n\n/**\n * Tests of the news text rendering\n */\n@RunWith(AndroidJUnit4.class)\n@SmallTest\npublic class NewsEventTextTest {\n\n    private TextView text;\n\n    private User actor;\n\n    private GitHubEvent.RepoIdentifier repo;\n\n    private AvatarLoader avatarLoader;\n\n    private LayoutInflater layoutInflater;\n\n    @Before\n    public void setUp() {\n        actor = User.builder().login(\"user\").build();\n        repo = GitHubEvent.RepoIdentifier.builder()\n                .repoWithUserName(\"user/repo\")\n                .build();\n\n        Context context = getInstrumentation().getTargetContext();\n        avatarLoader = new AvatarLoader(context);\n        layoutInflater = LayoutInflater.from(context);\n    }\n\n    private GitHubEvent createEvent(GitHubEventType type, GitHubPayload payload) {\n        return GitHubEvent.builder()\n                .id(\"test\")\n                .createdAt(new Date())\n                .type(type)\n                .payload(payload)\n                .actor(actor)\n                .repo(repo)\n                .build();\n    }\n\n    private void verify(String expected) {\n        CharSequence actual = text.getText();\n        assertNotNull(actual);\n        assertEquals(expected, actual.toString());\n    }\n\n    private void updateView(GitHubEvent event) {\n\n        NewsItem item = NewsItem.createNewsItem(avatarLoader, event);\n\n        View itemView = layoutInflater.inflate(item.getLayout(), null);\n        ViewHolder viewHolder = item.createViewHolder(itemView);\n        item.bind((com.xwray.groupie.kotlinandroidextensions.ViewHolder) viewHolder, 0);\n\n        text = viewHolder.itemView.findViewById(R.id.tv_event);\n        assertNotNull(text);\n    }\n\n    /**\n     * Verify text of commit comment event\n     */\n    @Test\n    @UiThreadTest\n    public void testCommitCommentEvent() {\n        GitHubEvent event = createEvent(GitHubEventType.CommitCommentEvent,\n                CommitCommentPayload.builder().build());\n        updateView(event);\n\n        verify(\"user commented on user/repo\");\n    }\n\n    /**\n     * Verify text of create event\n     */\n    @Test\n    @UiThreadTest\n    public void testCreateRepositoryEvent() {\n        CreatePayload payload = CreatePayload.builder()\n                .refType(ReferenceType.Repository)\n                .build();\n\n        GitHubEvent event = createEvent(GitHubEventType.CreateEvent, payload);\n        updateView(event);\n\n        verify(\"user created repository repo\");\n    }\n\n    /**\n     * Verify text of create event\n     */\n    @Test\n    @UiThreadTest\n    public void testCreateBranchEvent() {\n        CreatePayload payload = CreatePayload.builder()\n                .refType(ReferenceType.Branch)\n                .ref(\"b1\")\n                .build();\n\n        GitHubEvent event = createEvent(GitHubEventType.CreateEvent, payload);\n        updateView(event);\n\n        verify(\"user created branch b1 at user/repo\");\n    }\n\n    /**\n     * Verify text of delete event\n     */\n    @Test\n    @UiThreadTest\n    public void testDelete() {\n        DeletePayload payload = DeletePayload.builder()\n                .refType(ReferenceType.Branch)\n                .ref(\"b1\")\n                .build();\n\n        GitHubEvent event = createEvent(GitHubEventType.DeleteEvent, payload);\n        updateView(event);\n\n        verify(\"user deleted branch b1 at user/repo\");\n    }\n\n    /**\n     * Verify text of follow event\n     */\n    @Test\n    @UiThreadTest\n    public void testFollow() {\n        User target = User.builder()\n                .login(\"user2\")\n                .build();\n\n        FollowPayload payload = FollowPayload.builder()\n                .target(target)\n                .build();\n\n        GitHubEvent event = createEvent(GitHubEventType.FollowEvent, payload);\n        updateView(event);\n\n        verify(\"user started following user2\");\n    }\n\n    /**\n     * Verify text of Gist event\n     */\n    @Test\n    @UiThreadTest\n    public void testGist() {\n        Gist gist = Gist.builder()\n                .id(\"1\")\n                .build();\n\n        GistPayload payload = GistPayload.builder()\n                .action(GistPayload.Action.Created)\n                .gist(gist)\n                .build();\n\n        GitHubEvent event = createEvent(GitHubEventType.GistEvent, payload);\n        updateView(event);\n\n        verify(\"user created Gist 1\");\n    }\n\n    /**\n     * Verify text of wiki event\n     */\n    @Test\n    @UiThreadTest\n    public void testWiki() {\n        GitHubEvent event = createEvent(GitHubEventType.GollumEvent, null);\n        updateView(event);\n\n        verify(\"user updated the wiki in user/repo\");\n    }\n\n    /**\n     * Verify text of issue comment event\n     */\n    @Test\n    @UiThreadTest\n    public void testIssueComment() {\n        Issue issue = Issue.builder()\n                .number(5)\n                .build();\n\n        IssueCommentPayload payload = IssueCommentPayload.builder()\n                .issue(issue)\n                .build();\n\n        GitHubEvent event = createEvent(GitHubEventType.IssueCommentEvent, payload);\n        updateView(event);\n\n        verify(\"user commented on issue 5 on user/repo\");\n    }\n\n    /**\n     * Verify text of issue event\n     */\n    @Test\n    @UiThreadTest\n    public void testIssue() {\n        Issue issue = Issue.builder()\n                .number(8)\n                .build();\n\n        IssuesPayload payload = IssuesPayload.builder()\n                .action(IssuesPayload.Action.Closed)\n                .issue(issue)\n                .build();\n\n        GitHubEvent event = createEvent(GitHubEventType.IssuesEvent, payload);\n        updateView(event);\n\n        verify(\"user closed issue 8 on user/repo\");\n    }\n\n    /**\n     * Verify text of member event\n     */\n    @Test\n    @UiThreadTest\n    public void testAddMember() {\n        User user = User.builder()\n                .login(\"person\")\n                .build();\n\n        MemberPayload payload = MemberPayload.builder()\n                .member(user)\n                .build();\n\n        GitHubEvent event = createEvent(GitHubEventType.MemberEvent, payload);\n        updateView(event);\n\n        verify(\"user added person as a collaborator to user/repo\");\n    }\n\n    /**\n     * Verify text of open sourced event\n     */\n    @Test\n    @UiThreadTest\n    public void testOpenSourced() {\n        GitHubEvent event = createEvent(GitHubEventType.PublicEvent, null);\n        updateView(event);\n\n        verify(\"user open sourced repository user/repo\");\n    }\n\n    /**\n     * Verify text of watch event\n     */\n    @Test\n    @UiThreadTest\n    public void testWatch() {\n        GitHubEvent event = createEvent(GitHubEventType.WatchEvent, null);\n        updateView(event);\n\n        verify(\"user starred user/repo\");\n    }\n\n    /**\n     * Verify text of pull request event\n     */\n    @Test\n    @UiThreadTest\n    public void testPullRequest() {\n        PullRequestPayload payload = PullRequestPayload.builder()\n                .number(30)\n                .action(PullRequestPayload.Action.Closed)\n                .build();\n\n        GitHubEvent event = createEvent(GitHubEventType.PullRequestEvent, payload);\n        updateView(event);\n\n        verify(\"user closed pull request 30 on user/repo\");\n    }\n\n    /**\n     * Verify text of push event\n     */\n    @Test\n    @UiThreadTest\n    public void testPush() {\n        PushPayload payload = PushPayload.builder()\n                .ref(\"refs/heads/master\")\n                .commits(Collections.emptyList())\n                .build();\n\n        GitHubEvent event = createEvent(GitHubEventType.PushEvent, payload);\n        updateView(event);\n\n        verify(\"user pushed to master at user/repo\");\n    }\n\n    /**\n     * Verify text of push event\n     */\n    @Test\n    @UiThreadTest\n    public void testTeamAdd() {\n        Team team = Team.builder()\n                .name(\"t1\")\n                .build();\n\n        Repository repo = Repository.builder()\n                .name(\"r2\")\n                .build();\n\n        TeamAddPayload payload = TeamAddPayload.builder()\n                .repository(repo)\n                .team(team)\n                .build();\n\n        GitHubEvent event = createEvent(GitHubEventType.TeamAddEvent, payload);\n        updateView(event);\n\n        verify(\"user added r2 to team t1\");\n    }\n}\n"
  },
  {
    "path": "app/src/androidTest/java/com/github/pockethub/android/tests/ViewVisibiltyIdlingResource.kt",
    "content": "package com.github.pockethub.android.tests\n\nimport android.app.Activity\nimport android.os.Handler\nimport android.view.View\nimport androidx.annotation.IdRes\nimport androidx.test.espresso.IdlingResource\nimport androidx.test.espresso.IdlingResource.ResourceCallback\nimport java.lang.ref.WeakReference\n\n/**\n * [IdlingResource] which monitors a [View] for a given visibility state. The resource is considered idle when the\n * View has the desired state.\n *\n * @author vaughandroid@gmail.com\n * @param view the View to monitor\n * @param visibility One of [View.VISIBLE], [View.INVISIBLE], or [View.GONE].\n */\nclass ViewVisibilityIdlingResource(view: View, private val mVisibility: Int) : IdlingResource {\n\n    /** Hold weak reference to the View, so we don't leak memory even if the resource isn't unregistered.  */\n    private val mView: WeakReference<View> = WeakReference(view)\n    private val mName: String\n\n    private var mResourceCallback: ResourceCallback? = null\n\n    /**\n     * @param activity which owns the View\n     * @param viewId ID of the View to monitor\n     * @param visibility One of [View.VISIBLE], [View.INVISIBLE], or [View.GONE].\n     */\n    constructor(activity: Activity, @IdRes viewId: Int, visibility: Int)\n        : this(activity.findViewById<View>(viewId), visibility)\n\n    init {\n        mName = \"View Visibility for view \" + view.id + \"(@\" + System.identityHashCode(mView) + \")\"\n    }\n\n    override fun getName(): String {\n        return mName\n    }\n\n    override fun isIdleNow(): Boolean {\n        val view = mView.get()\n        val isIdle = view == null || view.visibility == mVisibility\n        if (isIdle) {\n            if (mResourceCallback != null) {\n                mResourceCallback!!.onTransitionToIdle()\n            }\n        } else {\n            /* Force a re-check of the idle state in a little while.\n             * If isIdleNow() returns false, Espresso only polls it every few seconds which can slow down our tests.\n             * Ideally we would watch for the visibility state changing, but AFAIK we can't detect when a View's\n             * visibility changes to GONE.\n             */\n            Handler().postDelayed({ isIdleNow }, IDLE_POLL_DELAY_MILLIS.toLong())\n        }\n\n        return isIdle\n    }\n\n    override fun registerIdleTransitionCallback(resourceCallback: ResourceCallback) {\n        mResourceCallback = resourceCallback\n    }\n\n    companion object {\n\n        private val IDLE_POLL_DELAY_MILLIS = 100\n    }\n}"
  },
  {
    "path": "app/src/androidTest/java/com/github/pockethub/android/tests/commit/CommitUriMatcherTest.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.tests.commit;\n\nimport android.net.Uri;\n\nimport androidx.test.filters.SmallTest;\nimport androidx.test.runner.AndroidJUnit4;\nimport com.github.pockethub.android.core.commit.CommitMatch;\nimport com.github.pockethub.android.core.commit.CommitUriMatcher;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\n\nimport static junit.framework.Assert.assertNotNull;\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertNull;\n\n/**\n * Tests of {@link CommitUriMatcher}\n */\n@RunWith(AndroidJUnit4.class)\n@SmallTest\npublic class CommitUriMatcherTest {\n\n    /**\n     * Verity empty uri\n     */\n    @Test\n    public void testEmptyUri() {\n        assertNull(CommitUriMatcher.getCommit(Uri.parse(\"\")));\n    }\n\n    /**\n     * Verify non-hex commit SHA-1 in uri\n     */\n    public void testNonHexId() {\n        assertNull(CommitUriMatcher.getCommit(Uri\n                .parse(\"https://github.com/defunkt/resque/commit/abck\")));\n    }\n\n    /**\n     * Verify http uri\n     */\n    @Test\n    public void testHttpUri() {\n        CommitMatch commit = CommitUriMatcher.getCommit(Uri\n                .parse(\"https://github.com/defunkt/resque/commit/abcd\"));\n        assertNotNull(commit);\n        assertEquals(\"abcd\", commit.getCommit());\n        assertNotNull(commit.getRepository());\n        assertEquals(\"resque\", commit.getRepository().name());\n        assertNotNull(commit.getRepository().owner());\n        assertEquals(\"defunkt\", commit.getRepository().owner().login());\n    }\n\n    /**\n     * Verify https uri\n     */\n    @Test\n    public void testHttpsUri() {\n        CommitMatch commit = CommitUriMatcher.getCommit(Uri\n                .parse(\"https://github.com/defunkt/resque/commit/1234\"));\n        assertNotNull(commit);\n        assertEquals(\"1234\", commit.getCommit());\n        assertNotNull(commit.getRepository());\n        assertEquals(\"resque\", commit.getRepository().name());\n        assertNotNull(commit.getRepository().owner());\n        assertEquals(\"defunkt\", commit.getRepository().owner().login());\n    }\n\n    /**\n     * Verify uri with comment fragment\n     */\n    @Test\n    public void testCommentUri() {\n        CommitMatch commit = CommitUriMatcher\n                .getCommit(Uri\n                        .parse(\"https://github.com/defunkt/resque/commit/a1b2#commitcomment-1605701\"));\n        assertNotNull(commit);\n        assertEquals(\"a1b2\", commit.getCommit());\n        assertNotNull(commit.getRepository());\n        assertEquals(\"resque\", commit.getRepository().name());\n        assertNotNull(commit.getRepository().owner());\n        assertEquals(\"defunkt\", commit.getRepository().owner().login());\n    }\n}\n"
  },
  {
    "path": "app/src/androidTest/java/com/github/pockethub/android/tests/commit/CommitUtilsTest.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.tests.commit;\n\nimport androidx.test.filters.SmallTest;\nimport com.github.pockethub.android.core.commit.CommitUtils;\nimport com.meisolsson.githubsdk.model.Commit;\nimport com.meisolsson.githubsdk.model.GitHubFile;\nimport com.meisolsson.githubsdk.model.git.GitCommit;\nimport com.meisolsson.githubsdk.model.git.GitUser;\nimport org.junit.Test;\n\nimport java.util.Date;\n\nimport static junit.framework.Assert.assertFalse;\nimport static junit.framework.TestCase.assertTrue;\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertNull;\n\n/**\n * Test of {@link CommitUtils}\n */\n@SmallTest\npublic class CommitUtilsTest {\n\n    /**\n     * Test commit SHA-1 abbreviation\n     */\n    @Test\n    public void testAbbreviate() {\n        assertNull(CommitUtils.abbreviate((GitCommit) null));\n        assertNull(CommitUtils.abbreviate((Commit) null));\n        assertNull(CommitUtils.abbreviate((String) null));\n        assertEquals(\"\", CommitUtils.abbreviate(\"\"));\n        assertEquals(\"a\", CommitUtils.abbreviate(\"a\"));\n        assertEquals(\"abcdefghij\", CommitUtils.abbreviate(\"abcdefghijk\"));\n\n        GitCommit gitCommit = GitCommit.builder()\n                .sha(\"abc\")\n                .build();\n\n        assertEquals(\"abc\", CommitUtils.abbreviate(gitCommit));\n\n        Commit commit = Commit.builder()\n                .sha(\"abcd\")\n                .build();\n\n        assertEquals(\"abcd\", CommitUtils.abbreviate(commit));\n    }\n\n    /**\n     * Test commit name parsing from path\n     */\n    @Test\n    public void testGetName() {\n        assertNull(CommitUtils.getName((String) null));\n        assertNull(CommitUtils.getName((GitHubFile) null));\n        assertEquals(\"\", CommitUtils.getName(\"\"));\n        assertEquals(\"/\", CommitUtils.getName(\"/\"));\n        assertEquals(\"b\", CommitUtils.getName(\"a/b\"));\n        GitHubFile file = GitHubFile.builder().filename(\"a/b/c\").build();\n        assertEquals(\"c\", CommitUtils.getName(file));\n    }\n\n    /**\n     * Test commit SHA-1 evaluation\n     */\n    @Test\n    public void testIsValidCommit() {\n        assertFalse(CommitUtils.isValidCommit(\"\"));\n        assertTrue(CommitUtils.isValidCommit(\"a\"));\n        assertTrue(CommitUtils.isValidCommit(\"bbbbb\"));\n        assertFalse(CommitUtils.isValidCommit(\"am\"));\n        assertFalse(CommitUtils.isValidCommit(\"xyz\"));\n    }\n\n    /**\n     * Test parsing author from commit\n     */\n    @Test\n    public void testGetAuthor() {\n        Commit commit = Commit.builder().build();\n        assertNull(CommitUtils.getAuthor(commit));\n\n        GitCommit rawCommit = GitCommit.builder().build();\n        commit = commit.toBuilder()\n                .commit(rawCommit)\n                .build();\n        assertNull(CommitUtils.getAuthor(commit));\n\n        GitUser user = GitUser.builder().build();\n        rawCommit = rawCommit.toBuilder()\n                .author(user)\n                .build();\n        commit = commit.toBuilder()\n                .commit(rawCommit)\n                .build();\n        assertNull(CommitUtils.getAuthor(commit));\n\n        user = user.toBuilder().name(\"u1\").build();\n        rawCommit = rawCommit.toBuilder()\n                .author(user)\n                .build();\n        commit = commit.toBuilder()\n                .commit(rawCommit)\n                .build();\n        assertEquals(\"u1\", CommitUtils.getAuthor(commit));\n    }\n\n    /**\n     * Test parsing committer from commit\n     */\n    @Test\n    public void testGetCommitter() {\n        Commit commit = Commit.builder().build();\n        assertNull(CommitUtils.getCommitter(commit));\n\n        GitCommit rawCommit = GitCommit.builder().build();\n        commit = commit.toBuilder()\n                .commit(rawCommit)\n                .build();\n        assertNull(CommitUtils.getCommitter(commit));\n\n        GitUser user = GitUser.builder().build();\n        rawCommit = rawCommit.toBuilder()\n                .committer(user)\n                .build();\n        commit = commit.toBuilder()\n                .commit(rawCommit)\n                .build();\n        assertNull(CommitUtils.getCommitter(commit));\n\n        user = user.toBuilder().name(\"u1\").build();\n        rawCommit = rawCommit.toBuilder()\n                .committer(user)\n                .build();\n        commit = commit.toBuilder()\n                .commit(rawCommit)\n                .build();\n        assertEquals(\"u1\", CommitUtils.getCommitter(commit));\n\n        user = user.toBuilder().name(\"u2\").build();\n        rawCommit = rawCommit.toBuilder()\n                .committer(user)\n                .build();\n        commit = commit.toBuilder()\n                .commit(rawCommit)\n                .build();\n        assertEquals(\"u2\", CommitUtils.getCommitter(commit));\n    }\n\n    /**\n     * Test parsing author date from commit\n     */\n    @Test\n    public void testGetAuthorDate() {\n        Commit commit = Commit.builder().build();\n        assertNull(CommitUtils.getAuthorDate(commit));\n\n        GitCommit rawCommit = GitCommit.builder().build();\n        commit = commit.toBuilder()\n                .commit(rawCommit)\n                .build();\n        assertNull(CommitUtils.getAuthorDate(commit));\n\n        GitUser user = GitUser.builder().build();\n        rawCommit = rawCommit.toBuilder()\n                .author(user)\n                .build();\n        commit = commit.toBuilder()\n                .commit(rawCommit)\n                .build();\n        assertNull(CommitUtils.getAuthorDate(commit));\n\n        user = user.toBuilder()\n                .date(new Date(12000))\n                .build();\n        rawCommit = rawCommit.toBuilder()\n                .author(user)\n                .build();\n        commit = commit.toBuilder()\n                .commit(rawCommit)\n                .build();\n        assertEquals(new Date(12000), CommitUtils.getAuthorDate(commit));\n    }\n\n    /**\n     * Test parsing committer date from commit\n     */\n    @Test\n    public void testGetCommitterDate() {\n        Commit commit = Commit.builder().build();\n        assertNull(CommitUtils.getCommitterDate(commit));\n\n        GitCommit rawCommit = GitCommit.builder().build();\n        commit = commit.toBuilder()\n                .commit(rawCommit)\n                .build();\n        assertNull(CommitUtils.getCommitterDate(commit));\n\n        GitUser user = GitUser.builder().build();\n        rawCommit = rawCommit.toBuilder()\n                .committer(user)\n                .build();\n        commit = commit.toBuilder()\n                .commit(rawCommit)\n                .build();\n        assertNull(CommitUtils.getCommitterDate(commit));\n\n        user = user.toBuilder()\n                .date(new Date(12000))\n                .build();\n        rawCommit = rawCommit.toBuilder()\n                .committer(user)\n                .build();\n        commit = commit.toBuilder()\n                .commit(rawCommit)\n                .build();\n        assertEquals(new Date(12000), CommitUtils.getCommitterDate(commit));\n    }\n}\n"
  },
  {
    "path": "app/src/androidTest/java/com/github/pockethub/android/tests/commit/CreateCommentActivityTest.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.tests.commit;\n\nimport androidx.test.espresso.ViewInteraction;\nimport androidx.test.espresso.action.ViewActions;\nimport androidx.test.espresso.assertion.ViewAssertions;\nimport androidx.test.rule.ActivityTestRule;\nimport com.github.pockethub.android.R;\nimport com.github.pockethub.android.ui.commit.CreateCommentActivity;\nimport com.meisolsson.githubsdk.model.Repository;\nimport com.meisolsson.githubsdk.model.User;\nimport org.junit.Before;\nimport org.junit.Rule;\nimport org.junit.Test;\n\nimport static androidx.test.espresso.Espresso.closeSoftKeyboard;\nimport static androidx.test.espresso.Espresso.onView;\nimport static androidx.test.espresso.matcher.ViewMatchers.isEnabled;\nimport static androidx.test.espresso.matcher.ViewMatchers.withId;\nimport static org.hamcrest.CoreMatchers.not;\n\n/**\n * Tests of {@link CreateCommentActivity}\n */\npublic class CreateCommentActivityTest {\n\n    @Rule\n    public ActivityTestRule<CreateCommentActivity> activityTestRule =\n            new ActivityTestRule<>(CreateCommentActivity.class, false, false);\n\n    @Before\n    public void setUp() {\n        User user = User.builder()\n                .login(\"owner\")\n                .build();\n\n        Repository repo = Repository.builder()\n                .name(\"name\")\n                .owner(user)\n                .build();\n\n        activityTestRule.launchActivity(CreateCommentActivity.createIntent(repo, \"abcdef\"));\n    }\n\n    /**\n     * Verify empty comment can't be created\n     */\n    @Test\n    public void testEmptyCommentIsProhibited() {\n        ViewInteraction createMenu = onView(withId(R.id.m_apply));\n        ViewInteraction comment = onView(withId(R.id.et_comment));\n\n        createMenu.check(ViewAssertions.matches(not(isEnabled())));\n\n        closeSoftKeyboard();\n        comment.perform(ViewActions.typeText(\"a\"));\n\n        createMenu.check(ViewAssertions.matches(isEnabled()));\n        comment.perform(ViewActions.replaceText(\"\"));\n\n        createMenu.check(ViewAssertions.matches(not(isEnabled())));\n    }\n}\n"
  },
  {
    "path": "app/src/androidTest/java/com/github/pockethub/android/tests/commit/DiffStylerTest.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.tests.commit;\n\nimport androidx.test.filters.SmallTest;\nimport com.github.pockethub.android.ui.commit.DiffStyler;\nimport com.meisolsson.githubsdk.model.GitHubFile;\nimport org.junit.Test;\n\nimport java.io.BufferedReader;\nimport java.io.IOException;\nimport java.io.StringReader;\nimport java.util.Collections;\nimport java.util.List;\n\nimport static androidx.test.InstrumentationRegistry.getTargetContext;\nimport static junit.framework.Assert.assertNotNull;\nimport static junit.framework.TestCase.assertTrue;\nimport static org.junit.Assert.assertEquals;\n\n/**\n * Tests of {@link DiffStyler}\n */\n@SmallTest\npublic class DiffStylerTest {\n\n    private void compareStyled(String patch) throws IOException {\n        assertNotNull(patch);\n        String fileName = \"file.txt\";\n        DiffStyler styler = new DiffStyler(getTargetContext().getResources());\n        GitHubFile file = GitHubFile.builder()\n                .filename(fileName)\n                .patch(patch)\n                .build();\n\n        styler.setFiles(Collections.singletonList(file));\n        List<CharSequence> styled = styler.get(fileName);\n        assertNotNull(styled);\n        BufferedReader reader = new BufferedReader(new StringReader(patch));\n        String line = reader.readLine();\n        int processed = 0;\n        while (line != null) {\n            assertEquals(line, styled.get(processed).toString());\n            line = reader.readLine();\n            processed++;\n        }\n        assertEquals(processed, styled.size());\n    }\n\n    /**\n     * Test styler with empty files\n     */\n    @Test\n    public void testEmptyFiles() {\n        DiffStyler styler = new DiffStyler(getTargetContext().getResources());\n        styler.setFiles(null);\n        assertTrue(styler.get(\"navigation_drawer_header_background\").isEmpty());\n        styler.setFiles(Collections.emptyList());\n        assertTrue(styler.get(\"navigation_drawer_header_background\").isEmpty());\n    }\n\n    /**\n     * Test styler with empty patch\n     */\n    @Test\n    public void testEmptyPatch() {\n        DiffStyler styler = new DiffStyler(getTargetContext().getResources());\n        GitHubFile file = GitHubFile.builder()\n                .filename(\"file.txt\")\n                .build();\n        styler.setFiles(Collections.singletonList(file));\n        assertTrue(styler.get(\"file.txt\").isEmpty());\n\n        file = file.toBuilder().filename(\"\").build();\n        styler.setFiles(Collections.singletonList(file));\n        assertTrue(styler.get(\"file.txt\").isEmpty());\n    }\n\n    /**\n     * Test styler for file with only single newline\n     *\n     * @throws IOException\n     */\n    @Test\n    public void testOnlyNewline() throws IOException {\n        compareStyled(\"\\n\");\n    }\n\n    /**\n     * Test styler for file with an empty patch line with other valid lines\n     *\n     * @throws IOException\n     */\n    @Test\n    public void testEmptyPatchLineWithOtherValidLines() throws IOException {\n        compareStyled(\"@@ 0,1 0,1 @@\\n\\n-navigation_drawer_header_background\\n\");\n    }\n\n    /**\n     * Test styler for file with trailing empty line\n     *\n     * @throws IOException\n     */\n    @Test\n    public void testTrailingEmptyLine() throws IOException {\n        compareStyled(\"@@ 0,1 0,1 @@\\n-navigation_drawer_header_background\\n\\n\");\n    }\n\n    /**\n     * Test styler for file with only newlines\n     *\n     * @throws IOException\n     */\n    @Test\n    public void testOnlyNewlines() throws IOException {\n        compareStyled(\"\\n\\n\\n\");\n    }\n\n    /**\n     * Test styler for patch with no trailing newline after the second line\n     *\n     * @throws IOException\n     */\n    @Test\n    public void testNoTrailingNewlineAfterSecondLine() throws IOException {\n        compareStyled(\"@@ 1,2 1,2 @@\\n+navigation_drawer_header_background\");\n    }\n\n    /**\n     * Test styler for patch with no trailing newline\n     *\n     * @throws IOException\n     */\n    @Test\n    public void testNoTrailingNewline() throws IOException {\n        compareStyled(\"@@ 1,2 1,2 @@\");\n    }\n\n    /**\n     * Test styler for file with valid patch\n     *\n     * @throws IOException\n     */\n    @Test\n    public void testFormattedPatch() throws IOException {\n        compareStyled(\"@@ 1,2 1,2 @@\\n+navigation_drawer_header_background\\n\");\n    }\n}\n"
  },
  {
    "path": "app/src/androidTest/java/com/github/pockethub/android/tests/commit/FullCommitTest.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.tests.commit;\n\nimport androidx.test.filters.SmallTest;\nimport com.github.pockethub.android.core.commit.FullCommit;\nimport com.meisolsson.githubsdk.model.Commit;\nimport com.meisolsson.githubsdk.model.GitHubFile;\nimport com.meisolsson.githubsdk.model.git.GitComment;\nimport org.junit.Test;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collections;\n\nimport static junit.framework.Assert.assertFalse;\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertTrue;\n\n/**\n * Tests of {@link FullCommit}\n */\n@SmallTest\npublic class FullCommitTest {\n\n    /**\n     * Test commit with one file and one line comment\n     */\n    @Test\n    public void testSingleLineCommentSingleFile() {\n        GitHubFile file = GitHubFile.builder()\n                .filename(\"a.txt\")\n                .build();\n\n        GitComment comment = GitComment.builder()\n                .path(file.filename())\n                .position(10)\n                .build();\n\n        Commit commit = Commit.builder()\n                .files(Collections.singletonList(file))\n                .build();\n\n        FullCommit full = new FullCommit(commit, new ArrayList<>(\n                Collections.singletonList(comment)));\n\n        assertTrue(full.isEmpty());\n        assertEquals(1, full.getFiles().size());\n        assertEquals(comment, full.getFiles().get(0).get(10).get(0));\n    }\n\n    /**\n     * Test commit with one file and one commit comment\n     */\n    @Test\n    public void testSingleCommentSingleFile() {\n        GitHubFile file = GitHubFile.builder()\n                .filename(\"a.txt\")\n                .build();\n\n        GitComment comment = GitComment.builder().build();\n\n        Commit commit = Commit.builder()\n                .files(Collections.singletonList(file))\n                .build();\n\n        FullCommit full = new FullCommit(commit, Collections.singletonList(comment));\n        assertFalse(full.isEmpty());\n        assertEquals(comment, full.get(0));\n        assertEquals(1, full.getFiles().size());\n    }\n\n    /**\n     * Test commit with no files and one commit comment\n     */\n    @Test\n    public void testSingleCommentNoFiles() {\n        GitComment comment = GitComment.builder().build();\n\n        Commit commit = Commit.builder().build();\n\n        FullCommit full = new FullCommit(commit, Collections.singletonList(comment));\n        assertFalse(full.isEmpty());\n        assertEquals(comment, full.get(0));\n        assertTrue(full.getFiles().isEmpty());\n    }\n\n    /**\n     * Test commit with no comments and one file\n     */\n    @Test\n    public void testNoCommentsSingleFile() {\n        GitHubFile file = GitHubFile.builder()\n                .filename(\"a.txt\")\n                .build();\n\n        Commit commit = Commit.builder()\n                .files(Collections.singletonList(file))\n                .build();\n\n        FullCommit full = new FullCommit(commit);\n        assertTrue(full.isEmpty());\n        assertEquals(1, full.getFiles().size());\n    }\n\n    /**\n     * Test commit with line and global comments\n     */\n    @Test\n    public void testBothTypesOfComments() {\n        GitHubFile file = GitHubFile.builder()\n                .filename(\"a.txt\")\n                .build();\n\n        GitComment comment1 = GitComment.builder()\n                .path(file.filename())\n                .position(10)\n                .build();\n\n        GitComment comment2 = GitComment.builder().build();\n\n        Commit commit = Commit.builder()\n                .files(Collections.singletonList(file))\n                .build();\n\n        FullCommit full = new FullCommit(commit, new ArrayList<>(Arrays.asList(comment1, comment2)));\n        assertEquals(1, full.size());\n        assertEquals(comment2, full.get(0));\n        assertEquals(1, full.getFiles().size());\n        assertEquals(comment1, full.getFiles().get(0).get(10).get(0));\n    }\n}\n"
  },
  {
    "path": "app/src/androidTest/java/com/github/pockethub/android/tests/gist/CreateCommentActivityTest.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.tests.gist;\n\nimport androidx.test.espresso.ViewInteraction;\nimport androidx.test.espresso.action.ViewActions;\nimport androidx.test.espresso.assertion.ViewAssertions;\nimport androidx.test.rule.ActivityTestRule;\nimport com.github.pockethub.android.R;\nimport com.github.pockethub.android.ui.gist.CreateCommentActivity;\nimport com.meisolsson.githubsdk.model.Gist;\nimport com.meisolsson.githubsdk.model.User;\nimport org.junit.Before;\nimport org.junit.Rule;\nimport org.junit.Test;\n\nimport static androidx.test.espresso.Espresso.closeSoftKeyboard;\nimport static androidx.test.espresso.Espresso.onView;\nimport static androidx.test.espresso.matcher.ViewMatchers.isEnabled;\nimport static androidx.test.espresso.matcher.ViewMatchers.withId;\nimport static org.hamcrest.CoreMatchers.not;\n\n/**\n * Tests of {@link CreateCommentActivity}\n */\npublic class CreateCommentActivityTest  {\n\n    @Rule\n    public ActivityTestRule<CreateCommentActivity> activityTestRule =\n            new ActivityTestRule<>(CreateCommentActivity.class, false, false);\n\n    @Before\n    public void setUp() {\n        User user = User.builder()\n                .login(\"abc\")\n                .build();\n\n        Gist gist = Gist.builder()\n                .owner(user)\n                .id(\"123\")\n                .build();\n\n        activityTestRule.launchActivity(CreateCommentActivity.createIntent(gist));\n    }\n\n    /**\n     * Verify empty comment can't be created\n     *\n     * @throws Throwable\n     */\n    @Test\n    public void testEmptyCommentIsProhibited() {\n        ViewInteraction createMenu = onView(withId(R.id.m_apply));\n        ViewInteraction comment = onView(withId(R.id.et_comment));\n\n        createMenu.check(ViewAssertions.matches(not(isEnabled())));\n\n        closeSoftKeyboard();\n        comment.perform(ViewActions.typeText(\"a\"));\n        createMenu.check(ViewAssertions.matches(isEnabled()));\n        comment.perform(ViewActions.replaceText(\"\"));\n\n        createMenu.check(ViewAssertions.matches(not(isEnabled())));\n    }\n}\n"
  },
  {
    "path": "app/src/androidTest/java/com/github/pockethub/android/tests/gist/CreateGistActivityTest.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.tests.gist;\n\nimport android.content.Intent;\nimport androidx.test.espresso.ViewInteraction;\nimport androidx.test.espresso.action.ViewActions;\nimport androidx.test.espresso.assertion.ViewAssertions;\nimport androidx.test.rule.ActivityTestRule;\nimport com.github.pockethub.android.R;\nimport com.github.pockethub.android.R.id;\nimport com.github.pockethub.android.ui.gist.CreateGistActivity;\nimport org.junit.Rule;\nimport org.junit.Test;\n\nimport static android.content.Intent.EXTRA_TEXT;\nimport static androidx.test.espresso.Espresso.onView;\nimport static androidx.test.espresso.matcher.ViewMatchers.*;\nimport static org.hamcrest.CoreMatchers.not;\n\n/**\n * Tests of {@link CreateGistActivity}\n */\npublic class CreateGistActivityTest {\n\n    @Rule\n    public ActivityTestRule<CreateGistActivity> activityTestRule =\n            new ActivityTestRule<>(CreateGistActivity.class, false, false);\n\n    /**\n     * Create Gist with initial text\n     */\n    @Test\n    public void testCreateWithInitialText() {\n        activityTestRule.launchActivity(new Intent().putExtra(EXTRA_TEXT, \"gist content\"));\n\n        onView(withId(id.create_gist))\n                .check(ViewAssertions.matches(isEnabled()));\n\n        onView(withId(id.et_gist_content))\n                .check(ViewAssertions.matches(withText(\"gist content\")));\n    }\n\n    /**\n     * Create Gist with no initial text\n     *\n     * @throws Throwable\n     */\n    @Test\n    public void testCreateWithNoInitialText() throws Throwable {\n        activityTestRule.launchActivity(new Intent());\n        ViewInteraction createMenu = onView(withId(R.id.create_gist));\n        ViewInteraction content = onView(withId(R.id.et_gist_content));\n\n        createMenu.check(ViewAssertions.matches(not(isEnabled())));\n\n        content.perform(ViewActions.typeText(\"gist content\"));\n\n        createMenu.check(ViewAssertions.matches(isEnabled()));\n    }\n}\n"
  },
  {
    "path": "app/src/androidTest/java/com/github/pockethub/android/tests/gist/GistFilesViewActivityTest.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.tests.gist;\n\nimport android.content.Context;\nimport androidx.collection.ArrayMap;\nimport androidx.test.rule.ActivityTestRule;\nimport androidx.viewpager.widget.ViewPager;\nimport com.github.pockethub.android.PocketHub;\nimport com.github.pockethub.android.R.id;\nimport com.github.pockethub.android.core.gist.GistStore;\nimport com.github.pockethub.android.ui.gist.GistFilesViewActivity;\nimport com.meisolsson.githubsdk.model.Gist;\nimport com.meisolsson.githubsdk.model.GistFile;\nimport org.junit.Before;\nimport org.junit.Rule;\nimport org.junit.Test;\n\nimport java.util.Map;\n\nimport static androidx.test.InstrumentationRegistry.getInstrumentation;\nimport static org.junit.Assert.assertEquals;\n\n/**\n * Tests of {@link GistFilesViewActivity}\n */\npublic class GistFilesViewActivityTest {\n\n    protected GistStore store;\n\n    private Gist gist;\n\n    @Rule\n    public ActivityTestRule<GistFilesViewActivity> activityTestRule =\n            new ActivityTestRule<>(GistFilesViewActivity.class, false, false);\n\n    @Before\n    public void setUp() {\n        Context context = getInstrumentation().getTargetContext();\n        PocketHub pocketHub = (PocketHub) context.getApplicationContext();\n        store = pocketHub.applicationComponent().gistStore();\n\n        Map<String, GistFile> files = new ArrayMap<>();\n\n        GistFile a = GistFile.builder()\n                .content(\"aa\")\n                .filename(\"a\")\n                .build();\n        GistFile b = GistFile.builder()\n                .content(\"bb\")\n                .filename(\"b\")\n                .build();\n\n        files.put(\"a\", a);\n        files.put(\"b\", b);\n\n        gist = Gist.builder()\n                .id(\"abcd\")\n                .files(files)\n                .build();\n\n        store.addGist(gist);\n        activityTestRule.launchActivity(GistFilesViewActivity.Companion.createIntent(gist, 0));\n    }\n\n    /**\n     * Verify changing pages between gist files\n     *\n     * @throws Throwable\n     */\n    @Test\n    public void testChangingPages() throws Throwable {\n        final ViewPager pager = activityTestRule.getActivity().findViewById(id.vp_pages);\n\n        assertEquals(0, pager.getCurrentItem());\n        activityTestRule.runOnUiThread(() -> pager.setCurrentItem(1, true));\n        assertEquals(1, pager.getCurrentItem());\n        activityTestRule.runOnUiThread(() -> pager.setCurrentItem(0, true));\n        assertEquals(0, pager.getCurrentItem());\n    }\n}\n"
  },
  {
    "path": "app/src/androidTest/java/com/github/pockethub/android/tests/gist/GistStoreTest.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.tests.gist;\n\nimport androidx.test.filters.SmallTest;\nimport com.github.pockethub.android.core.gist.GistStore;\nimport com.meisolsson.githubsdk.model.Gist;\nimport org.junit.Test;\n\nimport static junit.framework.Assert.assertNull;\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertNotEquals;\n\n/**\n * Unit tests of {@link GistStore}\n */\n@SmallTest\npublic class GistStoreTest {\n\n    /**\n     * Verify issue is updated when re-added\n     */\n    @Test\n    public void testReuseIssue() {\n        GistStore store = new GistStore();\n        assertNull(store.getGist(\"abcd\"));\n\n        Gist gist = Gist.builder()\n                .id(\"abcd\")\n                .description(\"description\")\n                .build();\n\n        // The gist is added and the store will return the given gist\n        assertEquals(gist, store.addGist(gist));\n        assertEquals(gist, store.getGist(\"abcd\"));\n\n        Gist gist2 = Gist.builder()\n                .id(\"abcd\")\n                .description(\"description2\")\n                .build();\n\n        // The gist has now been updated and should not return the same gist\n        assertNotEquals(gist, store.addGist(gist2));\n        assertNotEquals(gist.description(), gist2.description());\n        assertNotEquals(gist, store.getGist(\"abcd\"));\n    }\n}\n"
  },
  {
    "path": "app/src/androidTest/java/com/github/pockethub/android/tests/gist/GistUriMatcherTest.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.tests.gist;\n\nimport android.net.Uri;\nimport androidx.test.filters.SmallTest;\nimport com.github.pockethub.android.core.gist.GistUriMatcher;\nimport com.meisolsson.githubsdk.model.Gist;\nimport org.junit.Test;\n\nimport static junit.framework.Assert.assertNotNull;\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertNull;\n\n/**\n * Unit tests of {@link GistUriMatcher}\n */\n@SmallTest\npublic class GistUriMatcherTest {\n\n    /**\n     * Verify empty uri\n     */\n    @Test\n    public void testEmptyUri() {\n        assertNull(GistUriMatcher.getGist(Uri.parse(\"\")));\n    }\n\n    /**\n     * Verify invalid Gist ids in URIs\n     */\n    @Test\n    public void testNonGistId() {\n        assertNull(GistUriMatcher.getGist(Uri\n                .parse(\"https://gist.github.com/TEST\")));\n        assertNull(GistUriMatcher.getGist(Uri\n                .parse(\"https://gist.github.com/abc%20\")));\n        assertNull(GistUriMatcher.getGist(Uri\n                .parse(\"https://gist.github.com/abcdefg\")));\n    }\n\n    /**\n     * Verify public Gist id\n     */\n    @Test\n    public void testPublicGist() {\n        Gist gist = GistUriMatcher.getGist(Uri\n                .parse(\"https://gist.github.com/1234\"));\n        assertNotNull(gist);\n        assertEquals(\"1234\", gist.id());\n    }\n\n    /**\n     * Verify public Gist id\n     */\n    @Test\n    public void testPrivateGist() {\n        Gist gist = GistUriMatcher.getGist(Uri\n                .parse(\"https://gist.github.com/abcd1234abcd1234abcd\"));\n        assertNotNull(gist);\n        assertEquals(\"abcd1234abcd1234abcd\", gist.id());\n    }\n}\n"
  },
  {
    "path": "app/src/androidTest/java/com/github/pockethub/android/tests/issue/CreateCommentActivityTest.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.tests.issue;\n\nimport androidx.test.espresso.ViewInteraction;\nimport androidx.test.espresso.action.ViewActions;\nimport androidx.test.espresso.assertion.ViewAssertions;\nimport androidx.test.rule.ActivityTestRule;\nimport com.github.pockethub.android.R;\nimport com.github.pockethub.android.ui.issue.CreateCommentActivity;\nimport com.github.pockethub.android.util.InfoUtils;\nimport com.meisolsson.githubsdk.model.User;\nimport org.junit.Before;\nimport org.junit.Test;\n\nimport static androidx.test.espresso.Espresso.closeSoftKeyboard;\nimport static androidx.test.espresso.Espresso.onView;\nimport static androidx.test.espresso.matcher.ViewMatchers.isEnabled;\nimport static androidx.test.espresso.matcher.ViewMatchers.withId;\nimport static org.hamcrest.CoreMatchers.not;\n\n/**\n * Tests of {@link CreateCommentActivity}\n */\npublic class CreateCommentActivityTest {\n\n\n    public ActivityTestRule<CreateCommentActivity> activityTestRule =\n            new ActivityTestRule<>(CreateCommentActivity.class);\n\n    @Before\n    public void setUp() {\n        User user = User.builder()\n                .login(\"u\")\n                .build();\n\n        activityTestRule.launchActivity(\n                CreateCommentActivity.createIntent(\n                        InfoUtils.createRepoFromData(\"o\", \"u\"),\n                        1,\n                        user\n                )\n        );\n    }\n\n    /**\n     * Verify empty comment can't be created\n     *\n     * @throws Throwable\n     */\n    @Test\n    public void testEmptyCommentIsProhibited() {\n        ViewInteraction createMenu = onView(withId(R.id.m_apply));\n        ViewInteraction comment = onView(withId(R.id.et_comment));\n\n        createMenu.check(ViewAssertions.matches(not(isEnabled())));\n\n        closeSoftKeyboard();\n        comment.perform(ViewActions.typeText(\"a\"));\n        createMenu.check(ViewAssertions.matches(isEnabled()));\n        comment.perform(ViewActions.replaceText(\"\"));\n\n        createMenu.check(ViewAssertions.matches(not(isEnabled())));\n    }\n}\n"
  },
  {
    "path": "app/src/androidTest/java/com/github/pockethub/android/tests/issue/EditIssueActivityTest.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.tests.issue;\n\nimport android.view.View;\nimport androidx.test.espresso.IdlingRegistry;\nimport androidx.test.espresso.ViewInteraction;\nimport androidx.test.espresso.action.ViewActions;\nimport androidx.test.espresso.assertion.ViewAssertions;\nimport androidx.test.rule.ActivityTestRule;\nimport com.github.pockethub.android.R;\nimport com.github.pockethub.android.tests.ViewVisibilityIdlingResource;\nimport com.github.pockethub.android.ui.issue.EditIssueActivity;\nimport com.github.pockethub.android.util.InfoUtils;\nimport com.meisolsson.githubsdk.model.Repository;\nimport org.junit.Before;\nimport org.junit.Rule;\nimport org.junit.Test;\n\nimport static androidx.test.espresso.Espresso.closeSoftKeyboard;\nimport static androidx.test.espresso.Espresso.onView;\nimport static androidx.test.espresso.matcher.ViewMatchers.isEnabled;\nimport static androidx.test.espresso.matcher.ViewMatchers.withId;\nimport static org.hamcrest.CoreMatchers.not;\n\n/**\n * Tests of {@link EditIssueActivity}\n */\npublic class EditIssueActivityTest {\n\n    @Rule\n    public ActivityTestRule<EditIssueActivity> activityTestRule =\n            new ActivityTestRule<>(EditIssueActivity.class, true, false);\n\n    @Before\n    public void setUp() {\n        Repository repo = InfoUtils.createRepoFromData(\"owner\", \"repo\");\n        activityTestRule.launchActivity(EditIssueActivity.Companion.createIntent(repo));\n    }\n\n    /**\n     * Verify save menu is properly enabled/disable depending on the issue have\n     * a non-empty title\n     *\n     * @throws Throwable\n     */\n    @Test\n    public void testSaveMenuEnabled() {\n        ViewInteraction createMenu = onView(withId(R.id.m_apply));\n        ViewInteraction comment = onView(withId(R.id.et_issue_title));\n        ViewVisibilityIdlingResource idlingResource =\n                new ViewVisibilityIdlingResource(\n                        activityTestRule.getActivity(),\n                        R.id.sv_issue_content,\n                        View.VISIBLE\n                );\n\n        IdlingRegistry.getInstance().register(idlingResource);\n        createMenu.check(ViewAssertions.matches(not(isEnabled())));\n\n        closeSoftKeyboard();\n        comment.perform(ViewActions.typeText(\"a\"));\n        createMenu.check(ViewAssertions.matches(isEnabled()));\n        comment.perform(ViewActions.replaceText(\"\"));\n\n        createMenu.check(ViewAssertions.matches(not(isEnabled())));\n        IdlingRegistry.getInstance().unregister(idlingResource);\n    }\n}\n"
  },
  {
    "path": "app/src/androidTest/java/com/github/pockethub/android/tests/issue/EditIssuesFilterActivityTest.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.tests.issue;\n\nimport androidx.test.rule.ActivityTestRule;\nimport com.github.pockethub.android.core.issue.IssueFilter;\nimport com.github.pockethub.android.ui.issue.EditIssuesFilterActivity;\nimport com.github.pockethub.android.util.InfoUtils;\nimport com.meisolsson.githubsdk.model.Repository;\nimport org.junit.Before;\nimport org.junit.Rule;\n\nimport java.util.UUID;\n\n/**\n * Tests of {@link EditIssuesFilterActivity}\n */\npublic class EditIssuesFilterActivityTest {\n\n    @Rule\n    public ActivityTestRule<EditIssuesFilterActivity> activityTestRule =\n            new ActivityTestRule<>(EditIssuesFilterActivity.class);\n\n    @Before\n    public void setUp() {\n        Repository repo = InfoUtils.createRepoFromData(\"owner\", \"name\");\n        IssueFilter filter = new IssueFilter(repo, UUID.randomUUID().toString());\n        activityTestRule.launchActivity(EditIssuesFilterActivity.Companion.createIntent(filter));\n    }\n}\n"
  },
  {
    "path": "app/src/androidTest/java/com/github/pockethub/android/tests/issue/IssueFilterTest.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.tests.issue;\n\nimport androidx.test.filters.SmallTest;\nimport com.github.pockethub.android.core.issue.IssueFilter;\nimport com.meisolsson.githubsdk.model.Milestone;\nimport com.meisolsson.githubsdk.model.Repository;\nimport com.meisolsson.githubsdk.model.User;\nimport org.junit.Test;\n\nimport java.util.UUID;\n\nimport static junit.framework.Assert.assertFalse;\nimport static junit.framework.TestCase.assertTrue;\nimport static org.junit.Assert.assertEquals;\n\n/**\n * Unit tests of {@link IssueFilter}\n */\n@SmallTest\npublic class IssueFilterTest {\n\n    /**\n     * Verify {@link IssueFilter#equals(Object)}\n     */\n    @Test\n    public void testEqualFilter() {\n        Repository repo = Repository.builder()\n                .id(1L)\n                .build();\n\n        IssueFilter filter1 = new IssueFilter(repo, UUID.randomUUID().toString());\n\n        assertFalse(filter1.equals(null));\n        assertFalse(filter1.equals(\"\"));\n        assertTrue(filter1.equals(filter1));\n\n        IssueFilter filter2 = new IssueFilter(repo, UUID.randomUUID().toString());\n        assertEquals(filter1, filter2);\n        assertEquals(filter1.hashCode(), filter2.hashCode());\n\n        User user = User.builder()\n                .id(2L)\n                .build();\n\n        filter1.setAssignee(user);\n        assertFalse(filter1.equals(filter2));\n        filter2.setAssignee(user);\n        assertEquals(filter1, filter2);\n        assertEquals(filter1.hashCode(), filter2.hashCode());\n\n        filter1.setOpen(false);\n        assertFalse(filter1.equals(filter2));\n        filter2.setOpen(false);\n        assertEquals(filter1, filter2);\n        assertEquals(filter1.hashCode(), filter2.hashCode());\n\n        Milestone milestone = Milestone.builder()\n                .number(3)\n                .build();\n        filter1.setMilestone(milestone);\n        assertFalse(filter1.equals(filter2));\n        filter2.setMilestone(milestone);\n        assertEquals(filter1, filter2);\n        assertEquals(filter1.hashCode(), filter2.hashCode());\n    }\n}\n"
  },
  {
    "path": "app/src/androidTest/java/com/github/pockethub/android/tests/issue/IssueStoreTest.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.tests.issue;\n\nimport androidx.test.filters.SmallTest;\nimport com.github.pockethub.android.core.issue.IssueStore;\nimport com.github.pockethub.android.util.InfoUtils;\nimport com.meisolsson.githubsdk.model.Issue;\nimport com.meisolsson.githubsdk.model.Repository;\nimport org.junit.Test;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertNotEquals;\nimport static org.junit.Assert.assertNull;\n\n/**\n * Unit tests of {@link IssueStore}\n */\n@SmallTest\npublic class IssueStoreTest {\n\n    /**\n     * Verify issue is updated when re-added\n     */\n    @Test\n    public void testReuseIssue() {\n        IssueStore store = new IssueStore();\n        Repository repo = InfoUtils.createRepoFromData(\"owner\", \"name\");\n\n        assertNull(store.getIssue(repo, 1));\n\n        Issue issue = Issue.builder()\n                .repository(repo)\n                .number(1)\n                .body(\"body\")\n                .build();\n        assertEquals(issue, store.addIssue(issue));\n        assertEquals(issue, store.getIssue(repo, 1));\n\n        Issue issue2 = Issue.builder()\n                .repository(repo)\n                .number(1)\n                .body(\"body2\")\n                .build();\n\n        assertNotEquals(issue, store.addIssue(issue2));\n        assertNotEquals(issue2.body(), issue.body());\n        assertNotEquals(issue, store.getIssue(repo, 1));\n    }\n}\n"
  },
  {
    "path": "app/src/androidTest/java/com/github/pockethub/android/tests/issue/IssueUriMatcherTest.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.tests.issue;\n\nimport android.net.Uri;\nimport androidx.test.filters.SmallTest;\nimport com.github.pockethub.android.core.issue.IssueUriMatcher;\nimport com.meisolsson.githubsdk.model.Issue;\nimport org.junit.Test;\n\nimport static junit.framework.Assert.assertNotNull;\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertNull;\n\n/**\n * Unit tests of {@link IssueUriMatcher}\n */\n@SmallTest\npublic class IssueUriMatcherTest {\n\n    /**\n     * Verify empty uri\n     */\n    @Test\n    public void testEmptyUri() {\n        assertNull(IssueUriMatcher.getIssue(Uri.parse(\"\")));\n    }\n\n    /**\n     * Verify non-numeric issue number in uri\n     */\n    @Test\n    public void testNonNumericIssueNumber() {\n        assertNull(IssueUriMatcher.getIssue(Uri\n                .parse(\"https://github.com/defunkt/resque/issues/fourty\")));\n    }\n\n    /**\n     * Verify http uri\n     */\n    @Test\n    public void testHttpUri() {\n        Issue issue = IssueUriMatcher.getIssue(Uri\n                .parse(\"https://github.com/defunkt/resque/issues/3\"));\n        assertNotNull(issue);\n        assertEquals(3, issue.number().intValue());\n        assertNotNull(issue.repository());\n        assertEquals(\"resque\", issue.repository().name());\n        assertNotNull(issue.repository().owner());\n        assertEquals(\"defunkt\", issue.repository().owner().login());\n    }\n\n    /**\n     * Verify pull uri\n     */\n    @Test\n    public void testPullUri() {\n        Issue issue = IssueUriMatcher.getIssue(Uri\n                .parse(\"https://github.com/defunkt/resque/pull/3\"));\n        assertNotNull(issue);\n        assertEquals(3, issue.number().intValue());\n        assertNotNull(issue.repository());\n        assertEquals(\"resque\", issue.repository().name());\n        assertNotNull(issue.repository().owner());\n        assertEquals(\"defunkt\", issue.repository().owner().login());\n    }\n\n    /**\n     * Verify https uri\n     */\n    @Test\n    public void testHttpsUri() {\n        Issue issue = IssueUriMatcher.getIssue(Uri\n                .parse(\"http://github.com/defunkt/resque/issues/15\"));\n        assertNotNull(issue);\n        assertEquals(15, issue.number().intValue());\n        assertNotNull(issue.repository());\n        assertEquals(\"resque\", issue.repository().name());\n        assertNotNull(issue.repository().owner());\n        assertEquals(\"defunkt\", issue.repository().owner().login());\n    }\n\n    /**\n     * Verify uri with comment fragment\n     */\n    @Test\n    public void testCommentUri() {\n        Issue issue = IssueUriMatcher\n                .getIssue(Uri\n                        .parse(\"https://github.com/defunkt/resque/issues/300#issuecomment-123456\"));\n        assertNotNull(issue);\n        assertEquals(300, issue.number().intValue());\n        assertNotNull(issue.repository());\n        assertEquals(\"resque\", issue.repository().name());\n        assertNotNull(issue.repository().owner());\n        assertEquals(\"defunkt\", issue.repository().owner().login());\n    }\n}\n"
  },
  {
    "path": "app/src/androidTest/java/com/github/pockethub/android/tests/ref/RefUtilsTest.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.tests.ref;\n\nimport androidx.test.filters.SmallTest;\nimport com.github.pockethub.android.core.ref.RefUtils;\nimport com.meisolsson.githubsdk.model.git.GitReference;\nimport org.junit.Test;\n\nimport static junit.framework.Assert.assertFalse;\nimport static junit.framework.TestCase.assertTrue;\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertNull;\n\n\n/**\n * Tests of {@link RefUtils}\n */\n@SmallTest\npublic class RefUtilsTest {\n\n    /**\n     * Verify {@link RefUtils#isBranch(GitReference)}\n     */\n    @Test\n    public void testIsBranch() {\n        assertFalse(RefUtils.isBranch(null));\n        assertFalse(RefUtils.isBranch(GitReference.builder().build()));\n        assertFalse(RefUtils.isBranch(createGitReference(\"\")));\n        assertFalse(RefUtils.isBranch(createGitReference(\"navigation_drawer_header_background\")));\n        assertFalse(RefUtils.isBranch(createGitReference(\"refs/tags/v1\")));\n        assertFalse(RefUtils.isBranch(createGitReference(\"refs/b1\")));\n        assertTrue(RefUtils.isBranch(createGitReference(\"refs/heads/b2\")));\n    }\n\n    /**\n     * Verify {@link RefUtils#isTag(GitReference)}\n     */\n    @Test\n    public void testIsTag() {\n        assertFalse(RefUtils.isTag((GitReference) null));\n        assertFalse(RefUtils.isTag(GitReference.builder().build()));\n        assertFalse(RefUtils.isTag(createGitReference(\"\")));\n        assertFalse(RefUtils.isTag(createGitReference(\"navigation_drawer_header_background\")));\n        assertFalse(RefUtils.isTag(createGitReference(\"refs/b1\")));\n        assertFalse(RefUtils.isTag(createGitReference(\"refs/heads/b2\")));\n        assertTrue(RefUtils.isTag(createGitReference(\"refs/tags/v1\")));\n    }\n\n    /**\n     * Verify {@link RefUtils#isValid(GitReference)}\n     */\n    @Test\n    public void testIsValid() {\n        assertFalse(RefUtils.isValid(null));\n        assertFalse(RefUtils.isValid(GitReference.builder().build()));\n        assertFalse(RefUtils.isValid(createGitReference(\"\")));\n        assertFalse(RefUtils.isValid(createGitReference(\"refs/pull/6/merge\")));\n        assertFalse(RefUtils.isValid(createGitReference(\"refs/pull/6/head\")));\n        assertTrue(RefUtils.isValid(createGitReference(\"refs/pull\")));\n        assertTrue(RefUtils.isValid(createGitReference(\"refs/heads/b1\")));\n        assertTrue(RefUtils.isValid(createGitReference(\"refs/tags/v1\")));\n    }\n\n    /**\n     * Verify {@link RefUtils#getName(GitReference)}\n     */\n    @Test\n    public void testGetName() {\n        assertNull(RefUtils.getName((GitReference) null));\n        assertNull(RefUtils.getName(GitReference.builder().build()));\n        assertEquals(\"\", RefUtils.getName(createGitReference(\"\")));\n        assertEquals(\"unchanged\",\n            RefUtils.getName(createGitReference(\"unchanged\")));\n        assertEquals(\"branch\",\n            RefUtils.getName(createGitReference(\"refs/heads/branch\")));\n        assertEquals(\"tag\",\n            RefUtils.getName(createGitReference(\"refs/tags/tag\")));\n        assertEquals(\"notes\",\n            RefUtils.getName(createGitReference(\"refs/notes\")));\n\n    }\n\n    /**\n     * Verify {@link RefUtils#getPath(GitReference)}\n     */\n    @Test\n    public void testGetPath() {\n        assertNull(RefUtils.getPath(null));\n        assertNull(RefUtils.getPath(GitReference.builder().build()));\n        assertEquals(\"\", RefUtils.getPath(createGitReference(\"\")));\n        assertEquals(\"unchanged\",\n            RefUtils.getPath(createGitReference(\"unchanged\")));\n        assertEquals(\"heads/branch\",\n            RefUtils.getPath(createGitReference(\"refs/heads/branch\")));\n        assertEquals(\"tags/tag\",\n            RefUtils.getPath(createGitReference(\"refs/tags/tag\")));\n        assertEquals(\"notes\",\n            RefUtils.getPath(createGitReference(\"refs/notes\")));\n\n    }\n\n    private GitReference createGitReference(String ref){\n        return GitReference.builder()\n                .ref(ref)\n                .build();\n    }\n}\n"
  },
  {
    "path": "app/src/androidTest/java/com/github/pockethub/android/tests/repo/RecentRepositoriesTest.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.tests.repo;\n\nimport androidx.test.filters.SmallTest;\nimport com.github.pockethub.android.ui.repo.RecentRepositories;\nimport com.meisolsson.githubsdk.model.User;\nimport org.junit.Test;\n\nimport static androidx.test.InstrumentationRegistry.getTargetContext;\nimport static com.github.pockethub.android.ui.repo.RecentRepositories.MAX_SIZE;\nimport static junit.framework.Assert.assertFalse;\nimport static junit.framework.TestCase.assertTrue;\n\n/**\n * Unit tests of {@link RecentRepositories}\n */\n@SmallTest\npublic class RecentRepositoriesTest {\n\n    /**\n     * Verify bad input\n     */\n    @Test\n    public void testBadInput() {\n        User org = User.builder()\n                .id(20L)\n                .build();\n\n        RecentRepositories recent = new RecentRepositories(getTargetContext(), org);\n        assertFalse(recent.contains(null));\n        assertFalse(recent.contains(-1));\n    }\n\n    /**\n     * Verify eviction\n     */\n    @Test\n    public void testMaxReached() {\n        User org = User.builder()\n                .id(20L)\n                .build();\n\n        RecentRepositories recent = new RecentRepositories(getTargetContext(), org);\n\n        for (int i = 0; i < MAX_SIZE; i++) {\n            recent.add(i);\n            assertTrue(recent.contains(i));\n        }\n\n        recent.add(MAX_SIZE + 1);\n        assertTrue(recent.contains(MAX_SIZE + 1));\n        assertFalse(recent.contains(0));\n\n        for (int i = 1; i < MAX_SIZE; i++) {\n            assertTrue(recent.contains(i));\n        }\n    }\n\n    /**\n     * Verify input/output to disk of {@link RecentRepositories} state\n     */\n    @Test\n    public void testIO() {\n        User org = User.builder()\n                .id(20L)\n                .build();\n\n        RecentRepositories recent1 = new RecentRepositories(getTargetContext(), org);\n        long id = 1234;\n        recent1.add(id);\n        assertTrue(recent1.contains(id));\n        recent1.save();\n        RecentRepositories recent2 = new RecentRepositories(getTargetContext(), org);\n        assertTrue(recent2.contains(id));\n    }\n\n    /**\n     * Verify repositories are scoped to organization\n     */\n    @Test\n    public void testScopedStorage() {\n        User org1 = User.builder()\n                .id(20L)\n                .build();\n\n        RecentRepositories recent1 = new RecentRepositories(getTargetContext(), org1);\n        long id1 = 1234;\n        recent1.add(id1);\n        assertTrue(recent1.contains(id1));\n\n        User org2 = User.builder()\n                .id(40L)\n                .build();\n\n        RecentRepositories recent2 = new RecentRepositories(getTargetContext(), org2);\n        assertFalse(recent2.contains(id1));\n        long id2 = 2345;\n        recent2.add(id2);\n        assertTrue(recent2.contains(id2));\n\n        recent2.save();\n        recent1 = new RecentRepositories(getTargetContext(), org1);\n        assertFalse(recent1.contains(id2));\n    }\n}\n"
  },
  {
    "path": "app/src/androidTest/java/com/github/pockethub/android/tests/repo/RepositoryEventMatcherTest.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.tests.repo;\n\nimport androidx.test.filters.SmallTest;\nimport com.github.pockethub.android.core.repo.RepositoryEventMatcher;\nimport com.meisolsson.githubsdk.model.GitHubEvent;\nimport com.meisolsson.githubsdk.model.GitHubEventType;\nimport com.meisolsson.githubsdk.model.Repository;\nimport com.meisolsson.githubsdk.model.User;\nimport com.meisolsson.githubsdk.model.payload.ForkPayload;\nimport org.junit.Test;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertNull;\n\n/**\n * Unit tests of {@link RepositoryEventMatcher}\n */\n@SmallTest\npublic class RepositoryEventMatcherTest {\n\n    /**\n     * Test fork event that has an incomplete forkee in the payload\n     */\n    @Test\n    public void testIncompleteRepositoryFork() {\n        RepositoryEventMatcher matcher = new RepositoryEventMatcher();\n        ForkPayload payload = ForkPayload.builder().build();\n\n        GitHubEvent event = GitHubEvent.builder()\n                .type(GitHubEventType.ForkEvent)\n                .payload(payload)\n                .build();\n\n        assertNull(matcher.getRepository(event));\n\n        Repository repository = Repository.builder().build();\n        payload = payload.toBuilder().forkee(repository).build();\n        event = event.toBuilder().payload(payload).build();\n        assertNull(matcher.getRepository(event));\n\n        repository = repository.toBuilder().name(\"repo\").build();\n        payload = payload.toBuilder().forkee(repository).build();\n        event = event.toBuilder().payload(payload).build();\n        assertNull(matcher.getRepository(event));\n\n        User user = User.builder().build();\n        repository = repository.toBuilder().owner(user).build();\n        payload = payload.toBuilder().forkee(repository).build();\n        event = event.toBuilder().payload(payload).build();\n        assertNull(matcher.getRepository(event));\n\n        user = user.toBuilder().login(\"owner\").build();\n        repository = repository.toBuilder().owner(user).build();\n        payload = payload.toBuilder().forkee(repository).build();\n        event = event.toBuilder().payload(payload).build();\n        assertEquals(repository, matcher.getRepository(event));\n    }\n\n}\n"
  },
  {
    "path": "app/src/androidTest/java/com/github/pockethub/android/tests/repo/RepositoryUriMatcherTest.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.tests.repo;\n\nimport android.net.Uri;\nimport com.github.pockethub.android.core.repo.RepositoryUriMatcher;\nimport com.meisolsson.githubsdk.model.Repository;\nimport org.junit.Test;\n\nimport static junit.framework.Assert.assertNotNull;\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertNull;\n\n/**\n * Unit tests of {@link RepositoryUriMatcher}\n */\npublic class RepositoryUriMatcherTest {\n\n    /**\n     * Verity empty uri\n     */\n    @Test\n    public void testEmptyUri() {\n        assertNull(RepositoryUriMatcher.getRepository(Uri.parse(\"\")));\n    }\n\n    /**\n     * Verify URI with no owner\n     */\n    @Test\n    public void testUriWithNoOnwer() {\n        assertNull(RepositoryUriMatcher.getRepository(Uri\n                .parse(\"http://github.com\")));\n        assertNull(RepositoryUriMatcher.getRepository(Uri\n                .parse(\"http://github.com/\")));\n        assertNull(RepositoryUriMatcher.getRepository(Uri\n                .parse(\"http://github.com//\")));\n    }\n\n    /**\n     * Verify URI with owner but no name\n     */\n    @Test\n    public void testUriWithNoName() {\n        assertNull(RepositoryUriMatcher.getRepository(Uri\n                .parse(\"http://github.com/defunkt\")));\n        assertNull(RepositoryUriMatcher.getRepository(Uri\n                .parse(\"http://github.com/defunkt/\")));\n    }\n\n    /**\n     * Verify URI with owner but no name\n     */\n    @Test\n    public void testHttpUriWithOwnerAndName() {\n        Repository repo = RepositoryUriMatcher.getRepository(Uri\n                .parse(\"http://github.com/defunkt/resque\"));\n        assertNotNull(repo);\n        assertEquals(\"resque\", repo.name());\n        assertNotNull(repo.owner());\n        assertEquals(\"defunkt\", repo.owner().login());\n    }\n\n    /**\n     * Verify URI with owner but no name\n     */\n    @Test\n    public void testHttpsUriWithOwnerAndName() {\n        Repository repo = RepositoryUriMatcher.getRepository(Uri\n                .parse(\"https://github.com/mojombo/jekyll\"));\n        assertNotNull(repo);\n        assertEquals(\"jekyll\", repo.name());\n        assertNotNull(repo.owner());\n        assertEquals(\"mojombo\", repo.owner().login());\n    }\n\n    /**\n     * Verify URI with white-listed owner\n     */\n    @Test\n    public void testInvalidOwner() {\n        assertNull(RepositoryUriMatcher.getRepository(Uri\n                .parse(\"http://github.com/blog/page1\")));\n    }\n}\n"
  },
  {
    "path": "app/src/androidTest/java/com/github/pockethub/android/tests/repo/SearchActivityTest.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.tests.repo;\n\nimport android.content.Intent;\nimport androidx.test.rule.ActivityTestRule;\nimport com.github.pockethub.android.ui.search.SearchActivity;\nimport org.junit.Before;\nimport org.junit.Rule;\n\nimport static android.app.SearchManager.QUERY;\nimport static android.content.Intent.ACTION_SEARCH;\n\n/**\n * Tests of {@link SearchActivity}\n */\npublic class SearchActivityTest {\n\n    @Rule\n    public ActivityTestRule<SearchActivity> activityTestRule =\n            new ActivityTestRule<>(SearchActivity.class);\n\n    @Before\n    public void setUp() {\n        Intent intent = new Intent(ACTION_SEARCH)\n                .putExtra(QUERY, \"navigation_drawer_header_background\");\n\n        activityTestRule.launchActivity(intent);\n    }\n}\n"
  },
  {
    "path": "app/src/androidTest/java/com/github/pockethub/android/tests/user/UserComparatorTest.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.tests.user;\n\nimport android.accounts.Account;\nimport androidx.test.filters.SmallTest;\nimport com.github.pockethub.android.core.user.UserComparator;\nimport com.meisolsson.githubsdk.model.User;\nimport org.junit.Test;\n\nimport static junit.framework.TestCase.assertTrue;\nimport static org.junit.Assert.assertEquals;\n\n/**\n * Unit tests of {@link UserComparator}\n */\n@SmallTest\npublic class UserComparatorTest {\n\n    /**\n     * Test sorting of users that match login\n     */\n    @Test\n    public void testLoginMatch() {\n        Account account = new Account(\"m\", \"t\");\n        UserComparator comparator = new UserComparator(account);\n\n        assertTrue(comparator.compare(createUser(\"m\"),\n                createUser(\"a\")) < 0);\n        assertTrue(comparator.compare(createUser(\"a\"),\n                createUser(\"m\")) > 0);\n        assertTrue(comparator.compare(createUser(\"m\"),\n                createUser(\"z\")) < 0);\n        assertTrue(comparator.compare(createUser(\"z\"),\n                createUser(\"m\")) > 0);\n        assertEquals(\n                0,\n                comparator.compare(createUser(\"m\"),\n                        createUser(\"m\")));\n    }\n\n    /**\n     * Test sorting of users that don't match login\n     */\n    @Test\n    public void testNoLoginMatch() {\n        Account account = new Account(\"m\", \"t\");\n        UserComparator comparator = new UserComparator(account);\n\n        assertTrue(comparator.compare(createUser(\"a\"),\n                createUser(\"c\")) < 0);\n        assertTrue(comparator.compare(createUser(\"db\"),\n                createUser(\"da\")) > 0);\n    }\n\n    private User createUser(String login){\n        return User.builder()\n                .login(login)\n                .build();\n    }\n}\n"
  },
  {
    "path": "app/src/androidTest/java/com/github/pockethub/android/tests/user/UserUriMatcherTest.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.tests.user;\n\nimport android.net.Uri;\nimport com.github.pockethub.android.core.user.UserUriMatcher;\nimport com.meisolsson.githubsdk.model.User;\nimport org.junit.Test;\n\nimport static junit.framework.Assert.assertNotNull;\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertNull;\n\n/**\n * Unit tests of {@link UserUriMatcher}\n */\npublic class UserUriMatcherTest {\n\n    /**\n     * Verify empty URI\n     */\n    @Test\n    public void testEmptyUri() {\n        assertNull(UserUriMatcher.getUser(Uri.parse(\"\")));\n    }\n\n    /**\n     * Verify no name\n     */\n    @Test\n    public void testUriWithNoName() {\n        assertNull(UserUriMatcher.getUser(Uri.parse(\"http://github.com\")));\n        assertNull(UserUriMatcher.getUser(Uri.parse(\"https://github.com\")));\n        assertNull(UserUriMatcher.getUser(Uri.parse(\"http://github.com/\")));\n        assertNull(UserUriMatcher.getUser(Uri.parse(\"http://github.com//\")));\n    }\n\n    /**\n     * Verify URI with name\n     */\n    @Test\n    public void testHttpUriWithName() {\n        User user = UserUriMatcher.getUser(Uri\n                .parse(\"http://github.com/defunkt\"));\n        assertNotNull(user);\n        assertEquals(\"defunkt\", user.login());\n    }\n\n    /**\n     * Verify URI with name\n     */\n    @Test\n    public void testHttpsUriWithName() {\n        User user = UserUriMatcher.getUser(Uri\n                .parse(\"https://github.com/mojombo\"));\n        assertNotNull(user);\n        assertEquals(\"mojombo\", user.login());\n    }\n\n    /**\n     * Verify URI with name\n     */\n    @Test\n    public void testUriWithTrailingSlash() {\n        User user = UserUriMatcher.getUser(Uri\n                .parse(\"http://github.com/defunkt/\"));\n        assertNotNull(user);\n        assertEquals(\"defunkt\", user.login());\n    }\n\n    /**\n     * Verify URI with name\n     */\n    @Test\n    public void testUriWithTrailingSlashes() {\n        User user = UserUriMatcher.getUser(Uri\n                .parse(\"http://github.com/defunkt//\"));\n        assertNotNull(user);\n        assertEquals(\"defunkt\", user.login());\n    }\n}\n"
  },
  {
    "path": "app/src/androidTest/java/com/github/pockethub/android/tests/util/HtmlUtilsTest.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.tests.util;\n\nimport com.github.pockethub.android.util.HtmlUtils;\nimport org.junit.Test;\n\nimport static junit.framework.Assert.assertNotNull;\nimport static org.junit.Assert.assertEquals;\n\n/**\n * Unit tests of HTML conversions done when rendering markdown\n */\npublic class HtmlUtilsTest {\n\n    private String format(String html) {\n        CharSequence formatted = HtmlUtils.format(html);\n        assertNotNull(formatted);\n        return formatted.toString().replace(\"<githubroot>\", \"\")\n                .replace(\"</githubroot>\", \"\");\n    }\n\n    /**\n     * Single email toggle span is removed\n     */\n    @Test\n    public void testToggleRemoved() {\n        String html = \"before <span class=\\\"email-hidden-toggle\\\"><a href=\\\"#\\\">…</a></span>after\";\n        assertEquals(\"before after\", format(html));\n    }\n\n    /**\n     * Multiple email toggle spans are removed\n     */\n    @Test\n    public void testTogglesRemoved() {\n        String html = \"before <span class=\\\"email-hidden-toggle\\\"><a href=\\\"#\\\">…</a></span>after<span class=\\\"email-hidden-toggle\\\"><a href=\\\"#\\\">…</a></span>\";\n        assertEquals(\"before after\", format(html));\n    }\n\n    /**\n     * Email div is transformed into block quote\n     */\n    @Test\n    public void testEmailQuoted() {\n        String html = \"before <div class=\\\"email-quoted-reply\\\">quoted</div> after\";\n        assertEquals(\"before <blockquote>quoted</blockquote> after\",\n                format(html));\n    }\n\n    /**\n     * Email fragment div is removed and newlines are replaced with br tags\n     */\n    @Test\n    public void testEmailFragment() {\n        String html = \"before <div class=\\\"email-fragment\\\">in\\nside</div> after\";\n        assertEquals(\"before in<br>side after\", format(html));\n    }\n\n    /**\n     * Email fragment div is removed and newlines are replaced with br tags\n     */\n    @Test\n    public void testEmailFragments() {\n        String html = \"before <div class=\\\"email-fragment\\\">in\\nside</div> after <div class=\\\"email-fragment\\\">out\\nside</div>\";\n        assertEquals(\"before in<br>side after out<br>side\", format(html));\n    }\n\n    /**\n     * Email fragment div is removed and newlines are replaced with br tags\n     */\n    @Test\n    public void testTrailingEmailFragment() {\n        String html = \"before <div class=\\\"email-fragment\\\">in\\nside</div>\";\n        assertEquals(\"before in<br>side\", format(html));\n    }\n\n    /**\n     * Leading break is removed\n     */\n    @Test\n    public void testLeadingBreak() {\n        String html = \"<br>content\";\n        assertEquals(\"content\", format(html));\n    }\n\n    /**\n     * Trailing break is removed\n     */\n    @Test\n    public void testTrailingBreak() {\n        String html = \"content<br>\";\n        assertEquals(\"content\", format(html));\n    }\n\n    /**\n     * Leading & trailing breaks are removed\n     */\n    @Test\n    public void testWrappedBreaks() {\n        String html = \"<br>content<br>\";\n        assertEquals(\"content\", format(html));\n    }\n\n    /**\n     * Leading & trailing breaks are removed\n     */\n    @Test\n    public void testWrappedParagraphs() {\n        String html = \"<p>content</p>\";\n        assertEquals(\"content\", format(html));\n    }\n\n    /**\n     * Paragraph replaced with break\n     */\n    @Test\n    public void testParagraphReplacedWithBreak() {\n        String html = \"line1<p>line2</p>\";\n        assertEquals(\"line1<br>line2\", format(html));\n    }\n\n    /**\n     * em tags replaced with i tags\n     */\n    @Test\n    public void testEmReplacedWithI() {\n        String html = \"a<em>b</em>c\";\n        assertEquals(html, format(html));\n    }\n\n    /**\n     * strong tags replaced with b tags\n     */\n    @Test\n    public void testStrongReplacedWithB() {\n        String html = \"<strong>a</strong>\";\n        assertEquals(html, format(html));\n    }\n\n    /**\n     * Leading whitespace is removed\n     */\n    @Test\n    public void testLeadingWhitespace() {\n        String html = \" content\";\n        assertEquals(\"content\", format(html));\n    }\n\n    /**\n     * Trailing whitespace is removed\n     */\n    @Test\n    public void testTrailingWhitespace() {\n        String html = \"content \";\n        assertEquals(\"content\", format(html));\n    }\n\n    /**\n     * Leading & trailing whitespace is removed\n     */\n    @Test\n    public void testWrappedWhitetspace() {\n        String html = \" content \";\n        assertEquals(\"content\", format(html));\n    }\n\n    /**\n     * Pre untouched\n     */\n    @Test\n    public void testPreWithNoWhitespace() {\n        String html = \"a<pre>b</pre> c\";\n        assertEquals(\"a<pre>b</pre> c\", format(html));\n    }\n\n    /**\n     * Pre space escaped\n     */\n    @Test\n    public void testPreWithSpaces() {\n        String html = \"a<pre> b</pre> c\";\n        assertEquals(\"a<pre>&nbsp;b</pre> c\", format(html));\n    }\n\n    /**\n     * Pre tab escaped\n     */\n    @Test\n    public void testPreWithTabs() {\n        String html = \"a<pre>\\tb</pre> c\";\n        assertEquals(\"a<pre>&nbsp;&nbsp;&nbsp;&nbsp;b</pre> c\", format(html));\n    }\n\n    /**\n     * Pre newline escaped\n     */\n    @Test\n    public void testPreWithNewline() {\n        String html = \"a<pre>\\nb</pre> c\";\n        assertEquals(\"a<pre><br>b</pre> c\", format(html));\n    }\n\n    /**\n     * Pre space, tab, and newline escaped\n     */\n    @Test\n    public void testPreWithAllWhitepsace() {\n        String html = \"a<pre>\\nb\\tc </pre>d\";\n        assertEquals(\"a<pre><br>b&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;</pre>d\",\n                format(html));\n    }\n\n    /**\n     * Multiple pre elements escaped\n     */\n    @Test\n    public void testMultiplePresEscaped() {\n        String html = \"a<pre> c </pre>d<pre>\\te\\t</pre>\";\n        assertEquals(\n                \"a<pre>&nbsp;c&nbsp;</pre>d<pre>&nbsp;&nbsp;&nbsp;&nbsp;e&nbsp;&nbsp;&nbsp;&nbsp;</pre>\",\n                format(html));\n    }\n\n    /**\n     * Single code element inside a pre element\n     */\n    @Test\n    public void testFormatPreCodeOnly() {\n        String html = \"<pre><code>a\\nb\\nc\\n</code></pre>\";\n        assertEquals(\"<pre><code>a<br>b<br>c</code></pre>\", format(html));\n    }\n}\n"
  },
  {
    "path": "app/src/debug/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"app_name\" translatable=\"false\">PocketHub Debug</string>\n</resources>"
  },
  {
    "path": "app/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    package=\"com.github.pockethub.android\">\n\n    <uses-permission android:name=\"android.permission.INTERNET\" />\n    <uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>\n    <uses-permission android:name=\"android.permission.GET_ACCOUNTS\" />\n    <uses-permission android:name=\"android.permission.MANAGE_ACCOUNTS\" />\n    <uses-permission android:name=\"android.permission.AUTHENTICATE_ACCOUNTS\" />\n    <uses-permission android:name=\"android.permission.READ_SYNC_SETTINGS\" />\n    <uses-permission android:name=\"android.permission.READ_SYNC_STATS\" />\n    <uses-permission android:name=\"android.permission.USE_CREDENTIALS\" />\n    <uses-permission android:name=\"android.permission.WRITE_SYNC_SETTINGS\" />\n    <uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\" />\n\n    <supports-screens\n        android:largeScreens=\"true\"\n        android:normalScreens=\"true\"\n        android:smallScreens=\"true\"\n        android:xlargeScreens=\"true\" />\n\n    <application\n        android:allowBackup=\"true\"\n        android:hardwareAccelerated=\"false\"\n        android:icon=\"@drawable/app_icon\"\n        android:supportsRtl=\"true\"\n        android:label=\"@string/app_name\"\n        android:theme=\"@style/Theme.PocketHub\"\n        android:name=\".PocketHub\"\n        android:usesCleartextTraffic=\"true\">\n\n        <activity\n            android:name=\".ui.MainActivity\"\n            android:theme=\"@style/Theme.PocketHub.NavigationDrawer\"\n            android:configChanges=\"orientation|keyboardHidden|screenSize\"\n            android:hardwareAccelerated=\"true\">\n\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n\n            <meta-data\n                android:name=\"android.app.default_searchable\"\n                android:value=\"com.github.pockethub.android.ui.search.SearchActivity\" />\n        </activity>\n        <activity\n            android:name=\".ui.gist.CreateGistActivity\"\n            android:configChanges=\"orientation|keyboardHidden|screenSize\"\n            android:label=\"@string/create_gist\"\n            android:parentActivityName=\".ui.MainActivity\"\n            tools:ignore=\"UnusedAttribute\">\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\"com.github.pockethub.android.ui.MainActivity\" />\n            <intent-filter>\n                <action android:name=\"android.intent.action.SEND\" />\n                <category android:name=\"android.intent.category.DEFAULT\" />\n                <data android:mimeType=\"text/*\" />\n            </intent-filter>\n        </activity>\n        <activity\n            android:name=\".ui.notification.NotificationActivity\"\n            android:configChanges=\"orientation|keyboardHidden|screenSize\"\n            android:parentActivityName=\".ui.MainActivity\"\n            android:hardwareAccelerated=\"true\"\n            tools:ignore=\"UnusedAttribute\">\n\n            <meta-data\n                android:name=\"android.support.PARENT_ACTIVITY\"\n                android:value=\"com.github.pockethub.android.ui.MainActivity\" />\n        </activity>\n        <activity\n            android:name=\".ui.issue.IssueBrowseActivity\"\n            android:configChanges=\"orientation|keyboardHidden|screenSize\"\n            android:hardwareAccelerated=\"true\">\n            <intent-filter>\n                <action android:name=\"${applicationId}.repo.issues.VIEW\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n            </intent-filter>\n\n            <meta-data\n                android:name=\"android.app.default_searchable\"\n                android:value=\"com.github.pockethub.android.ui.issue.IssueSearchActivity\" />\n        </activity>\n        <activity\n            android:name=\".ui.issue.EditIssuesFilterActivity\"\n            android:configChanges=\"orientation|keyboardHidden|screenSize\">\n            <intent-filter>\n                <action android:name=\"${applicationId}.repo.issues.filter.VIEW\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n            </intent-filter>\n        </activity>\n        <activity\n            android:name=\".ui.issue.EditIssueActivity\"\n            android:configChanges=\"orientation|keyboardHidden|screenSize\">\n            <intent-filter>\n                <action android:name=\"${applicationId}.repo.issues.edit.VIEW\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n            </intent-filter>\n        </activity>\n        <activity\n            android:name=\".ui.search.SearchActivity\"\n            android:configChanges=\"orientation|keyboardHidden|screenSize\"\n            android:hardwareAccelerated=\"true\"\n            android:label=\"@string/search_title\"\n            android:launchMode=\"singleTop\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.SEARCH\" />\n            </intent-filter>\n\n            <meta-data\n                android:name=\"android.app.searchable\"\n                android:resource=\"@xml/searchable_repos_users\" />\n        </activity>\n        <activity\n            android:name=\".ui.issue.FiltersViewActivity\"\n            android:configChanges=\"orientation|keyboardHidden|screenSize\"\n            android:hardwareAccelerated=\"true\">\n            <intent-filter>\n                <action android:name=\"${applicationId}.repo.issues.filters.VIEW\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n            </intent-filter>\n        </activity>\n        <activity\n            android:name=\".ui.gist.GistsViewActivity\"\n            android:configChanges=\"orientation|keyboardHidden|screenSize\">\n            <intent-filter>\n                <action android:name=\"${applicationId}.gists.VIEW\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n            </intent-filter>\n        </activity>\n        <activity\n            android:name=\".ui.gist.GistFilesViewActivity\"\n            android:configChanges=\"orientation|keyboardHidden|screenSize\">\n            <intent-filter>\n                <action android:name=\"${applicationId}.gist.files.VIEW\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n            </intent-filter>\n        </activity>\n        <activity\n            android:name=\".ui.issue.CreateCommentActivity\"\n            android:configChanges=\"orientation|keyboardHidden|screenSize\">\n            <intent-filter>\n                <action android:name=\"${applicationId}.issue.comment.create.VIEW\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n            </intent-filter>\n        </activity>\n        <activity\n            android:name=\".ui.issue.EditCommentActivity\"\n            android:configChanges=\"orientation|keyboardHidden|screenSize\">\n            <intent-filter>\n                <action android:name=\"${applicationId}.issue.comment.edit.VIEW\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n            </intent-filter>\n        </activity>\n        <activity\n            android:name=\".ui.gist.CreateCommentActivity\"\n            android:configChanges=\"orientation|keyboardHidden|screenSize\">\n            <intent-filter>\n                <action android:name=\"${applicationId}.gist.comment.create.VIEW\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n            </intent-filter>\n        </activity>\n        <activity\n            android:name=\".ui.gist.EditCommentActivity\"\n            android:configChanges=\"orientation|keyboardHidden|screenSize\">\n            <intent-filter>\n                <action android:name=\"${applicationId}.gist.comment.edit.VIEW\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n            </intent-filter>\n        </activity>\n        <activity\n            android:name=\".ui.commit.CreateCommentActivity\"\n            android:configChanges=\"orientation|keyboardHidden|screenSize\">\n            <intent-filter>\n                <action android:name=\"${applicationId}.commit.comment.create.VIEW\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n            </intent-filter>\n        </activity>\n        <activity\n            android:name=\".ui.repo.RepositoryViewActivity\"\n            android:configChanges=\"orientation|keyboardHidden|screenSize\"\n            android:hardwareAccelerated=\"true\">\n            <intent-filter>\n                <action android:name=\"${applicationId}.repo.VIEW\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n            </intent-filter>\n\n            <meta-data\n                android:name=\"android.app.default_searchable\"\n                android:value=\"com.github.pockethub.android.ui.issue.IssueSearchActivity\" />\n        </activity>\n        <activity\n            android:name=\".ui.repo.RepositoryContributorsActivity\"\n            android:configChanges=\"orientation|keyboardHidden|screenSize\"\n            android:hardwareAccelerated=\"true\">\n            <intent-filter>\n                <action android:name=\"${applicationId}.repo.contributors.VIEW\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n            </intent-filter>\n        </activity>\n        <activity\n            android:name=\".ui.user.UserViewActivity\"\n            android:configChanges=\"orientation|keyboardHidden|screenSize\"\n            android:hardwareAccelerated=\"true\">\n            <intent-filter>\n                <action android:name=\"${applicationId}.user.VIEW\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n            </intent-filter>\n        </activity>\n        <activity\n            android:name=\".ui.issue.IssuesViewActivity\"\n            android:configChanges=\"orientation|keyboardHidden|screenSize\">\n            <intent-filter>\n                <action android:name=\"${applicationId}.issues.VIEW\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n            </intent-filter>\n        </activity>\n\n        <service\n            android:name=\".accounts.AccountAuthenticatorService\"\n            android:exported=\"false\"\n            android:process=\":auth\">\n            <intent-filter>\n                <action android:name=\"android.accounts.AccountAuthenticator\" />\n            </intent-filter>\n\n            <meta-data\n                android:name=\"android.accounts.AccountAuthenticator\"\n                android:resource=\"@xml/authenticator\" />\n        </service>\n\n        <activity\n            android:name=\".accounts.LoginActivity\"\n            android:configChanges=\"orientation|keyboardHidden|screenSize\"\n            android:launchMode=\"singleTop\">\n\n            <intent-filter>\n                <action android:name=\"android.intent.action.VIEW\" />\n\n                <data android:scheme=\"@string/github_oauth_scheme\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n                <category android:name=\"android.intent.category.BROWSABLE\" />\n            </intent-filter>\n\n        </activity>\n\n        <activity\n            android:name=\".ui.user.UriLauncherActivity\"\n            android:configChanges=\"orientation|keyboardHidden|screenSize\"\n            android:excludeFromRecents=\"true\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.VIEW\" />\n                <category android:name=\"android.intent.category.BROWSABLE\" />\n                <category android:name=\"android.intent.category.DEFAULT\" />\n\n                <data\n                    android:host=\"github.com\"\n                    android:scheme=\"http\" />\n            </intent-filter>\n            <intent-filter>\n                <action android:name=\"android.intent.action.VIEW\" />\n                <category android:name=\"android.intent.category.BROWSABLE\" />\n                <category android:name=\"android.intent.category.DEFAULT\" />\n\n                <data\n                    android:host=\"github.com\"\n                    android:scheme=\"https\" />\n            </intent-filter>\n            <intent-filter>\n                <action android:name=\"android.intent.action.VIEW\" />\n                <category android:name=\"android.intent.category.BROWSABLE\" />\n                <category android:name=\"android.intent.category.DEFAULT\" />\n\n                <data\n                    android:host=\"gist.github.com\"\n                    android:scheme=\"http\" />\n            </intent-filter>\n            <intent-filter>\n                <action android:name=\"android.intent.action.VIEW\" />\n                <category android:name=\"android.intent.category.BROWSABLE\" />\n                <category android:name=\"android.intent.category.DEFAULT\" />\n\n                <data\n                    android:host=\"gist.github.com\"\n                    android:scheme=\"https\" />\n            </intent-filter>\n        </activity>\n        <activity\n            android:name=\".ui.issue.IssueSearchActivity\"\n            android:configChanges=\"orientation|keyboardHidden|screenSize\"\n            android:hardwareAccelerated=\"true\"\n            android:label=\"@string/search_title\"\n            android:launchMode=\"singleTop\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.SEARCH\" />\n            </intent-filter>\n\n            <meta-data\n                android:name=\"android.app.searchable\"\n                android:resource=\"@xml/searchable_issues\" />\n        </activity>\n        <activity\n            android:name=\".ui.commit.CommitCompareViewActivity\"\n            android:configChanges=\"orientation|keyboardHidden|screenSize\"\n            android:label=\"@string/commit_compare_title\">\n            <intent-filter>\n                <action android:name=\"${applicationId}.commits.compare.VIEW\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n            </intent-filter>\n        </activity>\n        <activity\n            android:name=\".ui.commit.CommitViewActivity\"\n            android:configChanges=\"orientation|keyboardHidden|screenSize\">\n            <intent-filter>\n                <action android:name=\"${applicationId}.commits.VIEW\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n            </intent-filter>\n        </activity>\n        <activity\n            android:name=\".ui.commit.CommitFileViewActivity\"\n            android:configChanges=\"orientation|keyboardHidden|screenSize\">\n            <intent-filter>\n                <action android:name=\"${applicationId}.commit.file.VIEW\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n            </intent-filter>\n        </activity>\n        <activity\n            android:name=\".ui.ref.BranchFileViewActivity\"\n            android:configChanges=\"orientation|keyboardHidden|screenSize\">\n            <intent-filter>\n                <action android:name=\"${applicationId}.branch.file.VIEW\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n            </intent-filter>\n        </activity>\n\n        <activity android:name=\".accounts.LoginWebViewActivity\"\n            android:launchMode=\"singleTop\"\n            android:configChanges=\"orientation|keyboardHidden|screenSize\" />\n\n        <service\n            android:name=\".sync.SyncAdapterService\"\n            android:exported=\"false\"\n            android:process=\":repos\">\n            <intent-filter>\n                <action android:name=\"android.content.SyncAdapter\" />\n            </intent-filter>\n\n            <meta-data\n                android:name=\"android.content.SyncAdapter\"\n                android:resource=\"@xml/sync_adapter\" />\n        </service>\n\n        <provider\n            android:name=\".sync.ContentProviderAdapter\"\n            android:authorities=\"@string/provider_authority_sync\"\n            android:exported=\"false\"\n            android:label=\"@string/app_name\"\n            android:syncable=\"true\" />\n        <provider\n            android:name=\".ui.search.RepositorySearchSuggestionsProvider\"\n            android:authorities=\"@string/provider_authority_search_suggest_repos\"\n            android:exported=\"false\" />\n        <provider\n            android:name=\".ui.issue.IssueSearchSuggestionsProvider\"\n            android:authorities=\"@string/provider_authority_search_suggest_issues\"\n            android:exported=\"false\" />\n\n        <meta-data\n            android:name=\"com.alorma.github.sdk.client\"\n            android:value=\"@string/github_client\"/>\n\n        <meta-data\n            android:name=\"com.alorma.github.sdk.secret\"\n            android:value=\"@string/github_secret\"/>\n\n        <meta-data\n            android:name=\"com.alorma.github.sdk.oauth\"\n            android:value=\"@string/github_oauth\"/>\n\n        <meta-data\n            android:name=\"com.bugsnag.android.API_KEY\"\n            android:value=\"@string/bugsnag_api_key\"/>\n    </application>\n\n</manifest>\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 Marijn Haverbeke <marijnh@gmail.com> and others\nCopyright (c) 2016 Michael Zhou <zhoumotongxue008@gmail.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/VERSION",
    "content": "5.19.0-minified"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/comment/comment.js",
    "content": "'use strict';(function(h){\"object\"==typeof exports&&\"object\"==typeof module?h(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],h):h(CodeMirror)})(function(h){function w(a){a=a.search(q);return-1==a?0:a}function D(a,d,b){return/\\bstring\\b/.test(a.getTokenTypeAt(k(d.line,0)))&&!/^[\\'\\\"`]/.test(b)}var A={},q=/[^\\s\\u00a0]/,k=h.Pos;h.commands.toggleComment=function(a){a.toggleComment()};h.defineExtension(\"toggleComment\",function(a){a||(a=A);for(var d=\nInfinity,b=this.listSelections(),c=null,e=b.length-1;0<=e;e--){var f=b[e].from(),g=b[e].to();f.line>=d||(g.line>=d&&(g=k(d,0)),d=f.line,null==c?this.uncomment(f,g,a)?c=\"un\":(this.lineComment(f,g,a),c=\"line\"):\"un\"==c?this.uncomment(f,g,a):this.lineComment(f,g,a))}});h.defineExtension(\"lineComment\",function(a,d,b){b||(b=A);var c=this,e=c.getModeAt(a),f=c.getLine(a.line);if(null!=f&&!D(c,a,f)){var g=b.lineComment||e.lineComment;if(g){var m=Math.min(0!=d.ch||d.line==a.line?d.line+1:d.line,c.lastLine()+\n1),h=null==b.padding?\" \":b.padding,l=b.commentBlankLines||a.line==d.line;c.operation(function(){if(b.indent){for(var d=null,f=a.line;f<m;++f){var e=c.getLine(f),e=e.slice(0,w(e));if(null==d||d.length>e.length)d=e}for(f=a.line;f<m;++f){var e=c.getLine(f),n=d.length;if(l||q.test(e))e.slice(0,n)!=d&&(n=w(e)),c.replaceRange(d+g+h,k(f,0),k(f,n))}}else for(f=a.line;f<m;++f)(l||q.test(c.getLine(f)))&&c.replaceRange(g+h,k(f,0))})}else if(b.blockCommentStart||e.blockCommentStart)b.fullLines=!0,c.blockComment(a,\nd,b)}});h.defineExtension(\"blockComment\",function(a,d,b){b||(b=A);var c=this,e=c.getModeAt(a),f=b.blockCommentStart||e.blockCommentStart,g=b.blockCommentEnd||e.blockCommentEnd;if(!f||!g)(b.lineComment||e.lineComment)&&0!=b.fullLines&&c.lineComment(a,d,b);else if(!/\\bcomment\\b/.test(c.getTokenTypeAt(k(a.line,0)))){var m=Math.min(d.line,c.lastLine());m!=a.line&&0==d.ch&&q.test(c.getLine(m))&&--m;var h=null==b.padding?\" \":b.padding;a.line>m||c.operation(function(){if(0!=b.fullLines){var l=q.test(c.getLine(m));\nc.replaceRange(h+g,k(m));c.replaceRange(f+h,k(a.line,0));var x=b.blockCommentLead||e.blockCommentLead;if(null!=x)for(var p=a.line+1;p<=m;++p)(p!=m||l)&&c.replaceRange(x+h,k(p,0))}else c.replaceRange(g,d),c.replaceRange(f,a)})}});h.defineExtension(\"uncomment\",function(a,d,b){b||(b=A);var c=this,e=c.getModeAt(a),f=Math.min(0!=d.ch||d.line==a.line?d.line:d.line-1,c.lastLine()),g=Math.min(a.line,f),h=b.lineComment||e.lineComment,w=[],l=null==b.padding?\" \":b.padding,x;a:if(h){for(var p=g;p<=f;++p){var B=\nc.getLine(p),n=B.indexOf(h);-1<n&&!/comment/.test(c.getTokenTypeAt(k(p,n+1)))&&(n=-1);if(-1==n&&q.test(B))break a;if(-1<n&&q.test(B.slice(0,n)))break a;w.push(B)}c.operation(function(){for(var a=g;a<=f;++a){var b=w[a-g],d=b.indexOf(h),e=d+h.length;0>d||(b.slice(e,e+l.length)==l&&(e+=l.length),x=!0,c.replaceRange(\"\",k(a,d),k(a,e)))}});if(x)return!0}var t=b.blockCommentStart||e.blockCommentStart,u=b.blockCommentEnd||e.blockCommentEnd;if(!t||!u)return!1;var C=b.blockCommentLead||e.blockCommentLead,y=\nc.getLine(g),z=y.indexOf(t);if(-1==z)return!1;var v=f==g?y:c.getLine(f),r=v.indexOf(u,f==g?z+t.length:0);-1==r&&g!=f&&(v=c.getLine(--f),r=v.indexOf(u));if(-1==r||!/comment/.test(c.getTokenTypeAt(k(g,z+1)))||!/comment/.test(c.getTokenTypeAt(k(f,r+1))))return!1;e=y.lastIndexOf(t,a.ch);b=-1==e?-1:y.slice(0,a.ch).indexOf(u,e+t.length);if(-1!=e&&-1!=b&&b+u.length!=a.ch)return!1;b=v.indexOf(u,d.ch);a=v.slice(d.ch).lastIndexOf(t,b-d.ch);e=-1==b||-1==a?-1:d.ch+a;if(-1!=b&&-1!=e&&e!=d.ch)return!1;c.operation(function(){c.replaceRange(\"\",\nk(f,r-(l&&v.slice(r-l.length,r)==l?l.length:0)),k(f,r+u.length));var a=z+t.length;l&&y.slice(a,a+l.length)==l&&(a+=l.length);c.replaceRange(\"\",k(g,z),k(g,a));if(C)for(a=g+1;a<=f;++a){var b=c.getLine(a),d=b.indexOf(C);if(-1!=d&&!q.test(b.slice(0,d))){var e=d+C.length;l&&b.slice(e,e+l.length)==l&&(e+=l.length);c.replaceRange(\"\",k(a,d),k(a,e))}}});return!0})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/comment/continuecomment.js",
    "content": "'use strict';(function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],e):e(CodeMirror)})(function(e){function q(b){if(b.getOption(\"disableInput\"))return e.Pass;for(var d=b.listSelections(),a,l=[],m=0;m<d.length;m++){var f=d[m].head,g=b.getTokenAt(f);if(\"comment\"!=g.type)return e.Pass;var c=e.innerMode(b.getMode(),g.state).mode;if(!a)a=c;else if(a!=c)return e.Pass;c=null;if(a.blockCommentStart&&\na.blockCommentContinue){var k=g.string.indexOf(a.blockCommentEnd),n=b.getRange(e.Pos(f.line,0),e.Pos(f.line,g.end)),h;if(!(-1!=k&&k==g.string.length-a.blockCommentEnd.length&&f.ch>=k))if(0==g.string.indexOf(a.blockCommentStart)){if(c=n.slice(0,g.start),!/^\\s*$/.test(c))for(c=\"\",k=0;k<g.start;++k)c+=\" \"}else-1!=(h=n.indexOf(a.blockCommentContinue))&&h+a.blockCommentContinue.length>g.start&&/^\\s*$/.test(n.slice(0,h))&&(c=n.slice(0,h));null!=c&&(c+=a.blockCommentContinue)}null==c&&a.lineComment&&r(b)&&\n(f=b.getLine(f.line),h=f.indexOf(a.lineComment),-1<h&&(c=f.slice(0,h),c=/\\S/.test(c)?null:c+(a.lineComment+f.slice(h+a.lineComment.length).match(/^\\s*/)[0])));if(null==c)return e.Pass;l[m]=\"\\n\"+c}b.operation(function(){for(var a=d.length-1;0<=a;a--)b.replaceRange(l[a],d[a].from(),d[a].to(),\"+insert\")})}function r(b){return(b=b.getOption(\"continueComments\"))&&\"object\"==typeof b?!1!==b.continueLineComment:!0}for(var p=[\"clike\",\"css\",\"javascript\"],l=0;l<p.length;++l)e.extendMode(p[l],{blockCommentContinue:\" * \"});\ne.defineOption(\"continueComments\",null,function(b,d,a){a&&a!=e.Init&&b.removeKeyMap(\"continueComment\");d&&(a=\"Enter\",\"string\"==typeof d?a=d:\"object\"==typeof d&&d.key&&(a=d.key),d={name:\"continueComment\"},d[a]=q,b.addKeyMap(d))})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/dialog/dialog.css",
    "content": ".CodeMirror-dialog{position:absolute;left:0;right:0;background:inherit;z-index:15;padding:.1em .8em;overflow:hidden;color:inherit}.CodeMirror-dialog-top{border-bottom:1px solid #eee;top:0}.CodeMirror-dialog-bottom{border-top:1px solid #eee;bottom:0}.CodeMirror-dialog input{border:none;outline:0;background:0 0;width:20em;color:inherit;font-family:monospace}.CodeMirror-dialog button{font-size:70%}"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/dialog/dialog.js",
    "content": "'use strict';(function(c){\"object\"==typeof exports&&\"object\"==typeof module?c(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],c):c(CodeMirror)})(function(c){function l(a,c,b){a=a.getWrapperElement().appendChild(document.createElement(\"div\"));a.className=b?\"CodeMirror-dialog CodeMirror-dialog-bottom\":\"CodeMirror-dialog CodeMirror-dialog-top\";\"string\"==typeof c?a.innerHTML=c:a.appendChild(c);return a}function m(a,c){a.state.currentNotificationClose&&\na.state.currentNotificationClose();a.state.currentNotificationClose=c}c.defineExtension(\"openDialog\",function(a,g,b){function e(a){if(\"string\"==typeof a)d.value=a;else if(!h&&(h=!0,f.parentNode.removeChild(f),k.focus(),b.onClose))b.onClose(f)}b||(b={});m(this,null);var f=l(this,a,b.bottom),h=!1,k=this,d=f.getElementsByTagName(\"input\")[0];if(d){d.focus();b.value&&(d.value=b.value,!1!==b.selectValueOnOpen&&d.select());if(b.onInput)c.on(d,\"input\",function(a){b.onInput(a,d.value,e)});if(b.onKeyUp)c.on(d,\n\"keyup\",function(a){b.onKeyUp(a,d.value,e)});c.on(d,\"keydown\",function(a){if(!(b&&b.onKeyDown&&b.onKeyDown(a,d.value,e))){if(27==a.keyCode||!1!==b.closeOnEnter&&13==a.keyCode)d.blur(),c.e_stop(a),e();13==a.keyCode&&g(d.value,a)}});if(!1!==b.closeOnBlur)c.on(d,\"blur\",e)}else if(a=f.getElementsByTagName(\"button\")[0]){c.on(a,\"click\",function(){e();k.focus()});if(!1!==b.closeOnBlur)c.on(a,\"blur\",e);a.focus()}return e});c.defineExtension(\"openConfirm\",function(a,g,b){function e(){h||(h=!0,f.parentNode.removeChild(f),\nk.focus())}m(this,null);var f=l(this,a,b&&b.bottom);a=f.getElementsByTagName(\"button\");var h=!1,k=this,d=1;a[0].focus();for(b=0;b<a.length;++b){var n=a[b];(function(a){c.on(n,\"click\",function(b){c.e_preventDefault(b);e();a&&a(k)})})(g[b]);c.on(n,\"blur\",function(){--d;setTimeout(function(){0>=d&&e()},200)});c.on(n,\"focus\",function(){++d})}});c.defineExtension(\"openNotification\",function(a,g){function b(){f||(f=!0,clearTimeout(h),e.parentNode.removeChild(e))}m(this,b);var e=l(this,a,g&&g.bottom),f=\n!1,h;a=g&&\"undefined\"!==typeof g.duration?g.duration:5E3;c.on(e,\"click\",function(a){c.e_preventDefault(a);b()});a&&(h=setTimeout(b,a));return b})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/display/autorefresh.js",
    "content": "'use strict';(function(c){\"object\"==typeof exports&&\"object\"==typeof module?c(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],c):c(CodeMirror)})(function(c){function f(b,a){function d(){b.display.wrapper.offsetHeight?(e(b,a),b.display.lastWrapHeight!=b.display.wrapper.clientHeight&&b.refresh()):a.timeout=setTimeout(d,a.delay)}a.timeout=setTimeout(d,a.delay);a.hurry=function(){clearTimeout(a.timeout);a.timeout=setTimeout(d,50)};c.on(window,\"mouseup\",\na.hurry);c.on(window,\"keyup\",a.hurry)}function e(b,a){clearTimeout(a.timeout);c.off(window,\"mouseup\",a.hurry);c.off(window,\"keyup\",a.hurry)}c.defineOption(\"autoRefresh\",!1,function(b,a){b.state.autoRefresh&&(e(b,b.state.autoRefresh),b.state.autoRefresh=null);a&&0==b.display.wrapper.offsetHeight&&f(b,b.state.autoRefresh={delay:a.delay||250})})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/display/fullscreen.css",
    "content": ".CodeMirror-fullscreen{position:fixed;top:0;left:0;right:0;bottom:0;height:auto;z-index:9}"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/display/fullscreen.js",
    "content": "'use strict';(function(c){\"object\"==typeof exports&&\"object\"==typeof module?c(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],c):c(CodeMirror)})(function(c){c.defineOption(\"fullScreen\",!1,function(d,a,b){b==c.Init&&(b=!1);!b!=!a&&(a?(a=d.getWrapperElement(),d.state.fullScreenRestore={scrollTop:window.pageYOffset,scrollLeft:window.pageXOffset,width:a.style.width,height:a.style.height},a.style.width=\"\",a.style.height=\"auto\",a.className+=\" CodeMirror-fullscreen\",\ndocument.documentElement.style.overflow=\"hidden\"):(a=d.getWrapperElement(),a.className=a.className.replace(/\\s*CodeMirror-fullscreen\\b/,\"\"),document.documentElement.style.overflow=\"\",b=d.state.fullScreenRestore,a.style.width=b.width,a.style.height=b.height,window.scrollTo(b.scrollLeft,b.scrollTop)),d.refresh())})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/display/panel.js",
    "content": "'use strict';(function(g){\"object\"==typeof exports&&\"object\"==typeof module?g(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],g):g(CodeMirror)})(function(g){function f(a,b,c,d){this.cm=a;this.node=b;this.options=c;this.height=d;this.cleared=!1}function h(a){var b=a.getWrapperElement(),c=window.getComputedStyle?window.getComputedStyle(b):b.currentStyle,d=parseInt(c.height),e=a.state.panels={setHeight:b.style.height,heightLeft:d,panels:0,wrapper:document.createElement(\"div\")};\nb.parentNode.insertBefore(e.wrapper,b);c=a.hasFocus();e.wrapper.appendChild(b);c&&a.focus();a._setSize=a.setSize;null!=d&&(a.setSize=function(b,c){if(null==c)return this._setSize(b,c);e.setHeight=c;if(\"number\"!=typeof c){var f=/^(\\d+\\.?\\d*)px$/.exec(c);f?c=Number(f[1]):(e.wrapper.style.height=c,c=e.wrapper.offsetHeight,e.wrapper.style.height=\"\")}a._setSize(b,e.heightLeft+=c-d);d=c})}g.defineExtension(\"addPanel\",function(a,b){b=b||{};this.state.panels||h(this);var c=this.state.panels,d=c.wrapper,e=\nthis.getWrapperElement();b.after instanceof f&&!b.after.cleared?d.insertBefore(a,b.before.node.nextSibling):b.before instanceof f&&!b.before.cleared?d.insertBefore(a,b.before.node):b.replace instanceof f&&!b.replace.cleared?(d.insertBefore(a,b.replace.node),b.replace.clear()):\"bottom\"==b.position?d.appendChild(a):\"before-bottom\"==b.position?d.insertBefore(a,e.nextSibling):\"after-top\"==b.position?d.insertBefore(a,e):d.insertBefore(a,d.firstChild);d=b&&b.height||a.offsetHeight;this._setSize(null,c.heightLeft-=\nd);c.panels++;return new f(this,a,b,d)});f.prototype.clear=function(){if(!this.cleared){this.cleared=!0;var a=this.cm.state.panels;this.cm._setSize(null,a.heightLeft+=this.height);a.wrapper.removeChild(this.node);if(0==--a.panels){var a=this.cm,b=a.state.panels;a.state.panels=null;var c=a.getWrapperElement();b.wrapper.parentNode.replaceChild(c,b.wrapper);c.style.height=b.setHeight;a.setSize=a._setSize;a.setSize()}}};f.prototype.changed=function(a){a=null==a?this.node.offsetHeight:a;this.cm._setSize(null,\nthis.cm.state.panels.height+=a-this.height);this.height=a}});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/display/placeholder.js",
    "content": "'use strict';(function(d){\"object\"==typeof exports&&\"object\"==typeof module?d(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],d):d(CodeMirror)})(function(d){function f(a){a.state.placeholder&&(a.state.placeholder.parentNode.removeChild(a.state.placeholder),a.state.placeholder=null)}function h(a){f(a);var c=a.state.placeholder=document.createElement(\"pre\");c.style.cssText=\"height: 0; overflow: visible\";c.className=\"CodeMirror-placeholder\";var b=\na.getOption(\"placeholder\");\"string\"==typeof b&&(b=document.createTextNode(b));c.appendChild(b);a.display.lineSpace.insertBefore(c,a.display.lineSpace.firstChild)}function g(a){k(a)&&h(a)}function e(a){var c=a.getWrapperElement(),b=k(a);c.className=c.className.replace(\" CodeMirror-empty\",\"\")+(b?\" CodeMirror-empty\":\"\");b?h(a):f(a)}function k(a){return 1===a.lineCount()&&\"\"===a.getLine(0)}d.defineOption(\"placeholder\",\"\",function(a,c,b){b=b&&b!=d.Init;c&&!b?(a.on(\"blur\",g),a.on(\"change\",e),a.on(\"swapDoc\",\ne),e(a)):!c&&b&&(a.off(\"blur\",g),a.off(\"change\",e),a.off(\"swapDoc\",e),f(a),b=a.getWrapperElement(),b.className=b.className.replace(\" CodeMirror-empty\",\"\"));c&&!a.hasFocus()&&g(a)})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/display/rulers.js",
    "content": "'use strict';(function(c){\"object\"==typeof exports&&\"object\"==typeof module?c(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],c):c(CodeMirror)})(function(c){function e(a){a.state.rulerDiv.textContent=\"\";var h=a.getOption(\"rulers\"),e=a.defaultCharWidth(),k=a.charCoords(c.Pos(a.firstLine(),0),\"div\").left;a.state.rulerDiv.style.minHeight=a.display.scroller.offsetHeight+30+\"px\";for(var f=0;f<h.length;f++){var d=document.createElement(\"div\");d.className=\n\"CodeMirror-ruler\";var g,b=h[f];\"number\"==typeof b?g=b:(g=b.column,b.className&&(d.className+=\" \"+b.className),b.color&&(d.style.borderColor=b.color),b.lineStyle&&(d.style.borderLeftStyle=b.lineStyle),b.width&&(d.style.borderLeftWidth=b.width));d.style.left=k+g*e+\"px\";a.state.rulerDiv.appendChild(d)}}c.defineOption(\"rulers\",!1,function(a,c){a.state.rulerDiv&&(a.display.lineSpace.removeChild(a.state.rulerDiv),a.state.rulerDiv=null,a.off(\"refresh\",e));c&&c.length&&(a.state.rulerDiv=a.display.lineSpace.insertBefore(document.createElement(\"div\"),\na.display.cursorDiv),a.state.rulerDiv.className=\"CodeMirror-rulers\",e(a),a.on(\"refresh\",e))})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/edit/closebrackets.js",
    "content": "'use strict';(function(f){\"object\"==typeof exports&&\"object\"==typeof module?f(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],f):f(CodeMirror)})(function(f){function r(b,a){return\"pairs\"==a&&\"string\"==typeof b?b:\"object\"==typeof b&&null!=b[a]?b[a]:w[a]}function z(b){return function(a){return A(a,b)}}function u(b){var a=b.state.closeBrackets;return a?b.getModeAt(b.getCursor()).closeBrackets||a:null}function A(b,a){var c=u(b);if(!c||b.getOption(\"disableInput\"))return f.Pass;\nvar e=r(c,\"pairs\"),d=e.indexOf(a);if(-1==d)return f.Pass;for(var c=r(c,\"triples\"),v=e.charAt(d+1)==a,x=b.listSelections(),m=0==d%2,l,p=0;p<x.length;p++){var h=x[p],g=h.head,t=b.getRange(g,k(g.line,g.ch+1));if(m&&!h.empty())h=\"surround\";else if(!v&&m||t!=a)if(v&&1<g.ch&&0<=c.indexOf(a)&&b.getRange(k(g.line,g.ch-2),g)==a+a&&(2>=g.ch||b.getRange(k(g.line,g.ch-3),k(g.line,g.ch-2))!=a))h=\"addFour\";else if(v)if(!f.isWordChar(t)&&B(b,g,a))h=\"both\";else return f.Pass;else if(m&&(b.getLine(g.line).length==\ng.ch||C(t,e)||/\\s/.test(t)))h=\"both\";else return f.Pass;else h=0<=c.indexOf(a)&&b.getRange(g,k(g.line,g.ch+3))==a+a+a?\"skipThree\":\"skip\";if(!l)l=h;else if(l!=h)return f.Pass}var n=d%2?e.charAt(d-1):a,q=d%2?a:e.charAt(d+1);b.operation(function(){if(\"skip\"==l)b.execCommand(\"goCharRight\");else if(\"skipThree\"==l)for(var a=0;3>a;a++)b.execCommand(\"goCharRight\");else if(\"surround\"==l){for(var c=b.getSelections(),a=0;a<c.length;a++)c[a]=n+c[a]+q;b.replaceSelections(c,\"around\");c=b.listSelections().slice();\nfor(a=0;a<c.length;a++){var e=c,g=a,d;d=c[a];var h=0<f.cmpPos(d.anchor,d.head);d={anchor:new k(d.anchor.line,d.anchor.ch+(h?-1:1)),head:new k(d.head.line,d.head.ch+(h?1:-1))};e[g]=d}b.setSelections(c)}else\"both\"==l?(b.replaceSelection(n+q,null),b.triggerElectric(n+q),b.execCommand(\"goCharLeft\")):\"addFour\"==l&&(b.replaceSelection(n+n+n+n,\"before\"),b.execCommand(\"goCharRight\"))})}function C(b,a){b=a.lastIndexOf(b);return-1<b&&1==b%2}function y(b,a){b=b.getRange(k(a.line,a.ch-1),k(a.line,a.ch+1));return 2==\nb.length?b:null}function B(b,a,c){var e=b.getLine(a.line),d=b.getTokenAt(a);if(/\\bstring2?\\b/.test(d.type))return!1;c=new f.StringStream(e.slice(0,a.ch)+c+e.slice(a.ch),4);for(c.pos=c.start=d.start;;){e=b.getMode().token(c,d.state);if(c.pos>=a.ch+1)return/\\bstring2?\\b/.test(e);c.start=c.pos}}var w={pairs:\"()[]{}''\\\"\\\"\",triples:\"\",explode:\"[]{}\"},k=f.Pos;f.defineOption(\"autoCloseBrackets\",!1,function(b,a,c){c&&c!=f.Init&&(b.removeKeyMap(p),b.state.closeBrackets=null);a&&(b.state.closeBrackets=a,b.addKeyMap(p))});\nfor(var q=w.pairs+\"`\",p={Backspace:function(b){var a=u(b);if(!a||b.getOption(\"disableInput\"))return f.Pass;for(var c=r(a,\"pairs\"),a=b.listSelections(),e=0;e<a.length;e++){if(!a[e].empty())return f.Pass;var d=y(b,a[e].head);if(!d||0!=c.indexOf(d)%2)return f.Pass}for(e=a.length-1;0<=e;e--)c=a[e].head,b.replaceRange(\"\",k(c.line,c.ch-1),k(c.line,c.ch+1),\"+delete\")},Enter:function(b){var a=u(b),a=a&&r(a,\"explode\");if(!a||b.getOption(\"disableInput\"))return f.Pass;for(var c=b.listSelections(),e=0;e<c.length;e++){if(!c[e].empty())return f.Pass;\nvar d=y(b,c[e].head);if(!d||0!=a.indexOf(d)%2)return f.Pass}b.operation(function(){b.replaceSelection(\"\\n\\n\",null);b.execCommand(\"goCharLeft\");c=b.listSelections();for(var a=0;a<c.length;a++){var d=c[a].head.line;b.indentLine(d,null,!0);b.indentLine(d+1,null,!0)}})}},m=0;m<q.length;m++)p[\"'\"+q.charAt(m)+\"'\"]=z(q.charAt(m))});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/edit/closetag.js",
    "content": "'use strict';(function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\"),require(\"../fold/xml-fold\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\",\"../fold/xml-fold\"],e):e(CodeMirror)})(function(e){function r(b){if(b.getOption(\"disableInput\"))return e.Pass;for(var h=b.listSelections(),a=[],d=0;d<h.length;d++){if(!h[d].empty())return e.Pass;var f=h[d].head,c=b.getTokenAt(f),k=e.innerMode(b.getMode(),c.state),m=k.state;if(\"xml\"!=k.mode.name||\n!m.tagName)return e.Pass;var g=b.getOption(\"autoCloseTags\"),l=\"html\"==k.mode.configuration,k=\"object\"==typeof g&&g.dontCloseTags||l&&t,l=\"object\"==typeof g&&g.indentTags||l&&u,g=m.tagName;c.end>f.ch&&(g=g.slice(0,g.length-c.end+f.ch));var n=g.toLowerCase();if(!g||\"string\"==c.type&&(c.end!=f.ch||!/[\\\"\\']/.test(c.string.charAt(c.string.length-1))||1==c.string.length)||\"tag\"==c.type&&\"closeTag\"==m.type||c.string.indexOf(\"/\")==c.string.length-1||k&&-1<p(k,n)||q(b,g,f,m,!0))return e.Pass;c=l&&-1<p(l,n);\na[d]={indent:c,text:\">\"+(c?\"\\n\\n\":\"\")+\"</\"+g+\">\",newPos:c?e.Pos(f.line+1,0):e.Pos(f.line,f.ch+1)}}for(d=h.length-1;0<=d;d--)f=a[d],b.replaceRange(f.text,h[d].head,h[d].anchor,\"+insert\"),c=b.listSelections().slice(0),c[d]={head:f.newPos,anchor:f.newPos},b.setSelections(c),f.indent&&(b.indentLine(f.newPos.line,null,!0),b.indentLine(f.newPos.line+1,null,!0))}function n(b,h){for(var a=b.listSelections(),d=[],f=h?\"/\":\"</\",c=0;c<a.length;c++){if(!a[c].empty())return e.Pass;var k=a[c].head,m=b.getTokenAt(k),\ng=e.innerMode(b.getMode(),m.state),l=g.state;if(h&&(\"string\"==m.type||\"<\"!=m.string.charAt(0)||m.start!=k.ch-1))return e.Pass;if(\"xml\"!=g.mode.name)if(\"htmlmixed\"==b.getMode().name&&\"javascript\"==g.mode.name)g=f+\"script\";else if(\"htmlmixed\"==b.getMode().name&&\"css\"==g.mode.name)g=f+\"style\";else return e.Pass;else{if(!l.context||!l.context.tagName||q(b,l.context.tagName,k,l))return e.Pass;g=f+l.context.tagName}\">\"!=b.getLine(k.line).charAt(m.end)&&(g+=\">\");d[c]=g}b.replaceSelections(d);a=b.listSelections();\nfor(c=0;c<a.length;c++)(c==a.length-1||a[c].head.line<a[c+1].head.line)&&b.indentLine(a[c].head.line)}function p(b,e){if(b.indexOf)return b.indexOf(e);for(var a=0,d=b.length;a<d;++a)if(b[a]==e)return a;return-1}function q(b,h,a,d,f){if(!e.scanForClosingTag)return!1;var c=Math.min(b.lastLine()+1,a.line+500);a=e.scanForClosingTag(b,a,null,c);if(!a||a.tag!=h)return!1;d=d.context;for(f=f?1:0;d&&d.tagName==h;d=d.prev)++f;a=a.to;for(d=1;d<f;d++){a=e.scanForClosingTag(b,a,null,c);if(!a||a.tag!=h)return!1;\na=a.to}return!0}e.defineOption(\"autoCloseTags\",!1,function(b,h,a){a!=e.Init&&a&&b.removeKeyMap(\"autoCloseTags\");if(h){a={name:\"autoCloseTags\"};if(\"object\"!=typeof h||h.whenClosing)a[\"'/'\"]=function(a){a=a.getOption(\"disableInput\")?e.Pass:n(a,!0);return a};if(\"object\"!=typeof h||h.whenOpening)a[\"'>'\"]=function(a){return r(a)};b.addKeyMap(a)}});var t=\"area base br col command embed hr img input keygen link meta param source track wbr\".split(\" \"),u=\"applet blockquote body button div dl fieldset form frameset h1 h2 h3 h4 h5 h6 head html iframe layer legend object ol p select table ul\".split(\" \");\ne.commands.closeTag=function(b){return n(b)}});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/edit/continuelist.js",
    "content": "'use strict';(function(d){\"object\"==typeof exports&&\"object\"==typeof module?d(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],d):d(CodeMirror)})(function(d){var l=/^(\\s*)(>[> ]*|[*+-]\\s|(\\d+)([.)]))(\\s*)/,m=/^(\\s*)(>[> ]*|[*+-]|(\\d+)[.)])(\\s*)$/,n=/[*+-]\\s/;d.commands.newlineAndIndentContinueMarkdownList=function(b){if(b.getOption(\"disableInput\"))return d.Pass;for(var f=b.listSelections(),g=[],e=0;e<f.length;e++){var c=f[e].head,a=b.getStateAfter(c.line),\nh=!1!==a.list,p=0!==a.quote,k=b.getLine(c.line),a=l.exec(k);if(!f[e].empty()||!h&&!p||!a){b.execCommand(\"newlineAndIndent\");return}m.test(k)?(b.replaceRange(\"\",{line:c.line,ch:0},{line:c.line,ch:c.ch+1}),g[e]=\"\\n\"):(c=a[1],h=a[5],a=n.test(a[2])||0<=a[2].indexOf(\">\")?a[2]:parseInt(a[3],10)+1+a[4],g[e]=\"\\n\"+c+a+h)}b.replaceSelections(g)}});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/edit/matchbrackets.js",
    "content": "'use strict';(function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],e):e(CodeMirror)})(function(e){function r(a,c,b,e){var d=a.getLineHandle(c.line),l=c.ch-1,d=0<=l&&q[d.text.charAt(l)]||q[d.text.charAt(++l)];if(!d)return null;var h=\">\"==d.charAt(1)?1:-1;if(b&&0<h!=(l==c.ch))return null;b=a.getTokenTypeAt(m(c.line,l+1));a=t(a,m(c.line,l+(0<h?1:0)),h,b||null,e);return null==a?null:{from:m(c.line,\nl),to:a&&a.pos,match:a&&a.ch==d.charAt(0),forward:0<h}}function t(a,c,b,e,d){var l=d&&d.maxScanLineLength||1E4,h=d&&d.maxScanLines||1E3,g=[];d=d&&d.bracketRegex?d.bracketRegex:/[(){}[\\]]/;for(var h=0<b?Math.min(c.line+h,a.lastLine()+1):Math.max(a.firstLine()-1,c.line-h),k=c.line;k!=h;k+=b){var n=a.getLine(k);if(n){var f=0<b?0:n.length-1,w=0<b?n.length:-1;if(!(n.length>l))for(k==c.line&&(f=c.ch-(0>b?1:0));f!=w;f+=b){var p=n.charAt(f);if(d.test(p)&&(void 0===e||a.getTokenTypeAt(m(k,f+1))==e))if(\">\"==\nq[p].charAt(1)==0<b)g.push(p);else if(g.length)g.pop();else return{pos:m(k,f),ch:p}}}}return k-b==(0<b?a.lastLine():a.firstLine())?!1:null}function u(a,c,b){for(var e=a.state.matchBrackets.maxHighlightLineLength||1E3,d=[],f=a.listSelections(),h=0;h<f.length;h++){var g=f[h].empty()&&r(a,f[h].head,!1,b);if(g&&a.getLine(g.from.line).length<=e){var k=g.match?\"CodeMirror-matchingbracket\":\"CodeMirror-nonmatchingbracket\";d.push(a.markText(g.from,m(g.from.line,g.from.ch+1),{className:k}));g.to&&a.getLine(g.to.line).length<=\ne&&d.push(a.markText(g.to,m(g.to.line,g.to.ch+1),{className:k}))}}if(d.length)if(x&&a.state.focused&&a.focus(),b=function(){a.operation(function(){for(var a=0;a<d.length;a++)d[a].clear()})},c)setTimeout(b,800);else return b}function v(a){a.operation(function(){f&&(f(),f=null);f=u(a,!1,a.state.matchBrackets)})}var x=/MSIE \\d/.test(navigator.userAgent)&&(null==document.documentMode||8>document.documentMode),m=e.Pos,q={\"(\":\")>\",\")\":\"(<\",\"[\":\"]>\",\"]\":\"[<\",\"{\":\"}>\",\"}\":\"{<\"},f=null;e.defineOption(\"matchBrackets\",\n!1,function(a,c,b){b&&b!=e.Init&&(a.off(\"cursorActivity\",v),f&&(f(),f=null));c&&(a.state.matchBrackets=\"object\"==typeof c?c:{},a.on(\"cursorActivity\",v))});e.defineExtension(\"matchBrackets\",function(){u(this,!0)});e.defineExtension(\"findMatchingBracket\",function(a,c,b){return r(this,a,c,b)});e.defineExtension(\"scanForBracket\",function(a,c,b,e){return t(this,a,c,b,e)})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/edit/matchtags.js",
    "content": "'use strict';(function(d){\"object\"==typeof exports&&\"object\"==typeof module?d(require(\"../../lib/codemirror\"),require(\"../fold/xml-fold\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\",\"../fold/xml-fold\"],d):d(CodeMirror)})(function(d){function f(a){a.state.tagHit&&a.state.tagHit.clear();a.state.tagOther&&a.state.tagOther.clear();a.state.tagHit=a.state.tagOther=null}function e(a){a.state.failedTagMatch=!1;a.operation(function(){f(a);if(!a.somethingSelected()){var b=a.getCursor(),\nc=a.getViewport();c.from=Math.min(c.from,b.line);c.to=Math.max(b.line+1,c.to);if(b=d.findMatchingTag(a,b,c))a.state.matchBothTags&&(c=\"open\"==b.at?b.open:b.close)&&(a.state.tagHit=a.markText(c.from,c.to,{className:\"CodeMirror-matchingtag\"})),(b=\"close\"==b.at?b.open:b.close)?a.state.tagOther=a.markText(b.from,b.to,{className:\"CodeMirror-matchingtag\"}):a.state.failedTagMatch=!0}})}function g(a){a.state.failedTagMatch&&e(a)}d.defineOption(\"matchTags\",!1,function(a,b,c){c&&c!=d.Init&&(a.off(\"cursorActivity\",\ne),a.off(\"viewportChange\",g),f(a));b&&(a.state.matchBothTags=\"object\"==typeof b&&b.bothTags,a.on(\"cursorActivity\",e),a.on(\"viewportChange\",g),e(a))});d.commands.toMatchingTag=function(a){var b=d.findMatchingTag(a,a.getCursor());b&&(b=\"close\"==b.at?b.open:b.close)&&a.extendSelection(b.to,b.from)}});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/edit/trailingspace.js",
    "content": "'use strict';(function(a){\"object\"==typeof exports&&\"object\"==typeof module?a(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],a):a(CodeMirror)})(function(a){a.defineOption(\"showTrailingSpace\",!1,function(d,e,b){b==a.Init&&(b=!1);b&&!e?d.removeOverlay(\"trailingspace\"):!b&&e&&d.addOverlay({token:function(a){for(var b=a.string.length,c=b;c&&/\\s/.test(a.string.charAt(c-1));--c);if(c>a.pos)return a.pos=c,null;a.pos=b;return\"trailingspace\"},name:\"trailingspace\"})})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/fold/brace-fold.js",
    "content": "'use strict';(function(d){\"object\"==typeof exports&&\"object\"==typeof module?d(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],d):d(CodeMirror)})(function(d){d.registerHelper(\"fold\",\"brace\",function(e,a){function b(h){for(var c=a.ch,b=0;;)if(c=0>=c?-1:f.lastIndexOf(h,c-1),-1==c){if(1==b)break;b=1;c=f.length}else{if(1==b&&c<a.ch)break;k=e.getTokenTypeAt(d.Pos(g,c+1));if(!/^(comment|string)/.test(k))return c+1;--c}}var g=a.line,f=e.getLine(g),k,\nh=\"{\",t=\"}\",l=b(\"{\");null==l&&(h=\"[\",t=\"]\",l=b(\"[\"));if(null!=l){var u=1,v=e.lastLine(),p,r,m=g;a:for(;m<=v;++m)for(var n=e.getLine(m),c=m==g?l:0;;){var q=n.indexOf(h,c),c=n.indexOf(t,c);0>q&&(q=n.length);0>c&&(c=n.length);c=Math.min(q,c);if(c==n.length)break;if(e.getTokenTypeAt(d.Pos(m,c+1))==k)if(c==q)++u;else if(!--u){p=m;r=c;break a}++c}if(null!=p&&(g!=p||r!=l))return{from:d.Pos(g,l),to:d.Pos(p,r)}}});d.registerHelper(\"fold\",\"import\",function(e,a){function b(h){if(h<e.firstLine()||h>e.lastLine())return null;\nvar a=e.getTokenAt(d.Pos(h,1));/\\S/.test(a.string)||(a=e.getTokenAt(d.Pos(h,a.end+1)));if(\"keyword\"!=a.type||\"import\"!=a.string)return null;var b=h;for(h=Math.min(e.lastLine(),h+10);b<=h;++b){var f=e.getLine(b).indexOf(\";\");if(-1!=f)return{startCh:a.end,end:d.Pos(b,f)}}}a=a.line;var g=b(a),f;if(!g||b(a-1)||(f=b(a-2))&&f.end.line==a-1)return null;for(f=g.end;;){var k=b(f.line+1);if(null==k)break;f=k.end}return{from:e.clipPos(d.Pos(a,g.startCh+1)),to:f}});d.registerHelper(\"fold\",\"include\",function(e,\na){function b(a){if(a<e.firstLine()||a>e.lastLine())return null;var b=e.getTokenAt(d.Pos(a,1));/\\S/.test(b.string)||(b=e.getTokenAt(d.Pos(a,b.end+1)));if(\"meta\"==b.type&&\"#include\"==b.string.slice(0,8))return b.start+8}a=a.line;var g=b(a);if(null==g||null!=b(a-1))return null;for(var f=a;null!=b(f+1);)++f;return{from:d.Pos(a,g+1),to:e.clipPos(d.Pos(f))}})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/fold/comment-fold.js",
    "content": "'use strict';(function(b){\"object\"==typeof exports&&\"object\"==typeof module?b(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],b):b(CodeMirror)})(function(b){b.registerGlobalHelper(\"fold\",\"comment\",function(b){return b.blockCommentStart&&b.blockCommentEnd},function(g,d){var e=g.getModeAt(d),m=e.blockCommentStart,e=e.blockCommentEnd;if(m&&e){for(var f=d.line,h=g.getLine(f),a=d.ch,k=0;;)if(a=0>=a?-1:h.lastIndexOf(m,a-1),-1==a){if(1==k)return;k=1;\na=h.length}else{if(1==k&&a<d.ch)return;if(/comment/.test(g.getTokenTypeAt(b.Pos(f,a+1)))&&(0==a||h.slice(a-e.length,a)==e||!/comment/.test(g.getTokenTypeAt(b.Pos(f,a))))){d=a+m.length;break}--a}var h=1,k=g.lastLine(),n,q,a=f;a:for(;a<=k;++a)for(var l=g.getLine(a),c=a==f?d:0;;){var p=l.indexOf(m,c),c=l.indexOf(e,c);0>p&&(p=l.length);0>c&&(c=l.length);c=Math.min(p,c);if(c==l.length)break;if(c==p)++h;else if(!--h){n=a;q=c;break a}++c}if(null!=n&&(f!=n||q!=d))return{from:b.Pos(f,d),to:b.Pos(n,q)}}})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/fold/foldcode.js",
    "content": "'use strict';(function(b){\"object\"==typeof exports&&\"object\"==typeof module?b(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],b):b(CodeMirror)})(function(b){function k(a,c,d,g){function f(d){var b=k(a,c);if(!b||b.to.line-b.from.line<l)return null;for(var f=a.findMarksAt(b.from),e=0;e<f.length;++e)if(f[e].__isFold&&\"fold\"!==g){if(!d)return null;b.cleared=!0;f[e].clear()}return b}if(d&&d.call){var k=d;d=null}else k=h(a,d,\"rangeFinder\");\"number\"==\ntypeof c&&(c=b.Pos(c,0));var l=h(a,d,\"minFoldSize\"),e=f(!0);if(h(a,d,\"scanUp\"))for(;!e&&c.line>a.firstLine();)c=b.Pos(c.line-1,0),e=f(!1);if(e&&!e.cleared&&\"unfold\"!==g){var m=p(a,d);b.on(m,\"mousedown\",function(a){n.clear();b.e_preventDefault(a)});var n=a.markText(e.from,e.to,{replacedWith:m,clearOnEnter:h(a,d,\"clearOnEnter\"),__isFold:!0});n.on(\"clear\",function(c,d){b.signal(a,\"unfold\",a,c,d)});b.signal(a,\"fold\",a,e.from,e.to)}}function p(a,c){a=h(a,c,\"widget\");\"string\"==typeof a&&(c=document.createTextNode(a),\na=document.createElement(\"span\"),a.appendChild(c),a.className=\"CodeMirror-foldmarker\");return a}function h(a,c,b){return c&&void 0!==c[b]?c[b]:(a=a.options.foldOptions)&&void 0!==a[b]?a[b]:l[b]}b.newFoldFunction=function(a,c){return function(b,g){k(b,g,{rangeFinder:a,widget:c})}};b.defineExtension(\"foldCode\",function(a,b,d){k(this,a,b,d)});b.defineExtension(\"isFolded\",function(a){a=this.findMarksAt(a);for(var b=0;b<a.length;++b)if(a[b].__isFold)return!0});b.commands.toggleFold=function(a){a.foldCode(a.getCursor())};\nb.commands.fold=function(a){a.foldCode(a.getCursor(),null,\"fold\")};b.commands.unfold=function(a){a.foldCode(a.getCursor(),null,\"unfold\")};b.commands.foldAll=function(a){a.operation(function(){for(var c=a.firstLine(),d=a.lastLine();c<=d;c++)a.foldCode(b.Pos(c,0),null,\"fold\")})};b.commands.unfoldAll=function(a){a.operation(function(){for(var c=a.firstLine(),d=a.lastLine();c<=d;c++)a.foldCode(b.Pos(c,0),null,\"unfold\")})};b.registerHelper(\"fold\",\"combine\",function(){var a=Array.prototype.slice.call(arguments,\n0);return function(b,d){for(var c=0;c<a.length;++c){var f=a[c](b,d);if(f)return f}}});b.registerHelper(\"fold\",\"auto\",function(a,b){for(var c=a.getHelpers(b,\"fold\"),g=0;g<c.length;g++){var f=c[g](a,b);if(f)return f}});var l={rangeFinder:b.fold.auto,widget:\"\\u2194\",minFoldSize:0,scanUp:!1,clearOnEnter:!0};b.defineOption(\"foldOptions\",null);b.defineExtension(\"foldOption\",function(a,b){return h(this,a,b)})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/fold/foldgutter.css",
    "content": ".CodeMirror-foldmarker{color:#00f;text-shadow:#b9f 1px 1px 2px,#b9f -1px -1px 2px,#b9f 1px -1px 2px,#b9f -1px 1px 2px;font-family:arial;line-height:.3;cursor:pointer}.CodeMirror-foldgutter{width:.7em}.CodeMirror-foldgutter-folded,.CodeMirror-foldgutter-open{cursor:pointer}.CodeMirror-foldgutter-open:after{content:\"\\25BE\"}.CodeMirror-foldgutter-folded:after{content:\"\\25B8\"}"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/fold/foldgutter.js",
    "content": "'use strict';var $jscomp={scope:{},findInternal:function(a,f,d){a instanceof String&&(a=String(a));for(var g=a.length,e=0;e<g;e++){var k=a[e];if(f.call(d,k,e,a))return{i:e,v:k}}return{i:-1,v:void 0}}};$jscomp.defineProperty=\"function\"==typeof Object.defineProperties?Object.defineProperty:function(a,f,d){if(d.get||d.set)throw new TypeError(\"ES3 does not support getters and setters.\");a!=Array.prototype&&a!=Object.prototype&&(a[f]=d.value)};\n$jscomp.getGlobal=function(a){return\"undefined\"!=typeof window&&window===a?a:\"undefined\"!=typeof global?global:a};$jscomp.global=$jscomp.getGlobal(this);$jscomp.polyfill=function(a,f,d,g){if(f){d=$jscomp.global;a=a.split(\".\");for(g=0;g<a.length-1;g++){var e=a[g];e in d||(d[e]={});d=d[e]}a=a[a.length-1];g=d[a];f=f(g);f!=g&&null!=f&&$jscomp.defineProperty(d,a,{configurable:!0,writable:!0,value:f})}};\n$jscomp.polyfill(\"Array.prototype.find\",function(a){return a?a:function(a,d){return $jscomp.findInternal(this,a,d).v}},\"es6-impl\",\"es3\");\n(function(a){\"object\"==typeof exports&&\"object\"==typeof module?a(require(\"../../lib/codemirror\"),require(\"./foldcode\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\",\"./foldcode\"],a):a(CodeMirror)})(function(a){function f(b){this.options=b;this.from=this.to=0}function d(b,c){b=b.findMarks(m(c,0),m(c+1,0));for(var a=0;a<b.length;++a)if(b[a].__isFold&&b[a].find().from.line==c)return b[a]}function g(b){if(\"string\"==typeof b){var c=document.createElement(\"div\");c.className=b+\" CodeMirror-guttermarker-subtle\";\nreturn c}return b.cloneNode(!0)}function e(b,c,a){var l=b.state.foldGutter.options,e=c,f=b.foldOption(l,\"minFoldSize\"),k=b.foldOption(l,\"rangeFinder\");b.eachLine(c,a,function(c){var a=null;if(d(b,e))a=g(l.indicatorFolded);else{var h=m(e,0);(h=k&&k(b,h))&&h.to.line-h.from.line>=f&&(a=g(l.indicatorOpen))}b.setGutterMarker(c,l.gutter,a);++e})}function k(b){var c=b.getViewport(),a=b.state.foldGutter;a&&(b.operation(function(){e(b,c.from,c.to)}),a.from=c.from,a.to=c.to)}function q(b,c,a){var h=b.state.foldGutter;\nh&&(h=h.options,a==h.gutter&&((a=d(b,c))?a.clear():b.foldCode(m(c,0),h.rangeFinder)))}function n(b){var c=b.state.foldGutter;if(c){var a=c.options;c.from=c.to=0;clearTimeout(c.changeUpdate);c.changeUpdate=setTimeout(function(){k(b)},a.foldOnChangeTimeSpan||600)}}function r(b){var a=b.state.foldGutter;if(a){var d=a.options;clearTimeout(a.changeUpdate);a.changeUpdate=setTimeout(function(){var c=b.getViewport();a.from==a.to||20<c.from-a.to||20<a.from-c.to?k(b):b.operation(function(){c.from<a.from&&(e(b,\nc.from,a.from),a.from=c.from);c.to>a.to&&(e(b,a.to,c.to),a.to=c.to)})},d.updateViewportTimeSpan||400)}}function p(a,c){var b=a.state.foldGutter;b&&(c=c.line,c>=b.from&&c<b.to&&e(a,c,c+1))}a.defineOption(\"foldGutter\",!1,function(b,c,d){d&&d!=a.Init&&(b.clearGutter(b.state.foldGutter.options.gutter),b.state.foldGutter=null,b.off(\"gutterClick\",q),b.off(\"change\",n),b.off(\"viewportChange\",r),b.off(\"fold\",p),b.off(\"unfold\",p),b.off(\"swapDoc\",n));c&&(d=b.state,!0===c&&(c={}),null==c.gutter&&(c.gutter=\"CodeMirror-foldgutter\"),\nnull==c.indicatorOpen&&(c.indicatorOpen=\"CodeMirror-foldgutter-open\"),null==c.indicatorFolded&&(c.indicatorFolded=\"CodeMirror-foldgutter-folded\"),d.foldGutter=new f(c),k(b),b.on(\"gutterClick\",q),b.on(\"change\",n),b.on(\"viewportChange\",r),b.on(\"fold\",p),b.on(\"unfold\",p),b.on(\"swapDoc\",n))});var m=a.Pos});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/fold/indent-fold.js",
    "content": "'use strict';(function(a){\"object\"==typeof exports&&\"object\"==typeof module?a(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],a):a(CodeMirror)})(function(a){a.registerHelper(\"fold\",\"indent\",function(b,e){var g=b.getOption(\"tabSize\"),f=b.getLine(e.line);if(/\\S/.test(f)){for(var k=a.countColumn(f,null,g),c=null,d=e.line+1,l=b.lastLine();d<=l;++d){var h=b.getLine(d);if(a.countColumn(h,null,g)>k)c=d;else if(/\\S/.test(h))break}if(c)return{from:a.Pos(e.line,\nf.length),to:a.Pos(c,b.getLine(c).length)}}})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/fold/markdown-fold.js",
    "content": "'use strict';(function(a){\"object\"==typeof exports&&\"object\"==typeof module?a(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],a):a(CodeMirror)})(function(a){a.registerHelper(\"fold\",\"markdown\",function(c,d){function g(b){return(b=c.getTokenTypeAt(a.Pos(b,0)))&&/\\bheader\\b/.test(b)}function h(b,a,c){return(a=a&&a.match(/^#+/))&&g(b)?a[0].length:(a=c&&c.match(/^[=\\-]+\\s*$/))&&g(b+1)?\"=\"==c[0]?1:2:100}var k=c.getLine(d.line),e=c.getLine(d.line+1),\nl=h(d.line,k,e);if(100!==l){for(var m=c.lastLine(),b=d.line,f=c.getLine(b+2);b<m&&!(h(b+1,e,f)<=l);)++b,e=f,f=c.getLine(b+2);return{from:a.Pos(d.line,k.length),to:a.Pos(b,c.getLine(b).length)}}})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/fold/xml-fold.js",
    "content": "'use strict';(function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],e):e(CodeMirror)})(function(e){function l(a,b,d,c){this.line=b;this.ch=d;this.cm=a;this.text=a.getLine(b);this.min=c?Math.max(c.from,a.firstLine()):a.firstLine();this.max=c?Math.min(c.to-1,a.lastLine()):a.lastLine()}function m(a,b){return(a=a.cm.getTokenTypeAt(h(a.line,b)))&&/\\btag\\b/.test(a)}function t(a){if(!(a.line>=\na.max))return a.ch=0,a.text=a.cm.getLine(++a.line),!0}function u(a){if(!(a.line<=a.min))return a.text=a.cm.getLine(--a.line),a.ch=a.text.length,!0}function q(a){for(;;){var b=a.text.indexOf(\">\",a.ch);if(-1==b)if(t(a))continue;else break;if(m(a,b+1)){var d=a.text.lastIndexOf(\"/\",b),d=-1<d&&!/\\S/.test(a.text.slice(d+1,b));a.ch=b+1;return d?\"selfClose\":\"regular\"}a.ch=b+1}}function r(a){for(;;){var b=a.ch?a.text.lastIndexOf(\"<\",a.ch-1):-1;if(-1==b)if(u(a))continue;else break;if(m(a,b+1)){n.lastIndex=\nb;a.ch=b;var d=n.exec(a.text);if(d&&d.index==b)return d}else a.ch=b}}function v(a){for(;;){n.lastIndex=a.ch;var b=n.exec(a.text);if(!b)if(t(a))continue;else break;if(m(a,b.index+1))return a.ch=b.index+b[0].length,b;a.ch=b.index+1}}function p(a,b){for(var d=[];;){var c=v(a),g,f=a.line,k=a.ch-(c?c[0].length:0);if(!c||!(g=q(a)))break;if(\"selfClose\"!=g)if(c[1]){for(var e=d.length-1;0<=e;--e)if(d[e]==c[2]){d.length=e;break}if(0>e&&(!b||b==c[2]))return{tag:c[2],from:h(f,k),to:h(a.line,a.ch)}}else d.push(c[2])}}\nfunction w(a,b){for(var d=[];;){var c;a:for(c=a;;){var g=c.ch?c.text.lastIndexOf(\">\",c.ch-1):-1;if(-1==g)if(u(c))continue;else{c=void 0;break a}if(m(c,g+1)){var f=c.text.lastIndexOf(\"/\",g),f=-1<f&&!/\\S/.test(c.text.slice(f+1,g));c.ch=g+1;c=f?\"selfClose\":\"regular\";break a}else c.ch=g}if(!c)break;if(\"selfClose\"==c)r(a);else{c=a.line;g=a.ch;f=r(a);if(!f)break;if(f[1])d.push(f[2]);else{for(var e=d.length-1;0<=e;--e)if(d[e]==f[2]){d.length=e;break}if(0>e&&(!b||b==f[2]))return{tag:f[2],from:h(a.line,a.ch),\nto:h(c,g)}}}}}var h=e.Pos,n=/<(\\/?)([A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD][A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD-:.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*)/g;e.registerHelper(\"fold\",\"xml\",function(a,b){for(a=new l(a,b.line,0);;){var d=v(a),c;if(!d||a.line!=b.line||!(c=q(a)))break;\nif(!d[1]&&\"selfClose\"!=c)return b=h(a.line,a.ch),(a=p(a,d[2]))&&{from:b,to:a.from}}});e.findMatchingTag=function(a,b,d){var c=new l(a,b.line,b.ch,d);if(-1!=c.text.indexOf(\">\")||-1!=c.text.indexOf(\"<\")){var e=q(c),f=e&&h(c.line,c.ch),k=e&&r(c);if(e&&k&&!(0<(c.line-b.line||c.ch-b.ch))){b={from:h(c.line,c.ch),to:f,tag:k[2]};if(\"selfClose\"==e)return{open:b,close:null,at:\"open\"};if(k[1])return{open:w(c,k[2]),close:b,at:\"close\"};c=new l(a,f.line,f.ch,d);return{open:b,close:p(c,k[2]),at:\"open\"}}}};e.findEnclosingTag=\nfunction(a,b,d){for(var c=new l(a,b.line,b.ch,d);;){var e=w(c);if(!e)break;var f=new l(a,b.line,b.ch,d);if(f=p(f,e.tag))return{open:e,close:f}}};e.scanForClosingTag=function(a,b,d,c){a=new l(a,b.line,b.ch,c?{from:0,to:c}:null);return p(a,d)}});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/hint/anyword-hint.js",
    "content": "'use strict';(function(b){\"object\"==typeof exports&&\"object\"==typeof module?b(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],b):b(CodeMirror)})(function(b){var p=/[\\w$]+/;b.registerHelper(\"hint\",\"anyword\",function(g,a){for(var l=a&&a.word||p,q=a&&a.range||500,c=g.getCursor(),d=g.getLine(c.line),m=c.ch,e=m;e&&l.test(d.charAt(e-1));)--e;d=e!=m&&d.slice(e,m);a=a&&a.list||[];for(var n={},l=new RegExp(l.source,\"g\"),h=-1;1>=h;h+=2)for(var k=c.line,\nr=Math.min(Math.max(k+h*q,g.firstLine()),g.lastLine())+h;k!=r;k+=h)for(var t=g.getLine(k),f;f=l.exec(t);)k==c.line&&f[0]===d||d&&0!=f[0].lastIndexOf(d,0)||Object.prototype.hasOwnProperty.call(n,f[0])||(n[f[0]]=!0,a.push(f[0]));return{list:a,from:b.Pos(c.line,e),to:b.Pos(c.line,m)}})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/hint/css-hint.js",
    "content": "'use strict';(function(a){\"object\"==typeof exports&&\"object\"==typeof module?a(require(\"../../lib/codemirror\"),require(\"../../mode/css/css\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\",\"../../mode/css/css\"],a):a(CodeMirror)})(function(a){var m={link:1,visited:1,active:1,hover:1,focus:1,\"first-letter\":1,\"first-line\":1,\"first-child\":1,before:1,after:1,lang:1};a.registerHelper(\"hint\",\"css\",function(d){function f(b){for(var a in b)h&&0!=a.lastIndexOf(h,0)||k.push(a)}var e=d.getCursor(),\nc=d.getTokenAt(e),b=a.innerMode(d.getMode(),c.state);if(\"css\"==b.mode.name){if(\"keyword\"==c.type&&0==\"!important\".indexOf(c.string))return{list:[\"!important\"],from:a.Pos(e.line,c.start),to:a.Pos(e.line,c.end)};d=c.start;var l=e.ch,h=c.string.slice(0,l-d);/[^\\w$_-]/.test(h)&&(h=\"\",d=l=e.ch);var g=a.resolveMode(\"text/css\"),k=[],b=b.state.state;if(\"pseudo\"==b||\"variable-3\"==c.type)f(m);else if(\"block\"==b||\"maybeprop\"==b)f(g.propertyKeywords);else if(\"prop\"==b||\"parens\"==b||\"at\"==b||\"params\"==b)f(g.valueKeywords),\nf(g.colorKeywords);else if(\"media\"==b||\"media_parens\"==b)f(g.mediaTypes),f(g.mediaFeatures);if(k.length)return{list:k,from:a.Pos(e.line,d),to:a.Pos(e.line,l)}}})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/hint/html-hint.js",
    "content": "'use strict';(function(b){\"object\"==typeof exports&&\"object\"==typeof module?b(require(\"../../lib/codemirror\"),require(\"./xml-hint\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\",\"./xml-hint\"],b):b(CodeMirror)})(function(b){function n(a){for(var b in g)g.hasOwnProperty(b)&&(a.attrs[b]=g[b])}var d=\"ab aa af ak sq am ar an hy as av ae ay az bm ba eu be bn bh bi bs br bg my ca ch ce ny zh cv kw co cr hr cs da dv nl dz en eo et ee fo fj fi fr ff gl ka de el gn gu ht ha he hz hi ho hu ia id ie ga ig ik io is it iu ja jv kl kn kr ks kk km ki rw ky kv kg ko ku kj la lb lg li ln lo lt lu lv gv mk mg ms ml mt mi mr mh mn na nv nb nd ne ng nn no ii nr oc oj cu om or os pa pi fa pl ps pt qu rm rn ro ru sa sc sd se sm sg sr gd sn si sk sl so st es su sw ss sv ta te tg th ti bo tk tl tn to tr ts tt tw ty ug uk ur uz ve vi vo wa cy wo fy xh yi yo za zu\".split(\" \"),\nc=[\"_blank\",\"_self\",\"_top\",\"_parent\"],h=[\"ascii\",\"utf-8\",\"utf-16\",\"latin1\",\"latin1\"],k=[\"get\",\"post\",\"put\",\"delete\"],l=[\"application/x-www-form-urlencoded\",\"multipart/form-data\",\"text/plain\"],e=\"all;screen;print;embossed;braille;handheld;print;projection;screen;tty;tv;speech;3d-glasses;resolution [>][<][=] [X];device-aspect-ratio: X/Y;orientation:portrait;orientation:landscape;device-height: [X];device-width: [X]\".split(\";\"),a={attrs:{}},f={a:{attrs:{href:null,ping:null,type:null,media:e,target:c,\nhreflang:d}},abbr:a,acronym:a,address:a,applet:a,area:{attrs:{alt:null,coords:null,href:null,target:null,ping:null,media:e,hreflang:d,type:null,shape:[\"default\",\"rect\",\"circle\",\"poly\"]}},article:a,aside:a,audio:{attrs:{src:null,mediagroup:null,crossorigin:[\"anonymous\",\"use-credentials\"],preload:[\"none\",\"metadata\",\"auto\"],autoplay:[\"\",\"autoplay\"],loop:[\"\",\"loop\"],controls:[\"\",\"controls\"]}},b:a,base:{attrs:{href:null,target:c}},basefont:a,bdi:a,bdo:a,big:a,blockquote:{attrs:{cite:null}},body:a,br:a,\nbutton:{attrs:{form:null,formaction:null,name:null,value:null,autofocus:[\"\",\"autofocus\"],disabled:[\"\",\"autofocus\"],formenctype:l,formmethod:k,formnovalidate:[\"\",\"novalidate\"],formtarget:c,type:[\"submit\",\"reset\",\"button\"]}},canvas:{attrs:{width:null,height:null}},caption:a,center:a,cite:a,code:a,col:{attrs:{span:null}},colgroup:{attrs:{span:null}},command:{attrs:{type:[\"command\",\"checkbox\",\"radio\"],label:null,icon:null,radiogroup:null,command:null,title:null,disabled:[\"\",\"disabled\"],checked:[\"\",\"checked\"]}},\ndata:{attrs:{value:null}},datagrid:{attrs:{disabled:[\"\",\"disabled\"],multiple:[\"\",\"multiple\"]}},datalist:{attrs:{data:null}},dd:a,del:{attrs:{cite:null,datetime:null}},details:{attrs:{open:[\"\",\"open\"]}},dfn:a,dir:a,div:a,dl:a,dt:a,em:a,embed:{attrs:{src:null,type:null,width:null,height:null}},eventsource:{attrs:{src:null}},fieldset:{attrs:{disabled:[\"\",\"disabled\"],form:null,name:null}},figcaption:a,figure:a,font:a,footer:a,form:{attrs:{action:null,name:null,\"accept-charset\":h,autocomplete:[\"on\",\"off\"],\nenctype:l,method:k,novalidate:[\"\",\"novalidate\"],target:c}},frame:a,frameset:a,h1:a,h2:a,h3:a,h4:a,h5:a,h6:a,head:{attrs:{},children:\"title base link style meta script noscript command\".split(\" \")},header:a,hgroup:a,hr:a,html:{attrs:{manifest:null},children:[\"head\",\"body\"]},i:a,iframe:{attrs:{src:null,srcdoc:null,name:null,width:null,height:null,sandbox:[\"allow-top-navigation\",\"allow-same-origin\",\"allow-forms\",\"allow-scripts\"],seamless:[\"\",\"seamless\"]}},img:{attrs:{alt:null,src:null,ismap:null,usemap:null,\nwidth:null,height:null,crossorigin:[\"anonymous\",\"use-credentials\"]}},input:{attrs:{alt:null,dirname:null,form:null,formaction:null,height:null,list:null,max:null,maxlength:null,min:null,name:null,pattern:null,placeholder:null,size:null,src:null,step:null,value:null,width:null,accept:[\"audio/*\",\"video/*\",\"image/*\"],autocomplete:[\"on\",\"off\"],autofocus:[\"\",\"autofocus\"],checked:[\"\",\"checked\"],disabled:[\"\",\"disabled\"],formenctype:l,formmethod:k,formnovalidate:[\"\",\"novalidate\"],formtarget:c,multiple:[\"\",\n\"multiple\"],readonly:[\"\",\"readonly\"],required:[\"\",\"required\"],type:\"hidden text search tel url email password datetime date month week time datetime-local number range color checkbox radio file submit image reset button\".split(\" \")}},ins:{attrs:{cite:null,datetime:null}},kbd:a,keygen:{attrs:{challenge:null,form:null,name:null,autofocus:[\"\",\"autofocus\"],disabled:[\"\",\"disabled\"],keytype:[\"RSA\"]}},label:{attrs:{\"for\":null,form:null}},legend:a,li:{attrs:{value:null}},link:{attrs:{href:null,type:null,\nhreflang:d,media:e,sizes:[\"all\",\"16x16\",\"16x16 32x32\",\"16x16 32x32 64x64\"]}},map:{attrs:{name:null}},mark:a,menu:{attrs:{label:null,type:[\"list\",\"context\",\"toolbar\"]}},meta:{attrs:{content:null,charset:h,name:\"viewport application-name author description generator keywords\".split(\" \"),\"http-equiv\":[\"content-language\",\"content-type\",\"default-style\",\"refresh\"]}},meter:{attrs:{value:null,min:null,low:null,high:null,max:null,optimum:null}},nav:a,noframes:a,noscript:a,object:{attrs:{data:null,type:null,\nname:null,usemap:null,form:null,width:null,height:null,typemustmatch:[\"\",\"typemustmatch\"]}},ol:{attrs:{reversed:[\"\",\"reversed\"],start:null,type:[\"1\",\"a\",\"A\",\"i\",\"I\"]}},optgroup:{attrs:{disabled:[\"\",\"disabled\"],label:null}},option:{attrs:{disabled:[\"\",\"disabled\"],label:null,selected:[\"\",\"selected\"],value:null}},output:{attrs:{\"for\":null,form:null,name:null}},p:a,param:{attrs:{name:null,value:null}},pre:a,progress:{attrs:{value:null,max:null}},q:{attrs:{cite:null}},rp:a,rt:a,ruby:a,s:a,samp:a,script:{attrs:{type:[\"text/javascript\"],\nsrc:null,async:[\"\",\"async\"],defer:[\"\",\"defer\"],charset:h}},section:a,select:{attrs:{form:null,name:null,size:null,autofocus:[\"\",\"autofocus\"],disabled:[\"\",\"disabled\"],multiple:[\"\",\"multiple\"]}},small:a,source:{attrs:{src:null,type:null,media:null}},span:a,strike:a,strong:a,style:{attrs:{type:[\"text/css\"],media:e,scoped:null}},sub:a,summary:a,sup:a,table:a,tbody:a,td:{attrs:{colspan:null,rowspan:null,headers:null}},textarea:{attrs:{dirname:null,form:null,maxlength:null,name:null,placeholder:null,rows:null,\ncols:null,autofocus:[\"\",\"autofocus\"],disabled:[\"\",\"disabled\"],readonly:[\"\",\"readonly\"],required:[\"\",\"required\"],wrap:[\"soft\",\"hard\"]}},tfoot:a,th:{attrs:{colspan:null,rowspan:null,headers:null,scope:[\"row\",\"col\",\"rowgroup\",\"colgroup\"]}},thead:a,time:{attrs:{datetime:null}},title:a,tr:a,track:{attrs:{src:null,label:null,\"default\":null,kind:[\"subtitles\",\"captions\",\"descriptions\",\"chapters\",\"metadata\"],srclang:d}},tt:a,u:a,ul:a,\"var\":a,video:{attrs:{src:null,poster:null,width:null,height:null,crossorigin:[\"anonymous\",\n\"use-credentials\"],preload:[\"auto\",\"metadata\",\"none\"],autoplay:[\"\",\"autoplay\"],mediagroup:[\"movie\"],muted:[\"\",\"muted\"],controls:[\"\",\"controls\"]}},wbr:a},g={accesskey:\"abcdefghijklmnopqrstuvwxyz0123456789\".split(\"\"),\"class\":null,contenteditable:[\"true\",\"false\"],contextmenu:null,dir:[\"ltr\",\"rtl\",\"auto\"],draggable:[\"true\",\"false\",\"auto\"],dropzone:[\"copy\",\"move\",\"link\",\"string:\",\"file:\"],hidden:[\"hidden\"],id:null,inert:[\"inert\"],itemid:null,itemprop:null,itemref:null,itemscope:[\"itemscope\"],itemtype:null,\nlang:[\"en\",\"es\"],spellcheck:[\"true\",\"false\"],style:null,tabindex:\"123456789\".split(\"\"),title:null,translate:[\"yes\",\"no\"],onclick:null,rel:\"stylesheet alternate author bookmark help license next nofollow noreferrer prefetch prev search tag\".split(\" \")};n(a);for(var m in f)f.hasOwnProperty(m)&&f[m]!=a&&n(f[m]);b.htmlSchema=f;b.registerHelper(\"hint\",\"html\",function(a,c){var d={schemaInfo:f};if(c)for(var e in c)d[e]=c[e];return b.hint.xml(a,d)})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/hint/javascript-hint.js",
    "content": "'use strict';(function(h){\"object\"==typeof exports&&\"object\"==typeof module?h(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],h):h(CodeMirror)})(function(h){function m(a,b){for(var k=0,e=a.length;k<e;++k)b(a[k])}function q(a,b,k,e){var c=a.getCursor(),d=k(a,c);if(!/\\b(?:string|comment)\\b/.test(d.type)){d.state=h.innerMode(a.getMode(),d.state).state;/^[\\w$_]*$/.test(d.string)?d.end>c.ch&&(d.end=c.ch,d.string=d.string.slice(0,c.ch-d.start)):d={start:c.ch,\nend:c.ch,string:\"\",state:d.state,type:\".\"==d.string?\"property\":null};for(var f=d;\"property\"==f.type;){f=k(a,n(c.line,f.start));if(\".\"!=f.string)return;f=k(a,n(c.line,f.start));if(!p)var p=[];p.push(f)}return{list:r(d,p,b,e),from:n(c.line,d.start),to:n(c.line,d.end)}}}function t(a,b){a=a.getTokenAt(b);b.ch==a.start+1&&\".\"==a.string.charAt(0)?(a.end=a.start,a.string=\".\",a.type=\"property\"):/^\\.[\\w$_]*$/.test(a.string)&&(a.type=\"property\",a.start++,a.string=a.string.replace(/\\./,\"\"));return a}function r(a,\nb,k,e){function c(a){var b;if(b=0==a.lastIndexOf(h,0)){a:if(Array.prototype.indexOf)b=-1!=f.indexOf(a);else{for(b=f.length;b--;)if(f[b]===a){b=!0;break a}b=!1}b=!b}b&&f.push(a)}function d(a){\"string\"==typeof a?m(u,c):a instanceof Array?m(v,c):a instanceof Function&&m(w,c);if(Object.getOwnPropertyNames&&Object.getPrototypeOf)for(;a;a=Object.getPrototypeOf(a))Object.getOwnPropertyNames(a).forEach(c);else for(var b in a)c(b)}var f=[],h=a.string,l=e&&e.globalScope||window;if(b&&b.length){a=b.pop();var g;\na.type&&0===a.type.indexOf(\"variable\")?(e&&e.additionalContext&&(g=e.additionalContext[a.string]),e&&!1===e.useGlobalScope||(g=g||l[a.string])):\"string\"==a.type?g=\"\":\"atom\"==a.type?g=1:\"function\"==a.type&&(null==l.jQuery||\"$\"!=a.string&&\"jQuery\"!=a.string||\"function\"!=typeof l.jQuery?null!=l._&&\"_\"==a.string&&\"function\"==typeof l._&&(g=l._()):g=l.jQuery());for(;null!=g&&b.length;)g=g[b.pop().string];null!=g&&d(g)}else{for(b=a.state.localVars;b;b=b.next)c(b.name);for(b=a.state.globalVars;b;b=b.next)c(b.name);\ne&&!1===e.useGlobalScope||d(l);m(k,c)}return f}var n=h.Pos;h.registerHelper(\"hint\",\"javascript\",function(a,b){return q(a,x,function(a,b){return a.getTokenAt(b)},b)});h.registerHelper(\"hint\",\"coffeescript\",function(a,b){return q(a,y,t,b)});var u=\"charAt charCodeAt indexOf lastIndexOf substring substr slice trim trimLeft trimRight toUpperCase toLowerCase split concat match replace search\".split(\" \"),v=\"length concat join splice push pop shift unshift slice reverse sort indexOf lastIndexOf every some filter forEach map reduce reduceRight \".split(\" \"),\nw=[\"prototype\",\"apply\",\"call\",\"bind\"],x=\"break case catch continue debugger default delete do else false finally for function if in instanceof new null return switch throw true try typeof var void while with\".split(\" \"),y=\"and break catch class continue delete do else extends false finally for if in instanceof isnt new no not null of off on or return switch then throw true try typeof until void while with yes\".split(\" \")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/hint/show-hint.css",
    "content": ".CodeMirror-hints{position:absolute;z-index:10;overflow:hidden;list-style:none;margin:0;padding:2px;-webkit-box-shadow:2px 3px 5px rgba(0,0,0,.2);-moz-box-shadow:2px 3px 5px rgba(0,0,0,.2);box-shadow:2px 3px 5px rgba(0,0,0,.2);border-radius:3px;border:1px solid silver;background:#fff;font-size:90%;font-family:monospace;max-height:20em;overflow-y:auto}.CodeMirror-hint{margin:0;padding:0 4px;border-radius:2px;white-space:pre;color:#000;cursor:pointer}li.CodeMirror-hint-active{background:#08f;color:#fff}"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/hint/show-hint.js",
    "content": "'use strict';(function(f){\"object\"==typeof exports&&\"object\"==typeof module?f(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],f):f(CodeMirror)})(function(f){function n(a,b){this.cm=a;this.options=b;this.widget=null;this.tick=this.debounce=0;this.startPos=this.cm.getCursor(\"start\");this.startLen=this.cm.getLine(this.startPos.line).length-this.cm.getSelection().length;var c=this;a.on(\"cursorActivity\",this.activityFunc=function(){c.cursorActivity()})}\nfunction y(a,b){function c(a,d){var c;c=\"string\"!=typeof d?function(a){return d(a,b)}:e.hasOwnProperty(d)?e[d]:d;f[a]=c}var e={Up:function(){b.moveFocus(-1)},Down:function(){b.moveFocus(1)},PageUp:function(){b.moveFocus(-b.menuSize()+1,!0)},PageDown:function(){b.moveFocus(b.menuSize()-1,!0)},Home:function(){b.setFocus(0)},End:function(){b.setFocus(b.length-1)},Enter:b.pick,Tab:b.pick,Esc:b.close},d=a.options.customKeys,f=d?{}:e;if(d)for(var g in d)d.hasOwnProperty(g)&&c(g,d[g]);if(a=a.options.extraKeys)for(g in a)a.hasOwnProperty(g)&&\nc(g,a[g]);return f}function w(a,b){for(;b&&b!=a;){if(\"LI\"===b.nodeName.toUpperCase()&&b.parentNode==a)return b;b=b.parentNode}}function q(a,b){this.completion=a;this.data=b;this.picked=!1;var c=this,e=a.cm,d=this.hints=document.createElement(\"ul\");d.className=\"CodeMirror-hints\";this.selectedHint=b.selectedHint||0;for(var m=b.list,g=0;g<m.length;++g){var l=d.appendChild(document.createElement(\"li\")),h=m[g],p=\"CodeMirror-hint\"+(g!=this.selectedHint?\"\":\" CodeMirror-hint-active\");null!=h.className&&(p=\nh.className+\" \"+p);l.className=p;h.render?h.render(l,b,h):l.appendChild(document.createTextNode(h.displayText||(\"string\"==typeof h?h:h.text)));l.hintId=g}var g=e.cursorCoords(a.options.alignWithWord?b.from:null),u=g.left,v=g.bottom,n=!0;d.style.left=u+\"px\";d.style.top=v+\"px\";var l=window.innerWidth||Math.max(document.body.offsetWidth,document.documentElement.offsetWidth),k=window.innerHeight||Math.max(document.body.offsetHeight,document.documentElement.offsetHeight);(a.options.container||document.body).appendChild(d);\nvar h=d.getBoundingClientRect(),r=h.bottom-k,p=d.scrollHeight>d.clientHeight+1,q=e.getScrollInfo();0<r&&(r=h.bottom-h.top,0<g.top-(g.bottom-h.top)-r?(d.style.top=(v=g.top-r)+\"px\",n=!1):r>k&&(d.style.height=k-5+\"px\",d.style.top=(v=g.bottom-h.top)+\"px\",k=e.getCursor(),b.from.ch!=k.ch&&(g=e.cursorCoords(k),d.style.left=(u=g.left)+\"px\",h=d.getBoundingClientRect())));k=h.right-l;0<k&&(h.right-h.left>l&&(d.style.width=l-5+\"px\",k-=h.right-h.left-l),d.style.left=(u=g.left-k)+\"px\");if(p)for(g=d.firstChild;g;g=\ng.nextSibling)g.style.paddingRight=e.display.nativeBarWidth+\"px\";e.addKeyMap(this.keyMap=y(a,{moveFocus:function(a,b){c.changeActive(c.selectedHint+a,b)},setFocus:function(a){c.changeActive(a)},menuSize:function(){return c.screenAmount()},length:m.length,close:function(){a.close()},pick:function(){c.pick()},data:b}));if(a.options.closeOnUnfocus){var t;e.on(\"blur\",this.onBlur=function(){t=setTimeout(function(){a.close()},100)});e.on(\"focus\",this.onFocus=function(){clearTimeout(t)})}e.on(\"scroll\",this.onScroll=\nfunction(){var b=e.getScrollInfo(),c=e.getWrapperElement().getBoundingClientRect(),g=v+q.top-b.top,f=g-(window.pageYOffset||(document.documentElement||document.body).scrollTop);n||(f+=d.offsetHeight);if(f<=c.top||f>=c.bottom)return a.close();d.style.top=g+\"px\";d.style.left=u+q.left-b.left+\"px\"});f.on(d,\"dblclick\",function(a){(a=w(d,a.target||a.srcElement))&&null!=a.hintId&&(c.changeActive(a.hintId),c.pick())});f.on(d,\"click\",function(b){(b=w(d,b.target||b.srcElement))&&null!=b.hintId&&(c.changeActive(b.hintId),\na.options.completeOnSingleClick&&c.pick())});f.on(d,\"mousedown\",function(){setTimeout(function(){e.focus()},20)});f.signal(b,\"select\",m[0],d.firstChild);return!0}function z(a,b){if(!a.somethingSelected())return b;a=[];for(var c=0;c<b.length;c++)b[c].supportsSelection&&a.push(b[c]);return a}function t(a,b,c,e){a.async?a(b,e,c):(a=a(b,c))&&a.then?a.then(e):e(a)}f.showHint=function(a,b,c){if(!b)return a.showHint(c);c&&c.async&&(b.async=!0);b={hint:b};if(c)for(var e in c)b[e]=c[e];return a.showHint(b)};\nf.defineExtension(\"showHint\",function(a){var b=this.getCursor(\"start\"),c=this.options.hintOptions,e={},d;for(d in x)e[d]=x[d];if(c)for(d in c)void 0!==c[d]&&(e[d]=c[d]);if(a)for(d in a)void 0!==a[d]&&(e[d]=a[d]);e.hint.resolve&&(e.hint=e.hint.resolve(this,b));a=e;b=this.listSelections();if(!(1<b.length)){if(this.somethingSelected()){if(!a.hint.supportsSelection)return;for(d=0;d<b.length;d++)if(b[d].head.line!=b[d].anchor.line)return}this.state.completionActive&&this.state.completionActive.close();\nb=this.state.completionActive=new n(this,a);b.options.hint&&(f.signal(this,\"startCompletion\",this),b.update(!0))}});var A=window.requestAnimationFrame||function(a){return setTimeout(a,1E3/60)},B=window.cancelAnimationFrame||clearTimeout;n.prototype={close:function(){this.active()&&(this.tick=this.cm.state.completionActive=null,this.cm.off(\"cursorActivity\",this.activityFunc),this.widget&&this.data&&f.signal(this.data,\"close\"),this.widget&&this.widget.close(),f.signal(this.cm,\"endCompletion\",this.cm))},\nactive:function(){return this.cm.state.completionActive==this},pick:function(a,b){b=a.list[b];b.hint?b.hint(this.cm,a,b):this.cm.replaceRange(\"string\"==typeof b?b:b.text,b.from||a.from,b.to||a.to,\"complete\");f.signal(a,\"pick\",b);this.close()},cursorActivity:function(){this.debounce&&(B(this.debounce),this.debounce=0);var a=this.cm.getCursor(),b=this.cm.getLine(a.line);if(a.line!=this.startPos.line||b.length-a.ch!=this.startLen-this.startPos.ch||a.ch<this.startPos.ch||this.cm.somethingSelected()||\na.ch&&this.options.closeCharacters.test(b.charAt(a.ch-1)))this.close();else{var c=this;this.debounce=A(function(){c.update()});this.widget&&this.widget.disable()}},update:function(a){if(null!=this.tick){var b=this,c=++this.tick;t(this.options.hint,this.cm,this.options,function(e){b.tick==c&&b.finishUpdate(e,a)})}},finishUpdate:function(a,b){this.data&&f.signal(this.data,\"update\");b=this.widget&&this.widget.picked||b&&this.options.completeSingle;this.widget&&this.widget.close();var c;if(c=a&&this.data)c=\nthis.data,c=0<f.cmpPos(a.from,c.from)&&c.to.ch-c.from.ch!=a.to.ch-a.from.ch;c||(this.data=a)&&a.list.length&&(b&&1==a.list.length?this.pick(a,0):(this.widget=new q(this,a),f.signal(a,\"shown\")))}};q.prototype={close:function(){if(this.completion.widget==this){this.completion.widget=null;this.hints.parentNode.removeChild(this.hints);this.completion.cm.removeKeyMap(this.keyMap);var a=this.completion.cm;this.completion.options.closeOnUnfocus&&(a.off(\"blur\",this.onBlur),a.off(\"focus\",this.onFocus));a.off(\"scroll\",\nthis.onScroll)}},disable:function(){this.completion.cm.removeKeyMap(this.keyMap);var a=this;this.keyMap={Enter:function(){a.picked=!0}};this.completion.cm.addKeyMap(this.keyMap)},pick:function(){this.completion.pick(this.data,this.selectedHint)},changeActive:function(a,b){a>=this.data.list.length?a=b?this.data.list.length-1:0:0>a&&(a=b?0:this.data.list.length-1);this.selectedHint!=a&&(b=this.hints.childNodes[this.selectedHint],b.className=b.className.replace(\" CodeMirror-hint-active\",\"\"),b=this.hints.childNodes[this.selectedHint=\na],b.className+=\" CodeMirror-hint-active\",b.offsetTop<this.hints.scrollTop?this.hints.scrollTop=b.offsetTop-3:b.offsetTop+b.offsetHeight>this.hints.scrollTop+this.hints.clientHeight&&(this.hints.scrollTop=b.offsetTop+b.offsetHeight-this.hints.clientHeight+3),f.signal(this.data,\"select\",this.data.list[this.selectedHint],b))},screenAmount:function(){return Math.floor(this.hints.clientHeight/this.hints.firstChild.offsetHeight)||1}};f.registerHelper(\"hint\",\"auto\",{resolve:function(a,b){var c=a.getHelpers(b,\n\"hint\"),e;return c.length?(a=function(a,b,e){function d(c){if(c==f.length)return b(null);t(f[c],a,e,function(a){a&&0<a.list.length?b(a):d(c+1)})}var f=z(a,c);d(0)},a.async=!0,a.supportsSelection=!0,a):(e=a.getHelper(a.getCursor(),\"hintWords\"))?function(a){return f.hint.fromList(a,{words:e})}:f.hint.anyword?function(a,b){return f.hint.anyword(a,b)}:function(){}}});f.registerHelper(\"hint\",\"fromList\",function(a,b){var c=a.getCursor(),e=a.getTokenAt(c);a=f.Pos(c.line,e.end);if(e.string&&/\\w/.test(e.string[e.string.length-\n1]))var d=e.string,c=f.Pos(c.line,e.start);else d=\"\",c=a;for(var e=[],m=0;m<b.words.length;m++){var g=b.words[m];g.slice(0,d.length)==d&&e.push(g)}if(e.length)return{list:e,from:c,to:a}});f.commands.autocomplete=f.showHint;var x={hint:f.hint.auto,completeSingle:!0,alignWithWord:!0,closeCharacters:/[\\s()\\[\\]{};:>,]/,closeOnUnfocus:!0,completeOnSingleClick:!0,container:null,customKeys:null,extraKeys:null};f.defineOption(\"hintOptions\",null)});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/hint/sql-hint.js",
    "content": "'use strict';(function(g){\"object\"==typeof exports&&\"object\"==typeof module?g(require(\"../../lib/codemirror\"),require(\"../../mode/sql/sql\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\",\"../../mode/sql/sql\"],g):g(CodeMirror)})(function(g){function r(a){return\"[object Array]\"==Object.prototype.toString.call(a)}function D(a){a=a.doc.modeOption;\"sql\"===a&&(a=\"text/x-sql\");return g.resolveMode(a).keywords}function q(a){return\"string\"==typeof a?a:a.text}function v(a,b){r(b)&&(b=\n{columns:b});b.text||(b.text=a);return b}function E(a){var b={};if(r(a))for(var c=a.length-1;0<=c;c--){var d=a[c];b[q(d).toUpperCase()]=v(q(d),d)}else if(a)for(c in a)b[c.toUpperCase()]=v(c,a[c]);return b}function w(a){var b={},c;for(c in a)a.hasOwnProperty(c)&&(b[c]=a[c]);return b}function x(a,b){var c=a.length;b=q(b).substr(0,c);return a.toUpperCase()===b.toUpperCase()}function p(a,b,c,d){if(r(c))for(var e=0;e<c.length;e++)x(b,c[e])&&a.push(d(c[e]));else for(e in c)if(c.hasOwnProperty(e)){var f=\nc[e],f=f&&!0!==f?f.displayText?{text:f.text,displayText:f.displayText}:f.text:e;x(b,f)&&a.push(d(f))}}function F(a){\".\"==a.charAt(0)&&(a=a.substr(1));return a.replace(/`/g,\"\")}function t(a){for(var b=q(a).split(\".\"),c=0;c<b.length;c++)b[c]=\"`\"+b[c]+\"`\";b=b.join(\".\");if(\"string\"==typeof a)return b;a=w(a);a.text=b;return a}function G(a,b,c,d){for(var e=!1,f=[],y=b.start,k=!0;k;)k=\".\"==b.string.charAt(0),e=e||\"`\"==b.string.charAt(0),y=b.start,f.unshift(F(b.string)),b=d.getTokenAt(m(a.line,b.start)),\n\".\"==b.string&&(k=!0,b=d.getTokenAt(m(a.line,b.start)));a=f.join(\".\");p(c,a,n,function(a){return e?t(a):a});p(c,a,h,function(a){return e?t(a):a});a=f.pop();var l=f.join(\".\"),z=!1,g=l;n[l.toUpperCase()]||(f=l,l=A(l,d),l!==f&&(z=!0));(d=n[l.toUpperCase()])&&d.columns&&(d=d.columns);d&&p(c,a,d,function(a){var b=l;1==z&&(b=g);\"string\"==typeof a?a=b+\".\"+a:(a=w(a),a.text=b+\".\"+a.text);return e?t(a):a});return y}function H(a,b){if(a){var c=/[,;]/g;a=a.split(\" \");for(var d=0;d<a.length;d++)b(a[d]?a[d].replace(c,\n\"\"):\"\")}}function A(a,b){var c=b.doc,d=c.getValue(),e=a.toUpperCase(),f=\"\",g=\"\";a=[];for(var k=m(0,0),l=m(b.lastLine(),b.getLineHandle(b.lastLine()).length),h=d.indexOf(u.QUERY_DIV);-1!=h;)a.push(c.posFromIndex(h)),h=d.indexOf(u.QUERY_DIV,h+1);a.unshift(m(0,0));a.push(m(b.lastLine(),b.getLineHandle(b.lastLine()).text.length));d=null;h=b.getCursor();for(b=0;b<a.length;b++){if((null==d||0<B(h,d))&&0>=B(h,a[b])){k=d;l=a[b];break}d=a[b]}c=c.getRange(k,l,!1);for(b=0;b<c.length&&(H(c[b],function(a){var b=\na.toUpperCase();b===e&&n[f.toUpperCase()]&&(g=f);b!==u.ALIAS_KEYWORD&&(f=a)}),!g);b++);return g}var n,h,C,u={QUERY_DIV:\";\",ALIAS_KEYWORD:\"AS\"},m=g.Pos,B=g.cmpPos;g.registerHelper(\"hint\",\"sql\",function(a,b){n=E(b&&b.tables);var c=b&&b.defaultTable;b=b&&b.disableKeywords;h=c&&n[c.toUpperCase()];C=D(a);c&&!h&&(h=A(c,a));h=h||[];h.columns&&(h=h.columns);var c=a.getCursor(),d=[],e=a.getTokenAt(c),f,g,k;e.end>c.ch&&(e.end=c.ch,e.string=e.string.slice(0,c.ch-e.start));e.string.match(/^[.`\\w@]\\w*$/)?(k=e.string,\nf=e.start,g=e.end):(f=g=c.ch,k=\"\");\".\"==k.charAt(0)||\"`\"==k.charAt(0)?f=G(c,e,d,a):(p(d,k,n,function(a){return a}),p(d,k,h,function(a){return a}),b||p(d,k,C,function(a){return a.toUpperCase()}));return{list:d,from:m(c.line,f),to:m(c.line,g)}})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/hint/xml-hint.js",
    "content": "'use strict';(function(p){\"object\"==typeof exports&&\"object\"==typeof module?p(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],p):p(CodeMirror)})(function(p){var r=p.Pos;p.registerHelper(\"hint\",\"xml\",function(b,d){var c=d&&d.schemaInfo,l=d&&d.quoteChar||'\"';if(c){d=b.getCursor();var a=b.getTokenAt(d);a.end>d.ch&&(a.end=d.ch,a.string=a.string.slice(0,d.ch-a.start));var k=p.innerMode(b.getMode(),a.state);if(\"xml\"==k.mode.name){var q=[],m=!1,g,t=\n/\\btag\\b/.test(a.type)&&!/>$/.test(a.string),w=t&&/^\\w/.test(a.string),u;if(w){var e=b.getLine(d.line).slice(Math.max(0,a.start-2),a.start);(e=/<\\/$/.test(e)?\"close\":/<$/.test(e)?\"open\":null)&&(u=a.start-(\"close\"==e?2:1))}else t&&\"<\"==a.string?e=\"open\":t&&\"</\"==a.string&&(e=\"close\");if(!t&&!k.state.tagName||e){w&&(g=a.string);var m=e,h=k.state.context,k=h&&c[h.tagName];if((l=h?k&&k.children:c[\"!top\"])&&\"close\"!=e)for(b=0;b<l.length;++b)g&&0!=l[b].lastIndexOf(g,0)||q.push(\"<\"+l[b]);else if(\"close\"!=\ne)for(var f in c)!c.hasOwnProperty(f)||\"!top\"==f||\"!attrs\"==f||g&&0!=f.lastIndexOf(g,0)||q.push(\"<\"+f);h&&(!g||\"close\"==e&&0==h.tagName.lastIndexOf(g,0))&&q.push(\"</\"+h.tagName+\">\")}else{f=(k=c[k.state.tagName])&&k.attrs;c=c[\"!attrs\"];if(!f&&!c)return;if(!f)f=c;else if(c){var e={},n;for(n in c)c.hasOwnProperty(n)&&(e[n]=c[n]);for(n in f)f.hasOwnProperty(n)&&(e[n]=f[n]);f=e}if(\"string\"==a.type||\"=\"==a.string){e=b.getRange(r(d.line,Math.max(0,d.ch-60)),r(d.line,\"string\"==a.type?a.start:a.end));c=e.match(/([^\\s\\u00a0=<>\\\"\\']+)=$/);\nif(!c||!f.hasOwnProperty(c[1])||!(h=f[c[1]]))return;\"function\"==typeof h&&(h=h.call(this,b));\"string\"==a.type&&(g=a.string,m=0,/['\"]/.test(a.string.charAt(0))&&(l=a.string.charAt(0),g=a.string.slice(1),m++),b=a.string.length,/['\"]/.test(a.string.charAt(b-1))&&(l=a.string.charAt(b-1),g=a.string.substr(m,b-2)),m=!0);for(b=0;b<h.length;++b)g&&0!=h[b].lastIndexOf(g,0)||q.push(l+h[b]+l)}else{\"attribute\"==a.type&&(g=a.string,m=!0);for(var v in f)!f.hasOwnProperty(v)||g&&0!=v.lastIndexOf(g,0)||q.push(v)}}return{list:q,\nfrom:m?r(d.line,null==u?a.start:u):d,to:m?r(d.line,a.end):d}}}})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/lint/coffeescript-lint.js",
    "content": "'use strict';(function(a){\"object\"==typeof exports&&\"object\"==typeof module?a(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],a):a(CodeMirror)})(function(a){a.registerHelper(\"lint\",\"coffeescript\",function(b){var d=[];try{var f=coffeelint.lint(b);for(b=0;b<f.length;b++){var e=f[b],g=e.lineNumber;d.push({from:a.Pos(g-1,0),to:a.Pos(g,0),severity:e.level,message:e.message})}}catch(c){d.push({from:a.Pos(c.location.first_line,0),to:a.Pos(c.location.last_line,\nc.location.last_column),severity:\"error\",message:c.message})}return d})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/lint/css-lint.js",
    "content": "'use strict';(function(a){\"object\"==typeof exports&&\"object\"==typeof module?a(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],a):a(CodeMirror)})(function(a){a.registerHelper(\"lint\",\"css\",function(c){var d=[];if(!window.CSSLint)return d;c=CSSLint.verify(c).messages;for(var b,e=0;e<c.length;e++){b=c[e];var f=b.line-1,g=b.col;d.push({from:a.Pos(b.line-1,b.col-1),to:a.Pos(f,g),message:b.message,severity:b.type})}return d})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/lint/html-lint.js",
    "content": "'use strict';(function(a){\"object\"==typeof exports&&\"object\"==typeof module?a(require(\"../../lib/codemirror\"),require(\"htmlhint\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\",\"htmlhint\"],a):a(CodeMirror)})(function(a){var f={\"tagname-lowercase\":!0,\"attr-lowercase\":!0,\"attr-value-double-quotes\":!0,\"doctype-first\":!1,\"tag-pair\":!0,\"spec-char-escape\":!0,\"id-unique\":!0,\"src-not-empty\":!0,\"attr-no-duplication\":!0};a.registerHelper(\"lint\",\"html\",function(d,b){var e=[];if(!window.HTMLHint)return e;\nd=HTMLHint.verify(d,b&&b.rules||f);for(b=0;b<d.length;b++){var c=d[b],g=c.line-1,h=c.col;e.push({from:a.Pos(c.line-1,c.col-1),to:a.Pos(g,h),message:c.message,severity:c.type})}return e})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/lint/javascript-lint.js",
    "content": "'use strict';(function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],e):e(CodeMirror)})(function(e){function p(b){m(b,q,\"warning\",!0);m(b,r,\"error\");var c;a:{c=b.description;for(var g=0;g<n.length;g++)if(-1!==c.indexOf(n[g])){c=!0;break a}c=!1}return c?null:b}function m(b,c,g,a){var h,d,f;h=b.description;for(var e=0;e<c.length;e++){d=c[e];f=\"string\"===typeof d?d:d[0];d=\"string\"===typeof d?\nnull:d[1];f=-1!==h.indexOf(f);if(a||f)b.severity=g;f&&d&&(b.description=d)}}function t(b,c){for(var g=0;g<b.length;g++){var a=b[g];if(a){var h;h=[];if(a.evidence){var d=h[a.line];if(!d){var f=a.evidence,d=[];Array.prototype.forEach.call(f,function(a,b){\"\\t\"===a&&d.push(b+1)});h[a.line]=d}if(0<d.length){var k=a.character;d.forEach(function(a){k>a&&--k});a.character=k}}var f=a.character-1,l=f+1;a.evidence&&(h=a.evidence.substring(f).search(/.\\b/),-1<h&&(l+=h));a.description=a.reason;a.start=a.character;\na.end=l;(a=p(a))&&c.push({message:a.description,severity:a.severity,from:e.Pos(a.line-1,f),to:e.Pos(a.line-1,l)})}}}var n=[\"Dangerous comment\"],q=[[\"Expected '{'\",\"Statement body should be inside '{ }' braces.\"]],r=\"Missing semicolon;Extra comma;Missing property name;Unmatched ; and instead saw; is not defined;Unclosed string;Stopping, unable to continue\".split(\";\");e.registerHelper(\"lint\",\"javascript\",function(b,c){if(!window.JSHINT)return[];JSHINT(b,c,c.globals);b=JSHINT.data().errors;c=[];b&&t(b,\nc);return c})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/lint/json-lint.js",
    "content": "'use strict';(function(a){\"object\"==typeof exports&&\"object\"==typeof module?a(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],a):a(CodeMirror)})(function(a){a.registerHelper(\"lint\",\"json\",function(e){var c=[];jsonlint.parseError=function(d,b){b=b.loc;c.push({from:a.Pos(b.first_line-1,b.first_column),to:a.Pos(b.last_line-1,b.last_column),message:d})};try{jsonlint.parse(e)}catch(d){}return c})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/lint/lint.css",
    "content": ".CodeMirror-lint-markers{width:16px}.CodeMirror-lint-tooltip{background-color:#ffd;border:1px solid #000;border-radius:4px;color:#000;font-family:monospace;font-size:10pt;overflow:hidden;padding:2px 5px;position:fixed;white-space:pre;white-space:pre-wrap;z-index:100;max-width:600px;opacity:0;transition:opacity .4s;-moz-transition:opacity .4s;-webkit-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s}.CodeMirror-lint-mark-error,.CodeMirror-lint-mark-warning{background-position:left bottom;background-repeat:repeat-x}.CodeMirror-lint-mark-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJDw4cOCW1/KIAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAHElEQVQI12NggIL/DAz/GdA5/xkY/qPKMDAwAADLZwf5rvm+LQAAAABJRU5ErkJggg==)}.CodeMirror-lint-mark-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9sJFhQXEbhTg7YAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAMklEQVQI12NkgIIvJ3QXMjAwdDN+OaEbysDA4MPAwNDNwMCwiOHLCd1zX07o6kBVGQEAKBANtobskNMAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-error,.CodeMirror-lint-marker-warning{background-position:center center;background-repeat:no-repeat;cursor:pointer;display:inline-block;height:16px;width:16px;vertical-align:middle;position:relative}.CodeMirror-lint-message-error,.CodeMirror-lint-message-warning{padding-left:18px;background-position:top left;background-repeat:no-repeat}.CodeMirror-lint-marker-error,.CodeMirror-lint-message-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAHlBMVEW7AAC7AACxAAC7AAC7AAAAAAC4AAC5AAD///+7AAAUdclpAAAABnRSTlMXnORSiwCK0ZKSAAAATUlEQVR42mWPOQ7AQAgDuQLx/z8csYRmPRIFIwRGnosRrpamvkKi0FTIiMASR3hhKW+hAN6/tIWhu9PDWiTGNEkTtIOucA5Oyr9ckPgAWm0GPBog6v4AAAAASUVORK5CYII=)}.CodeMirror-lint-marker-warning,.CodeMirror-lint-message-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAANlBMVEX/uwDvrwD/uwD/uwD/uwD/uwD/uwD/uwD/uwD6twD/uwAAAADurwD2tQD7uAD+ugAAAAD/uwDhmeTRAAAADHRSTlMJ8mN1EYcbmiixgACm7WbuAAAAVklEQVR42n3PUQqAIBBFUU1LLc3u/jdbOJoW1P08DA9Gba8+YWJ6gNJoNYIBzAA2chBth5kLmG9YUoG0NHAUwFXwO9LuBQL1giCQb8gC9Oro2vp5rncCIY8L8uEx5ZkAAAAASUVORK5CYII=)}.CodeMirror-lint-marker-multiple{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAACVBMVEUAAAAAAAC/v7914kyHAAAAAXRSTlMAQObYZgAAACNJREFUeNo1ioEJAAAIwmz/H90iFFSGJgFMe3gaLZ0od+9/AQZ0ADosbYraAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:right bottom;width:100%;height:100%}"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/lint/lint.js",
    "content": "'use strict';(function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],e):e(CodeMirror)})(function(e){function w(a,c){function b(a){if(!d.parentNode)return e.off(document,\"mousemove\",b);d.style.top=Math.max(0,a.clientY-d.offsetHeight-5)+\"px\";d.style.left=a.clientX+5+\"px\"}var d=document.createElement(\"div\");d.className=\"CodeMirror-lint-tooltip\";d.appendChild(c.cloneNode(!0));document.body.appendChild(d);\ne.on(document,\"mousemove\",b);b(a);null!=d.style.opacity&&(d.style.opacity=1);return d}function x(a){a.parentNode&&(null==a.style.opacity&&a.parentNode&&a.parentNode.removeChild(a),a.style.opacity=0,setTimeout(function(){a.parentNode&&a.parentNode.removeChild(a)},600))}function q(a,c,b){function d(){e.off(b,\"mouseout\",d);g&&(x(g),g=null)}var g=w(a,c),f=setInterval(function(){if(g)for(var a=b;;a=a.parentNode){a&&11==a.nodeType&&(a=a.host);if(a==document.body)return;if(!a){d();break}}if(!g)return clearInterval(f)},\n400);e.on(b,\"mouseout\",d)}function y(a,c,b){this.marked=[];this.options=c;this.timeout=null;this.hasGutter=b;this.onMouseOver=function(c){var b=c.target||c.srcElement;if(/\\bCodeMirror-lint-mark-/.test(b.className)){for(var b=b.getBoundingClientRect(),d=a.findMarksAt(a.coordsChar({left:(b.left+b.right)/2,top:(b.top+b.bottom)/2},\"client\")),b=[],h=0;h<d.length;++h){var e=d[h].__annotation;e&&b.push(e)}if(b.length){d=c.target||c.srcElement;h=document.createDocumentFragment();for(e=0;e<b.length;e++)h.appendChild(r(b[e]));\nq(c,h,d)}}};this.waitingFor=0}function t(a){var c=a.state.lint;c.hasGutter&&a.clearGutter(\"CodeMirror-lint-markers\");for(a=0;a<c.marked.length;++a)c.marked[a].clear();c.marked.length=0}function z(a,c,b,d){var g=document.createElement(\"div\"),f=g;g.className=\"CodeMirror-lint-marker-\"+c;b&&(f=g.appendChild(document.createElement(\"div\")),f.className=\"CodeMirror-lint-marker-multiple\");if(0!=d)e.on(f,\"mouseover\",function(b){q(b,a,f)});return g}function r(a){var c=a.severity;c||(c=\"error\");var b=document.createElement(\"div\");\nb.className=\"CodeMirror-lint-message-\"+c;b.appendChild(document.createTextNode(a.message));return b}function A(a,c,b){function d(){f=-1;a.off(\"change\",d)}var g=a.state.lint,f=++g.waitingFor;a.on(\"change\",d);c(a.getValue(),function(b,c){a.off(\"change\",d);g.waitingFor==f&&(c&&b instanceof e&&(b=c),u(a,b))},b,a)}function m(a){var c=a.state.lint.options,b=c.options||c,d=c.getAnnotations||a.getHelper(e.Pos(0,0),\"lint\");d&&(c.async||d.async?A(a,d,b):u(a,d(a.getValue(),b,a)))}function u(a,c){t(a);for(var b=\na.state.lint,d=b.options,e=[],f=0;f<c.length;++f){var h=c[f],l=h.from.line;(e[l]||(e[l]=[])).push(h)}for(f=0;f<e.length;++f)if(h=e[f]){for(var l=null,m=b.hasGutter&&document.createDocumentFragment(),p=0;p<h.length;++p){var k=h[p],n=k.severity;n||(n=\"error\");\"error\"!=l&&(l=n);d.formatAnnotation&&(k=d.formatAnnotation(k));b.hasGutter&&m.appendChild(r(k));k.to&&b.marked.push(a.markText(k.from,k.to,{className:\"CodeMirror-lint-mark-\"+n,__annotation:k}))}b.hasGutter&&a.setGutterMarker(f,\"CodeMirror-lint-markers\",\nz(m,l,1<h.length,b.options.tooltips))}if(d.onUpdateLinting)d.onUpdateLinting(c,e,a)}function v(a){var c=a.state.lint;c&&(clearTimeout(c.timeout),c.timeout=setTimeout(function(){m(a)},c.options.delay||500))}e.defineOption(\"lint\",!1,function(a,c,b){b&&b!=e.Init&&(t(a),!1!==a.state.lint.options.lintOnChange&&a.off(\"change\",v),e.off(a.getWrapperElement(),\"mouseover\",a.state.lint.onMouseOver),clearTimeout(a.state.lint.timeout),delete a.state.lint);if(c){var d=a.getOption(\"gutters\");b=!1;for(var g=0;g<\nd.length;++g)\"CodeMirror-lint-markers\"==d[g]&&(b=!0);d=a.state;c instanceof Function?c={getAnnotations:c}:c&&!0!==c||(c={});b=d.lint=new y(a,c,b);if(!1!==b.options.lintOnChange)a.on(\"change\",v);if(0!=b.options.tooltips)e.on(a.getWrapperElement(),\"mouseover\",b.onMouseOver);m(a)}});e.defineExtension(\"performLint\",function(){this.state.lint&&m(this)})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/lint/yaml-lint.js",
    "content": "'use strict';(function(a){\"object\"==typeof exports&&\"object\"==typeof module?a(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],a):a(CodeMirror)})(function(a){a.registerHelper(\"lint\",\"yaml\",function(b){var c=[];try{jsyaml.load(b)}catch(d){b=d.mark,c.push({from:a.Pos(b.line,b.column),to:a.Pos(b.line,b.column),message:d.message})}return c})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/merge/merge.css",
    "content": ".CodeMirror-merge{position:relative;border:1px solid #ddd;white-space:pre}.CodeMirror-merge,.CodeMirror-merge .CodeMirror{height:350px}.CodeMirror-merge-2pane .CodeMirror-merge-pane{width:47%}.CodeMirror-merge-2pane .CodeMirror-merge-gap{width:6%}.CodeMirror-merge-3pane .CodeMirror-merge-pane{width:31%}.CodeMirror-merge-3pane .CodeMirror-merge-gap{width:3.5%}.CodeMirror-merge-pane{display:inline-block;white-space:normal;vertical-align:top}.CodeMirror-merge-pane-rightmost{position:absolute;right:0;z-index:1}.CodeMirror-merge-gap{z-index:2;display:inline-block;height:100%;-moz-box-sizing:border-box;box-sizing:border-box;overflow:hidden;border-left:1px solid #ddd;border-right:1px solid #ddd;position:relative;background:#f8f8f8}.CodeMirror-merge-scrolllock-wrap{position:absolute;bottom:0;left:50%}.CodeMirror-merge-scrolllock{position:relative;left:-50%;cursor:pointer;color:#555;line-height:1}.CodeMirror-merge-copy,.CodeMirror-merge-copy-reverse{position:absolute;color:#44c;cursor:pointer}.CodeMirror-merge-copybuttons-left,.CodeMirror-merge-copybuttons-right{position:absolute;left:0;top:0;right:0;bottom:0;line-height:1}.CodeMirror-merge-copy{z-index:3}.CodeMirror-merge-copybuttons-left .CodeMirror-merge-copy{left:2px}.CodeMirror-merge-copybuttons-right .CodeMirror-merge-copy{right:2px}.CodeMirror-merge-l-inserted,.CodeMirror-merge-r-inserted{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAYAAACddGYaAAAAGUlEQVQI12MwuCXy3+CWyH8GBgYGJgYkAABZbAQ9ELXurwAAAABJRU5ErkJggg==);background-position:bottom left;background-repeat:repeat-x}.CodeMirror-merge-l-deleted,.CodeMirror-merge-r-deleted{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAYAAACddGYaAAAAGUlEQVQI12M4Kyb2/6yY2H8GBgYGJgYkAABURgPz6Ks7wQAAAABJRU5ErkJggg==);background-position:bottom left;background-repeat:repeat-x}.CodeMirror-merge-r-chunk{background:#ffffe0}.CodeMirror-merge-r-chunk-start{border-top:1px solid #ee8}.CodeMirror-merge-r-chunk-end{border-bottom:1px solid #ee8}.CodeMirror-merge-r-connect{fill:#ffffe0;stroke:#ee8;stroke-width:1px}.CodeMirror-merge-l-chunk{background:#eef}.CodeMirror-merge-l-chunk-start{border-top:1px solid #88e}.CodeMirror-merge-l-chunk-end{border-bottom:1px solid #88e}.CodeMirror-merge-l-connect{fill:#eef;stroke:#88e;stroke-width:1px}.CodeMirror-merge-l-chunk.CodeMirror-merge-r-chunk{background:#dfd}.CodeMirror-merge-l-chunk-start.CodeMirror-merge-r-chunk-start{border-top:1px solid #4e4}.CodeMirror-merge-l-chunk-end.CodeMirror-merge-r-chunk-end{border-bottom:1px solid #4e4}.CodeMirror-merge-collapsed-widget:before{content:\"(...)\"}.CodeMirror-merge-collapsed-widget{cursor:pointer;color:#88b;background:#eef;border:1px solid #ddf;font-size:90%;padding:0 3px;border-radius:4px}.CodeMirror-merge-collapsed-line .CodeMirror-gutter-elt{display:none}"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/merge/merge.js",
    "content": "'use strict';(function(n){\"object\"==typeof exports&&\"object\"==typeof module?n(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\",\"diff_match_patch\"],n):n(CodeMirror)})(function(n){function A(a,b){this.mv=a;this.type=b;this.classes=\"left\"==b?{chunk:\"CodeMirror-merge-l-chunk\",start:\"CodeMirror-merge-l-chunk-start\",end:\"CodeMirror-merge-l-chunk-end\",insert:\"CodeMirror-merge-l-inserted\",del:\"CodeMirror-merge-l-deleted\",connect:\"CodeMirror-merge-l-connect\"}:\n{chunk:\"CodeMirror-merge-r-chunk\",start:\"CodeMirror-merge-r-chunk-start\",end:\"CodeMirror-merge-r-chunk-end\",insert:\"CodeMirror-merge-r-inserted\",del:\"CodeMirror-merge-r-deleted\",connect:\"CodeMirror-merge-r-connect\"}}function z(a){a.diffOutOfDate&&(a.diff=L(a.orig.getValue(),a.edit.getValue()),a.chunks=M(a.diff),a.diffOutOfDate=!1,n.signal(a.edit,\"updateDiff\",a.diff))}function aa(a){function b(b){B=!0;h=!1;\"full\"==b&&(a.svg&&C(a.svg),a.copyButtons&&C(a.copyButtons),G(a.edit,e.marked,a.classes),G(a.orig,\nk.marked,a.classes),e.from=e.to=k.from=k.to=0);z(a);a.showDifferences&&(N(a.edit,a.diff,e,DIFF_INSERT,a.classes),N(a.orig,a.diff,k,DIFF_DELETE,a.classes));x(a);\"align\"==a.mv.options.connect&&H(a);B=!1}function c(b){B||(a.dealigned=!0,f(b))}function f(a){B||h||(clearTimeout(g),!0===a&&(h=!0),g=setTimeout(b,!0===a?20:250))}function d(b,d){a.diffOutOfDate||(a.diffOutOfDate=!0,e.from=e.to=k.from=k.to=0);c(d.text.length-1!=d.to.line-d.from.line)}var e={from:0,to:0,marked:[]},k={from:0,to:0,marked:[]},\ng,h=!1;a.edit.on(\"change\",d);a.orig.on(\"change\",d);a.edit.on(\"markerAdded\",c);a.edit.on(\"markerCleared\",c);a.orig.on(\"markerAdded\",c);a.orig.on(\"markerCleared\",c);a.edit.on(\"viewportChange\",function(){f(!1)});a.orig.on(\"viewportChange\",function(){f(!1)});b();return b}function ba(a){a.edit.on(\"scroll\",function(){I(a,DIFF_INSERT)&&x(a)});a.orig.on(\"scroll\",function(){I(a,DIFF_DELETE)&&x(a)})}function I(a,b){var c,f;if(a.diffOutOfDate)return!1;if(!a.lockScroll)return!0;var d,e,k=+new Date;b==DIFF_INSERT?\n(d=a.edit,e=a.orig):(d=a.orig,e=a.edit);if(d.state.scrollSetBy==a&&(d.state.scrollSetAt||0)+50>k)return!1;var g=d.getScrollInfo();if(\"align\"==a.mv.options.connect)l=g.top;else{var h=.5*g.clientHeight,l=g.top+h;c=d.lineAtHeight(l,\"local\");for(var m=a.chunks,n=b==DIFF_INSERT,u,t,p,r=0;r<m.length;r++){var v=m[r],O=n?v.editFrom:v.origFrom,q=n?v.editTo:v.origTo;null==t&&(O>c?(t=v.editFrom,p=v.origFrom):q>c&&(t=v.editTo,p=v.origTo));q<=c?(u=v.editTo,f=v.origTo):O<=c&&(u=v.editFrom,f=v.origFrom)}c={before:u,\nafter:t};f={before:f,after:p};d=P(d,b==DIFF_INSERT?c:f);b=P(e,b==DIFF_INSERT?f:c);var l=b.top-h+(l-d.top)/(d.bot-d.top)*(b.bot-b.top),y;l>g.top&&1>(y=g.top/h)?l=l*y+g.top*(1-y):(b=g.height-g.clientHeight-g.top)<h&&(d=e.getScrollInfo(),d.height-d.clientHeight-l>b&&1>(y=b/h)&&(l=l*y+(d.height-d.clientHeight-b)*(1-y)))}e.scrollTo(g.left,l);e.state.scrollSetAt=k;e.state.scrollSetBy=a;return!0}function P(a,b){var c=b.after;null==c&&(c=a.lastLine()+1);return{top:a.heightAtLine(b.before||0,\"local\"),bot:a.heightAtLine(c,\n\"local\")}}function Q(a,b,c){(a.lockScroll=b)&&0!=c&&I(a,DIFF_INSERT)&&x(a);a.lockButton.innerHTML=b?\"\\u21db\\u21da\":\"\\u21db&nbsp;&nbsp;\\u21da\"}function G(a,b,c){for(var f=0;f<b.length;++f){var d=b[f];d instanceof n.TextMarker?d.clear():d.parent&&(a.removeLineClass(d,\"background\",c.chunk),a.removeLineClass(d,\"background\",c.start),a.removeLineClass(d,\"background\",c.end))}b.length=0}function N(a,b,c,f,d){var e=a.getViewport();a.operation(function(){c.from==c.to||20<e.from-c.to||20<c.from-e.to?(G(a,c.marked,\nd),J(a,b,f,c.marked,e.from,e.to,d),c.from=e.from,c.to=e.to):(e.from<c.from&&(J(a,b,f,c.marked,e.from,c.from,d),c.from=e.from),e.to>c.to&&(J(a,b,f,c.marked,c.to,e.to,d),c.to=e.to))})}function J(a,b,c,f,d,e,k){function g(b,c){for(var g=Math.max(d,b),h=Math.min(e,c),l=g;l<h;++l){var m=a.addLineClass(l,\"background\",k.chunk);l==b&&a.addLineClass(m,\"background\",k.start);l==c-1&&a.addLineClass(m,\"background\",k.end);f.push(m)}b==c&&g==c&&h==c&&(g?f.push(a.addLineClass(g-1,\"background\",k.end)):f.push(a.addLineClass(g,\n\"background\",k.start)))}for(var h=q(0,0),l=q(d,0),m=a.clipPos(q(e-1)),n=c==DIFF_DELETE?k.del:k.insert,u=0,t=0;t<b.length;++t){var p=b[t],r=p[0],p=p[1];r==DIFF_EQUAL?(r=h.line+(R(b,t)?0:1),D(h,p),p=h.line+(S(b,t)?1:0),p>r&&(t&&g(u,r),u=p)):r==c&&(r=D(h,p,!0),h=0<(l.line-h.line||l.ch-h.ch)?l:h,p=0>(m.line-r.line||m.ch-r.ch)?m:r,h.line==p.line&&h.ch==p.ch||f.push(a.markText(h,p,{className:n})),h=r)}u<=h.line&&g(u,h.line+1)}function x(a){if(a.showDifferences){if(a.svg){C(a.svg);var b=a.gap.offsetWidth;\nT(a.svg,\"width\",b,\"height\",a.gap.offsetHeight)}a.copyButtons&&C(a.copyButtons);for(var c=a.edit.getViewport(),f=a.orig.getViewport(),d=a.mv.wrap.getBoundingClientRect().top,e=d-a.edit.getScrollerElement().getBoundingClientRect().top+a.edit.getScrollInfo().top,d=d-a.orig.getScrollerElement().getBoundingClientRect().top+a.orig.getScrollInfo().top,k=0;k<a.chunks.length;k++){var g=a.chunks[k];if(g.editFrom<=c.to&&g.editTo>=c.from&&g.origFrom<=f.to&&g.origTo>=f.from){var h=a,l=d,m=e,n=b,u=\"left\"==h.type,\nt=h.orig.heightAtLine(g.origFrom,\"local\")-l;if(h.svg){var p=t,r=h.edit.heightAtLine(g.editFrom,\"local\")-m;if(u)var v=p,p=r,r=v;var l=h.orig.heightAtLine(g.origTo,\"local\")-l,q=h.edit.heightAtLine(g.editTo,\"local\")-m;u&&(v=l,l=q,q=v);u=\" C \"+n/2+\" \"+r+\" \"+n/2+\" \"+p+\" \"+(n+2)+\" \"+p;p=\" C \"+n/2+\" \"+l+\" \"+n/2+\" \"+q+\" -1 \"+q;T(h.svg.appendChild(document.createElementNS(\"http://www.w3.org/2000/svg\",\"path\")),\"d\",\"M -1 \"+r+u+\" L \"+(n+2)+\" \"+l+p+\" z\",\"class\",h.classes.connect)}h.copyButtons&&(n=h.copyButtons.appendChild(w(\"div\",\n\"left\"==h.type?\"\\u21dd\":\"\\u21dc\",\"CodeMirror-merge-copy\")),r=h.mv.options.allowEditingOriginals,n.title=r?\"Push to left\":\"Revert chunk\",n.chunk=g,n.style.top=t+\"px\",r&&(m=h.orig.heightAtLine(g.editFrom,\"local\")-m,t=h.copyButtons.appendChild(w(\"div\",\"right\"==h.type?\"\\u21dd\":\"\\u21dc\",\"CodeMirror-merge-copy-reverse\")),t.title=\"Push to right\",t.chunk={editFrom:g.origFrom,editTo:g.origTo,origFrom:g.editFrom,origTo:g.editTo},t.style.top=m+\"px\",\"right\"==h.type?t.style.left=\"2px\":t.style.right=\"2px\"))}}}}\nfunction E(a,b){for(var c=0,f=0,d=0;d<b.length;d++){var e=b[d];if(e.editTo>a&&e.editFrom<=a)return null;if(e.editFrom>a)break;c=e.editTo;f=e.origTo}return f+(a-c)}function ca(a,b){for(var c=[],f=0;f<a.chunks.length;f++){var d=a.chunks[f];c.push([d.origTo,d.editTo,b?E(d.editTo,b.chunks):null])}if(b)for(f=0;f<b.chunks.length;f++){for(var d=b.chunks[f],e=0;e<c.length;e++){var k=c[e];if(k[1]==d.editTo){e=-1;break}else if(k[1]>d.editTo)break}-1<e&&c.splice(e-1,0,[E(d.editTo,a.chunks),d.editTo,d.origTo])}return c}\nfunction H(a,b){if(a.dealigned||b){if(!a.orig.curOp)return a.orig.operation(function(){H(a,b)});a.dealigned=!1;var c=a.mv.left==a?a.mv.right:a.mv.left;c&&(z(c),c.dealigned=!1);for(var f=ca(a,c),d=a.mv.aligners,e=0;e<d.length;e++)d[e].clear();d.length=0;var k=[a.orig,a.edit],g=[];c&&k.push(c.orig);for(e=0;e<k.length;e++)g.push(k[e].getScrollInfo().top);for(c=0;c<f.length;c++)da(k,f[c],d);for(e=0;e<k.length;e++)k[e].scrollTo(null,g[e])}}function da(a,b,c){for(var f=0,d=[],e=0;e<a.length;e++)if(null!=\nb[e]){var k=a[e].heightAtLine(b[e],\"local\");d[e]=k;f=Math.max(f,k)}for(e=0;e<a.length;e++)null!=b[e]&&(k=f-d[e],1<k&&c.push(ea(a[e],b[e],k)))}function ea(a,b,c){var f=!0;b>a.lastLine()&&(b--,f=!1);var d=document.createElement(\"div\");d.className=\"CodeMirror-merge-spacer\";d.style.height=c+\"px\";d.style.minWidth=\"1px\";return a.addLineWidget(b,d,{height:c,above:f})}function U(a,b,c,f){if(!a.diffOutOfDate){a=f.editTo>b.lastLine()?q(f.editFrom-1):q(f.editFrom,0);var d=f.origTo>c.lastLine()?q(f.origFrom-\n1):q(f.origFrom,0);b.replaceRange(c.getRange(d,q(f.origTo,0)),a,q(f.editTo,0))}}function V(a){var b=a.lockButton=w(\"div\",null,\"CodeMirror-merge-scrolllock\");b.title=\"Toggle locked scrolling\";var c=w(\"div\",[b],\"CodeMirror-merge-scrolllock-wrap\");n.on(b,\"click\",function(){Q(a,!a.lockScroll)});b=[c];!1!==a.mv.options.revertButtons&&(a.copyButtons=w(\"div\",null,\"CodeMirror-merge-copybuttons-\"+a.type),n.on(a.copyButtons,\"click\",function(b){b=b.target||b.srcElement;b.chunk&&(\"CodeMirror-merge-copy-reverse\"==\nb.className?U(a,a.orig,a.edit,b.chunk):U(a,a.edit,a.orig,b.chunk))}),b.unshift(a.copyButtons));\"align\"!=a.mv.options.connect&&((c=document.createElementNS&&document.createElementNS(\"http://www.w3.org/2000/svg\",\"svg\"))&&!c.createSVGRect&&(c=null),(a.svg=c)&&b.push(c));return a.gap=w(\"div\",b,\"CodeMirror-merge-gap\")}function W(a){return\"string\"==typeof a?a:a.getValue()}function L(a,b){a=X.diff_main(a,b);X.diff_cleanupSemantic(a);for(b=0;b<a.length;++b){var c=a[b];c[1]?b&&a[b-1][0]==c[0]&&(a.splice(b--,\n1),a[b][1]+=c[1]):a.splice(b--,1)}return a}function M(a){for(var b=[],c=0,f=0,d=q(0,0),e=q(0,0),k=0;k<a.length;++k){var g=a[k],h=g[0];if(h==DIFF_EQUAL){var l=R(a,k)?0:1,h=d.line+l,l=e.line+l;D(d,g[1],null,e);var m=S(a,k)?1:0,g=d.line+m,m=e.line+m;g>h&&(k&&b.push({origFrom:f,origTo:l,editFrom:c,editTo:h}),c=g,f=m)}else D(h==DIFF_INSERT?d:e,g[1])}(c<=d.line||f<=e.line)&&b.push({origFrom:f,origTo:e.line+1,editFrom:c,editTo:d.line+1});return b}function S(a,b){if(b==a.length-1)return!0;var c=a[b+1][1];\nif(1==c.length||10!=c.charCodeAt(0))return!1;if(b==a.length-2)return!0;c=a[b+2][1];return 1<c.length&&10==c.charCodeAt(0)}function R(a,b){if(0==b)return!0;var c=a[b-1][1];if(10!=c.charCodeAt(c.length-1))return!1;if(1==b)return!0;c=a[b-2][1];return 10==c.charCodeAt(c.length-1)}function fa(a,b,c){function f(){e.clear();a.removeLineClass(b,\"wrap\",\"CodeMirror-merge-collapsed-line\")}a.addLineClass(b,\"wrap\",\"CodeMirror-merge-collapsed-line\");var d=document.createElement(\"span\");d.className=\"CodeMirror-merge-collapsed-widget\";\nd.title=\"Identical text collapsed. Click to expand.\";var e=a.markText(q(b,0),q(c-1),{inclusiveLeft:!0,inclusiveRight:!0,replacedWith:d,clearOnEnter:!0});n.on(d,\"click\",f);return{mark:e,clear:f}}function ga(a,b){function c(){for(var a=0;a<f.length;a++)f[a].clear()}for(var f=[],d=0;d<b.length;d++){var e=b[d],e=fa(e.cm,e.line,e.line+a);f.push(e);e.mark.on(\"clear\",c)}return f[0].mark}function Y(a,b,c,f){for(var d=0;d<a.chunks.length;d++)for(var e=a.chunks[d],k=e.editFrom-b;k<e.editTo+b;k++){var g=k+c;\n0<=g&&g<f.length&&(f[g]=!1)}}function w(a,b,c,f){a=document.createElement(a);c&&(a.className=c);f&&(a.style.cssText=f);if(\"string\"==typeof b)a.appendChild(document.createTextNode(b));else if(b)for(c=0;c<b.length;++c)a.appendChild(b[c]);return a}function C(a){for(var b=a.childNodes.length;0<b;--b)a.removeChild(a.firstChild)}function T(a){for(var b=1;b<arguments.length;b+=2)a.setAttribute(arguments[b],arguments[b+1])}function K(a,b){b||(b={});for(var c in a)a.hasOwnProperty(c)&&(b[c]=a[c]);return b}\nfunction D(a,b,c,f){a=c?q(a.line,a.ch):a;for(c=0;;){var d=b.indexOf(\"\\n\",c);if(-1==d)break;++a.line;f&&++f.line;c=d+1}a.ch=(c?0:a.ch)+(b.length-c);f&&(f.ch=(c?0:f.ch)+(b.length-c));return a}function Z(a,b){var c=null,f=a.state.diffViews,d=a.getCursor().line;if(f)for(var e=0;e<f.length;e++){var k=f[e],g=a==k.orig;z(k);if(0>b)a:{for(var k=k.chunks,h=k.length-1;0<=h;h--){var l=k[h],l=(g?l.origTo:l.editTo)-1;if(l<d){g=l;break a}}g=void 0}else a:{k=k.chunks;for(h=0;h<k.length;h++)if(l=k[h],l=g?l.origFrom:\nl.editFrom,l>d){g=l;break a}g=void 0}null!=g&&(null==c||(0>b?g>c:g<c))&&(c=g)}if(null!=c)a.setCursor(c,0);else return n.Pass}var q=n.Pos;A.prototype={constructor:A,init:function(a,b,c){this.edit=this.mv.edit;(this.edit.state.diffViews||(this.edit.state.diffViews=[])).push(this);this.orig=n(a,K({value:b,readOnly:!this.mv.options.allowEditingOriginals},K(c)));this.orig.state.diffViews=[this];this.diff=L(W(b),W(c.value));this.chunks=M(this.diff);this.diffOutOfDate=this.dealigned=!1;this.showDifferences=\n!1!==c.showDifferences;this.forceUpdate=aa(this);Q(this,!0,!1);ba(this)},setShowDifferences:function(a){a=!1!==a;a!=this.showDifferences&&(this.showDifferences=a,this.forceUpdate(\"full\"))}};var B=!1,F=n.MergeView=function(a,b){if(!(this instanceof F))return new F(a,b);this.options=b;var c=b.origLeft,f=null==b.origRight?b.orig:b.origRight,d=null!=c,e=null!=f,k=1+(d?1:0)+(e?1:0),g=[],h=this.left=null,l=this.right=null,m=this;if(d){var h=this.left=new A(this,\"left\"),q=w(\"div\",null,\"CodeMirror-merge-pane\");\ng.push(q);g.push(V(h))}d=w(\"div\",null,\"CodeMirror-merge-pane\");g.push(d);if(e){l=this.right=new A(this,\"right\");g.push(V(l));var u=w(\"div\",null,\"CodeMirror-merge-pane\");g.push(u)}(e?u:d).className+=\" CodeMirror-merge-pane-rightmost\";g.push(w(\"div\",null,null,\"height: 0; clear: both;\"));var t=this.wrap=a.appendChild(w(\"div\",g,\"CodeMirror-merge CodeMirror-merge-\"+k+\"pane\"));this.edit=n(d,K(b));h&&h.init(q,c,b);l&&l.init(u,f,b);b.collapseIdentical&&this.editor().operation(function(){var a=b.collapseIdentical;\n\"number\"!=typeof a&&(a=2);for(var c=[],d=m.editor(),e=d.firstLine(),f=e,g=d.lastLine();f<=g;f++)c.push(!0);m.left&&Y(m.left,a,e,c);m.right&&Y(m.right,a,e,c);for(f=0;f<c.length;f++)if(c[f]){for(var g=f+e,h=1;f<c.length-1&&c[f+1];f++,h++);if(h>a){var k=[{line:g,cm:d}];m.left&&k.push({line:E(g,m.left.chunks),cm:m.left.orig});m.right&&k.push({line:E(g,m.right.chunks),cm:m.right.orig});k=ga(h,k);if(m.options.onCollapse)m.options.onCollapse(m,g,h,k)}}});\"align\"==b.connect&&(this.aligners=[],H(this.left||\nthis.right,!0));var p=function(){h&&x(h);l&&x(l)};n.on(window,\"resize\",p);var r=setInterval(function(){for(var a=t.parentNode;a&&a!=document.body;a=a.parentNode);a||(clearInterval(r),n.off(window,\"resize\",p))},5E3)};F.prototype={constuctor:F,editor:function(){return this.edit},rightOriginal:function(){return this.right&&this.right.orig},leftOriginal:function(){return this.left&&this.left.orig},setShowDifferences:function(a){this.right&&this.right.setShowDifferences(a);this.left&&this.left.setShowDifferences(a)},\nrightChunks:function(){if(this.right)return z(this.right),this.right.chunks},leftChunks:function(){if(this.left)return z(this.left),this.left.chunks}};var X=new diff_match_patch;n.commands.goNextDiff=function(a){return Z(a,1)};n.commands.goPrevDiff=function(a){return Z(a,-1)}});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/mode/loadmode.js",
    "content": "'use strict';(function(b){\"object\"==typeof exports&&\"object\"==typeof module?b(require(\"../../lib/codemirror\"),\"cjs\"):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],function(f){b(f,\"amd\")}):b(CodeMirror,\"plain\")})(function(b,f){function l(a,b){var c=b;return function(){0==--c&&a()}}function h(a,c){var e=b.modes[a].dependencies;if(!e)return c();a=[];for(var d=0;d<e.length;++d)b.modes.hasOwnProperty(e[d])||a.push(e[d]);if(!a.length)return c();c=l(c,a.length);for(d=0;d<a.length;++d)b.requireMode(a[d],\nc)}b.modeURL||(b.modeURL=\"../mode/%N/%N.js\");var g={};b.requireMode=function(a,c){\"string\"!=typeof a&&(a=a.name);if(b.modes.hasOwnProperty(a))return h(a,c);if(g.hasOwnProperty(a))return g[a].push(c);var e=b.modeURL.replace(/%N/g,a);if(\"plain\"==f){var d=document.createElement(\"script\");d.src=e;var e=document.getElementsByTagName(\"script\")[0],k=g[a]=[c];b.on(d,\"load\",function(){h(a,function(){for(var a=0;a<k.length;++a)k[a]()})});e.parentNode.insertBefore(d,e)}else\"cjs\"==f?(require(e),c()):\"amd\"==f&&\nrequirejs([e],c)};b.autoLoadMode=function(a,c){b.modes.hasOwnProperty(c)||b.requireMode(c,function(){a.setOption(\"mode\",a.getOption(\"mode\"))})}});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/mode/multiplex.js",
    "content": "'use strict';(function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],e):e(CodeMirror)})(function(e){e.multiplexingMode=function(g){function m(a,c,b,d){return\"string\"==typeof c?(b=a.indexOf(c,b),d&&-1<b?b+c.length:b):(c=c.exec(b?a.slice(b):a))?c.index+b+(d?c[0].length:0):-1}var l=Array.prototype.slice.call(arguments,1);return{startState:function(){return{outer:e.startState(g),innerActive:null,\ninner:null}},copyState:function(a){return{outer:e.copyState(g,a.outer),innerActive:a.innerActive,inner:a.innerActive&&e.copyState(a.innerActive.mode,a.inner)}},token:function(a,c){if(c.innerActive){var b=c.innerActive,d=a.string;if(!b.close&&a.sol())return c.innerActive=c.inner=null,this.token(a,c);f=b.close?m(d,b.close,a.pos,b.parseDelimiters):-1;if(f==a.pos&&!b.parseDelimiters)return a.match(b.close),c.innerActive=c.inner=null,b.delimStyle&&b.delimStyle+\" \"+b.delimStyle+\"-close\";-1<f&&(a.string=\nd.slice(0,f));var h=b.mode.token(a,c.inner);-1<f&&(a.string=d);f==a.pos&&b.parseDelimiters&&(c.innerActive=c.inner=null);b.innerStyle&&(h=h?h+\" \"+b.innerStyle:b.innerStyle);return h}for(var b=Infinity,d=a.string,h=0;h<l.length;++h){var k=l[h],f=m(d,k.open,a.pos);if(f==a.pos)return k.parseDelimiters||a.match(k.open),c.innerActive=k,c.inner=e.startState(k.mode,g.indent?g.indent(c.outer,\"\"):0),k.delimStyle&&k.delimStyle+\" \"+k.delimStyle+\"-open\";-1!=f&&f<b&&(b=f)}Infinity!=b&&(a.string=d.slice(0,b));\nc=g.token(a,c.outer);Infinity!=b&&(a.string=d);return c},indent:function(a,c){var b=a.innerActive?a.innerActive.mode:g;return b.indent?b.indent(a.innerActive?a.inner:a.outer,c):e.Pass},blankLine:function(a){var c=a.innerActive?a.innerActive.mode:g;c.blankLine&&c.blankLine(a.innerActive?a.inner:a.outer);if(a.innerActive)\"\\n\"===a.innerActive.close&&(a.innerActive=a.inner=null);else for(var b=0;b<l.length;++b){var d=l[b];\"\\n\"===d.open&&(a.innerActive=d,a.inner=e.startState(d.mode,c.indent?c.indent(a.outer,\n\"\"):0))}},electricChars:g.electricChars,innerMode:function(a){return a.inner?{state:a.inner,mode:a.innerActive.mode}:{state:a.outer,mode:g}}}}});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/mode/multiplex_test.js",
    "content": "'use strict';(function(){CodeMirror.defineMode(\"markdown_with_stex\",function(){var a=CodeMirror.getMode({},\"stex\"),b=CodeMirror.getMode({},\"markdown\");return CodeMirror.multiplexingMode(b,{open:\"$\",close:\"$\",mode:a,delimStyle:\"delim\",innerStyle:\"inner\"})});var b=CodeMirror.getMode({},\"markdown_with_stex\");(function(a){test.mode(a,b,Array.prototype.slice.call(arguments,1),\"multiplexing\")})(\"stexInsideMarkdown\",\"[strong **Equation:**] [delim&delim-open $][inner&tag \\\\pi][delim&delim-close $]\")})();\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/mode/overlay.js",
    "content": "'use strict';(function(c){\"object\"==typeof exports&&\"object\"==typeof module?c(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],c):c(CodeMirror)})(function(c){c.overlayMode=function(d,e,f){return{startState:function(){return{base:c.startState(d),overlay:c.startState(e),basePos:0,baseCur:null,overlayPos:0,overlayCur:null,streamSeen:null}},copyState:function(b){return{base:c.copyState(d,b.base),overlay:c.copyState(e,b.overlay),basePos:b.basePos,baseCur:null,\noverlayPos:b.overlayPos,overlayCur:null}},token:function(b,a){if(b!=a.streamSeen||Math.min(a.basePos,a.overlayPos)<b.start)a.streamSeen=b,a.basePos=a.overlayPos=b.start;b.start==a.basePos&&(a.baseCur=d.token(b,a.base),a.basePos=b.pos);b.start==a.overlayPos&&(b.pos=b.start,a.overlayCur=e.token(b,a.overlay),a.overlayPos=b.pos);b.pos=Math.min(a.basePos,a.overlayPos);return null==a.overlayCur?a.baseCur:null!=a.baseCur&&a.overlay.combineTokens||f&&null==a.overlay.combineTokens?a.baseCur+\" \"+a.overlayCur:\na.overlayCur},indent:d.indent&&function(b,a){return d.indent(b.base,a)},electricChars:d.electricChars,innerMode:function(b){return{state:b.base,mode:d}},blankLine:function(b){d.blankLine&&d.blankLine(b.base);e.blankLine&&e.blankLine(b.overlay)}}}});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/mode/simple.js",
    "content": "'use strict';(function(k){\"object\"==typeof exports&&\"object\"==typeof module?k(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],k):k(CodeMirror)})(function(k){function r(e,c){if(!e.hasOwnProperty(c))throw Error(\"Undefined state \"+c+\" in simple mode\");}function q(e,c){if(!e)return/(?:)/;var d=\"\";e instanceof RegExp?(e.ignoreCase&&(d=\"i\"),e=e.source):e=String(e);return new RegExp((!1===c?\"\":\"^\")+\"(?:\"+e+\")\",d)}function u(e,c){(e.next||e.push)&&r(c,\ne.next||e.push);this.regex=q(e.regex);if(c=e.token)if(\"string\"==typeof c)c=c.replace(/\\./g,\" \");else{for(var d=[],a=0;a<c.length;a++)d.push(c[a]&&c[a].replace(/\\./g,\" \"));c=d}else c=null;this.token=c;this.data=e}function v(e,c){return function(d,a){if(a.pending){var b=a.pending.shift();0==a.pending.length&&(a.pending=null);d.pos+=b.text.length;return b.token}if(a.local){if(a.local.end&&d.match(a.local.end))b=a.local.endToken||null,a.local=a.localState=null;else{var b=a.local.mode.token(d,a.localState),\ng;a.local.endScan&&(g=a.local.endScan.exec(d.current()))&&(d.pos=d.start+g.index)}return b}for(var h=e[a.state],f=0;f<h.length;f++)if(b=h[f],g=(!b.data.sol||d.sol())&&d.match(b.regex)){b.data.next?a.state=b.data.next:b.data.push?((a.stack||(a.stack=[])).push(a.state),a.state=b.data.push):b.data.pop&&a.stack&&a.stack.length&&(a.state=a.stack.pop());if(b.data.mode){var l=c,h=a,f=b.data.mode,n=b.token,m=void 0;if(f.persistent)for(var p=h.persistentStates;p&&!m;p=p.next)if(f.spec?t(f.spec,p.spec):f.mode==\np.mode)m=p;l=m?m.mode:f.mode||k.getMode(l,f.spec);p=m?m.state:k.startState(l);f.persistent&&!m&&(h.persistentStates={mode:l,spec:f.spec,state:p,next:h.persistentStates});h.localState=p;h.local={mode:l,end:f.end&&q(f.end),endScan:f.end&&!1!==f.forceEnd&&q(f.end,!1),endToken:n&&n.join?n[n.length-1]:n}}b.data.indent&&a.indent.push(d.indentation()+c.indentUnit);b.data.dedent&&a.indent.pop();if(2<g.length){a.pending=[];for(h=2;h<g.length;h++)g[h]&&a.pending.push({text:g[h],token:b.token[h-1]});d.backUp(g[0].length-\n(g[1]?g[1].length:0));return b.token[0]}return b.token&&b.token.join?b.token[0]:b.token}d.next();return null}}function t(e,c){if(e===c)return!0;if(!e||\"object\"!=typeof e||!c||\"object\"!=typeof c)return!1;var d=0,a;for(a in e)if(e.hasOwnProperty(a)){if(!c.hasOwnProperty(a)||!t(e[a],c[a]))return!1;d++}for(a in c)c.hasOwnProperty(a)&&d--;return 0==d}function w(e,c){return function(d,a,b){if(d.local&&d.local.mode.indent)return d.local.mode.indent(d.localState,a,b);if(!(b=null==d.indent||d.local)&&(b=c.dontIndentStates)){a:{b=\nc.dontIndentStates;for(var g=0;g<b.length;g++)if(b[g]===d.state){b=!0;break a}b=void 0}b=-1<b}if(b)return k.Pass;b=d.indent.length-1;g=e[d.state];a:for(;;){for(var h=0;h<g.length;h++){var f=g[h];if(f.data.dedent&&!1!==f.data.dedentIfLineStart){var l=f.regex.exec(a);if(l&&l[0]){b--;if(f.next||f.push)g=e[f.next||f.push];a=a.slice(l[0].length);continue a}}}break}return 0>b?0:d.indent[b]}}k.defineSimpleMode=function(e,c){k.defineMode(e,function(d){return k.simpleMode(d,c)})};k.simpleMode=function(e,c){r(c,\n\"start\");var d={},a=c.meta||{},b=!1,g;for(g in c)if(g!=a&&c.hasOwnProperty(g))for(var h=d[g]=[],f=c[g],l=0;l<f.length;l++){var n=f[l];h.push(new u(n,c));if(n.indent||n.dedent)b=!0}e={startState:function(){return{state:\"start\",pending:null,local:null,localState:null,indent:b?[]:null}},copyState:function(a){var b={state:a.state,pending:a.pending,local:a.local,localState:null,indent:a.indent&&a.indent.slice(0)};a.localState&&(b.localState=k.copyState(a.local.mode,a.localState));a.stack&&(b.stack=a.stack.slice(0));\nfor(var c=a.persistentStates;c;c=c.next)b.persistentStates={mode:c.mode,spec:c.spec,state:c.state==a.localState?b.localState:k.copyState(c.mode,c.state),next:b.persistentStates};return b},token:v(d,e),innerMode:function(a){return a.local&&{mode:a.local.mode,state:a.localState}},indent:w(d,a)};if(a)for(var m in a)a.hasOwnProperty(m)&&(e[m]=a[m]);return e}});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/runmode/colorize.js",
    "content": "'use strict';(function(a){\"object\"==typeof exports&&\"object\"==typeof module?a(require(\"../../lib/codemirror\"),require(\"./runmode\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\",\"./runmode\"],a):a(CodeMirror)})(function(a){function f(b,a){if(3==b.nodeType)return a.push(b.nodeValue);for(var c=b.firstChild;c;c=c.nextSibling)f(c,a),e.test(b.nodeType)&&a.push(\"\\n\")}var e=/^(p|li|div|h\\\\d|pre|blockquote|td)$/;a.colorize=function(b,e){b||(b=document.body.getElementsByTagName(\"pre\"));\nfor(var c=0;c<b.length;++c){var d=b[c],g=d.getAttribute(\"data-lang\")||e;if(g){var h=[];f(d,h);d.innerHTML=\"\";a.runMode(h.join(\"\"),g,d);d.className+=\" cm-s-default\"}}}});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/runmode/runmode-standalone.js",
    "content": "'use strict';window.CodeMirror={};\n(function(){function k(a){this.pos=this.start=0;this.string=a;this.lineStart=0}k.prototype={eol:function(){return this.pos>=this.string.length},sol:function(){return 0==this.pos},peek:function(){return this.string.charAt(this.pos)||null},next:function(){if(this.pos<this.string.length)return this.string.charAt(this.pos++)},eat:function(a){var b=this.string.charAt(this.pos);if(\"string\"==typeof a?b==a:b&&(a.test?a.test(b):a(b)))return++this.pos,b},eatWhile:function(a){for(var b=this.pos;this.eat(a););\nreturn this.pos>b},eatSpace:function(){for(var a=this.pos;/[\\s\\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;return this.pos>a},skipToEnd:function(){this.pos=this.string.length},skipTo:function(a){a=this.string.indexOf(a,this.pos);if(-1<a)return this.pos=a,!0},backUp:function(a){this.pos-=a},column:function(){return this.start-this.lineStart},indentation:function(){return 0},match:function(a,b,d){if(\"string\"==typeof a){var c=function(a){return d?a.toLowerCase():a},f=this.string.substr(this.pos,\na.length);if(c(f)==c(a))return!1!==b&&(this.pos+=a.length),!0}else{if((a=this.string.slice(this.pos).match(a))&&0<a.index)return null;a&&!1!==b&&(this.pos+=a[0].length);return a}},current:function(){return this.string.slice(this.start,this.pos)},hideFirstChars:function(a,b){this.lineStart+=a;try{return b()}finally{this.lineStart-=a}}};CodeMirror.StringStream=k;CodeMirror.startState=function(a,b,d){return a.startState?a.startState(b,d):!0};var m=CodeMirror.modes={},f=CodeMirror.mimeModes={};CodeMirror.defineMode=\nfunction(a,b){2<arguments.length&&(b.dependencies=Array.prototype.slice.call(arguments,2));m[a]=b};CodeMirror.defineMIME=function(a,b){f[a]=b};CodeMirror.resolveMode=function(a){\"string\"==typeof a&&f.hasOwnProperty(a)?a=f[a]:a&&\"string\"==typeof a.name&&f.hasOwnProperty(a.name)&&(a=f[a.name]);return\"string\"==typeof a?{name:a}:a||{name:\"null\"}};CodeMirror.getMode=function(a,b){b=CodeMirror.resolveMode(b);var d=m[b.name];if(!d)throw Error(\"Unknown mode: \"+b);return d(a,b)};CodeMirror.registerHelper=\nCodeMirror.registerGlobalHelper=Math.min;CodeMirror.defineMode(\"null\",function(){return{token:function(a){a.skipToEnd()}}});CodeMirror.defineMIME(\"text/plain\",\"null\");CodeMirror.runMode=function(a,b,d,c){b=CodeMirror.getMode({indentUnit:2},b);if(1==d.nodeType){var f=c&&c.tabSize||4,l=d,h=0;l.innerHTML=\"\";d=function(a,b){if(\"\\n\"==a)l.appendChild(document.createElement(\"br\")),h=0;else{for(var d=\"\",c=0;;){var e=a.indexOf(\"\\t\",c);if(-1==e){d+=a.slice(c);h+=a.length-c;break}else{h+=e-c;d+=a.slice(c,e);\nc=f-h%f;h+=c;for(var g=0;g<c;++g)d+=\" \";c=e+1}}b?(a=l.appendChild(document.createElement(\"span\")),a.className=\"cm-\"+b.replace(/ +/g,\" cm-\"),a.appendChild(document.createTextNode(d))):l.appendChild(document.createTextNode(d))}}}a=a.split(/\\r?\\n|\\r/);c=c&&c.state||CodeMirror.startState(b);for(var g=0,k=a.length;g<k;++g){g&&d(\"\\n\");var e=new CodeMirror.StringStream(a[g]);for(!e.string&&b.blankLine&&b.blankLine(c);!e.eol();){var m=b.token(e,c);d(e.current(),m,g,e.start,c);e.start=e.pos}}}})();\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/runmode/runmode.js",
    "content": "'use strict';(function(a){\"object\"==typeof exports&&\"object\"==typeof module?a(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],a):a(CodeMirror)})(function(a){a.runMode=function(k,c,f,d){c=a.getMode(a.defaults,c);var n=/MSIE \\d/.test(navigator.userAgent)&&(null==document.documentMode||9>document.documentMode);if(f.appendChild){var m=d&&d.tabSize||a.defaults.tabSize,l=f,g=0;l.innerHTML=\"\";f=function(a,d){if(\"\\n\"==a)l.appendChild(document.createTextNode(n?\n\"\\r\":a)),g=0;else{for(var b=\"\",e=0;;){var c=a.indexOf(\"\\t\",e);if(-1==c){b+=a.slice(e);g+=a.length-e;break}else{g+=c-e;b+=a.slice(e,c);e=m-g%m;g+=e;for(var f=0;f<e;++f)b+=\" \";e=c+1}}d?(a=l.appendChild(document.createElement(\"span\")),a.className=\"cm-\"+d.replace(/ +/g,\" cm-\"),a.appendChild(document.createTextNode(b))):l.appendChild(document.createTextNode(b))}}}k=a.splitLines(k);d=d&&d.state||a.startState(c);for(var h=0,p=k.length;h<p;++h){h&&f(\"\\n\");var b=new a.StringStream(k[h]);for(!b.string&&c.blankLine&&\nc.blankLine(d);!b.eol();){var q=c.token(b,d);f(b.current(),q,h,b.start,d);b.start=b.pos}}}});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/runmode/runmode.node.js",
    "content": "'use strict';function splitLines(a){return a.split(/\\r\\n?|\\n/)}var countColumn=function(a,b,d,c,e){null==b&&(b=a.search(/[^\\s\\u00a0]/),-1==b&&(b=a.length));c=c||0;for(e=e||0;;){var g=a.indexOf(\"\\t\",c);if(0>g||g>=b)return e+(b-c);e+=g-c;e+=d-e%d;c=g+1}};function StringStream(a,b){this.pos=this.start=0;this.string=a;this.tabSize=b||8;this.lineStart=this.lastColumnPos=this.lastColumnValue=0}\nStringStream.prototype={eol:function(){return this.pos>=this.string.length},sol:function(){return this.pos==this.lineStart},peek:function(){return this.string.charAt(this.pos)||void 0},next:function(){if(this.pos<this.string.length)return this.string.charAt(this.pos++)},eat:function(a){var b=this.string.charAt(this.pos);if(\"string\"==typeof a?b==a:b&&(a.test?a.test(b):a(b)))return++this.pos,b},eatWhile:function(a){for(var b=this.pos;this.eat(a););return this.pos>b},eatSpace:function(){for(var a=this.pos;/[\\s\\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;\nreturn this.pos>a},skipToEnd:function(){this.pos=this.string.length},skipTo:function(a){a=this.string.indexOf(a,this.pos);if(-1<a)return this.pos=a,!0},backUp:function(a){this.pos-=a},column:function(){this.lastColumnPos<this.start&&(this.lastColumnValue=countColumn(this.string,this.start,this.tabSize,this.lastColumnPos,this.lastColumnValue),this.lastColumnPos=this.start);return this.lastColumnValue-(this.lineStart?countColumn(this.string,this.lineStart,this.tabSize):0)},indentation:function(){return countColumn(this.string,\nnull,this.tabSize)-(this.lineStart?countColumn(this.string,this.lineStart,this.tabSize):0)},match:function(a,b,d){if(\"string\"==typeof a){var c=function(a){return d?a.toLowerCase():a},e=this.string.substr(this.pos,a.length);if(c(e)==c(a))return!1!==b&&(this.pos+=a.length),!0}else{if((a=this.string.slice(this.pos).match(a))&&0<a.index)return null;a&&!1!==b&&(this.pos+=a[0].length);return a}},current:function(){return this.string.slice(this.start,this.pos)},hideFirstChars:function(a,b){this.lineStart+=\na;try{return b()}finally{this.lineStart-=a}}};exports.StringStream=StringStream;exports.startState=function(a,b,d){return a.startState?a.startState(b,d):!0};var modes=exports.modes={},mimeModes=exports.mimeModes={};exports.defineMode=function(a,b){2<arguments.length&&(b.dependencies=Array.prototype.slice.call(arguments,2));modes[a]=b};exports.defineMIME=function(a,b){mimeModes[a]=b};exports.defineMode(\"null\",function(){return{token:function(a){a.skipToEnd()}}});exports.defineMIME(\"text/plain\",\"null\");\nexports.resolveMode=function(a){\"string\"==typeof a&&mimeModes.hasOwnProperty(a)?a=mimeModes[a]:a&&\"string\"==typeof a.name&&mimeModes.hasOwnProperty(a.name)&&(a=mimeModes[a.name]);return\"string\"==typeof a?{name:a}:a||{name:\"null\"}};function copyObj(a,b,d){b||(b={});for(var c in a)!a.hasOwnProperty(c)||!1===d&&b.hasOwnProperty(c)||(b[c]=a[c]);return b}var modeExtensions=exports.modeExtensions={};\nexports.extendMode=function(a,b){a=modeExtensions.hasOwnProperty(a)?modeExtensions[a]:modeExtensions[a]={};copyObj(b,a)};\nexports.getMode=function(a,b){b=exports.resolveMode(b);var d=modes[b.name];if(!d)return exports.getMode(a,\"text/plain\");a=d(a,b);if(modeExtensions.hasOwnProperty(b.name)){var d=modeExtensions[b.name],c;for(c in d)d.hasOwnProperty(c)&&(a.hasOwnProperty(c)&&(a[\"_\"+c]=a[c]),a[c]=d[c])}a.name=b.name;b.helperType&&(a.helperType=b.helperType);if(b.modeProps)for(c in b.modeProps)a[c]=b.modeProps[c];return a};exports.registerHelper=exports.registerGlobalHelper=Math.min;\nexports.runMode=function(a,b,d,c){b=exports.getMode({indentUnit:2},b);a=splitLines(a);c=c&&c.state||exports.startState(b);for(var e=0,g=a.length;e<g;++e){e&&d(\"\\n\");var f=new exports.StringStream(a[e]);for(!f.string&&b.blankLine&&b.blankLine(c);!f.eol();){var h=b.token(f,c);d(f.current(),h,e,f.start,c);f.start=f.pos}}};require.cache[require.resolve(\"../../lib/codemirror\")]=require.cache[require.resolve(\"./runmode.node\")];require.cache[require.resolve(\"../../addon/runmode/runmode\")]=require.cache[require.resolve(\"./runmode.node\")];\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/scroll/annotatescrollbar.js",
    "content": "'use strict';(function(b){\"object\"==typeof exports&&\"object\"==typeof module?b(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],b):b(CodeMirror)})(function(b){function e(a,f){function c(a){clearTimeout(d.doRedraw);d.doRedraw=setTimeout(function(){d.redraw()},a)}this.cm=a;this.options=f;this.buttonHeight=f.scrollButtonHeight||a.getOption(\"scrollButtonHeight\");this.annotations=[];this.doRedraw=this.doUpdate=null;this.div=a.getWrapperElement().appendChild(document.createElement(\"div\"));\nthis.div.style.cssText=\"position: absolute; right: 0; top: 0; z-index: 7; pointer-events: none\";this.computeScale();var d=this;a.on(\"refresh\",this.resizeHandler=function(){clearTimeout(d.doUpdate);d.doUpdate=setTimeout(function(){d.computeScale()&&c(20)},100)});a.on(\"markerAdded\",this.resizeHandler);a.on(\"markerCleared\",this.resizeHandler);if(!1!==f.listenForChanges)a.on(\"change\",this.changeHandler=function(){c(250)})}b.defineExtension(\"annotateScrollbar\",function(a){\"string\"==typeof a&&(a={className:a});\nreturn new e(this,a)});b.defineOption(\"scrollButtonHeight\",0);e.prototype.computeScale=function(){var a=this.cm,a=(a.getWrapperElement().clientHeight-a.display.barHeight-2*this.buttonHeight)/a.getScrollerElement().scrollHeight;if(a!=this.hScale)return this.hScale=a,!0};e.prototype.update=function(a){this.annotations=a;this.redraw()};e.prototype.redraw=function(a){function f(a,b){m!=a.line&&(m=a.line,l=c.getLineHandle(m));return e&&l.height>r?c.charCoords(a,\"local\")[b?\"top\":\"bottom\"]:c.heightAtLine(l,\n\"local\")+(b?0:l.height)}!1!==a&&this.computeScale();var c=this.cm;a=this.hScale;var d=document.createDocumentFragment(),b=this.annotations,e=c.getOption(\"lineWrapping\"),r=e&&1.5*c.defaultTextHeight(),m=null,l=null;if(c.display.barWidth)for(var g=0,n;g<b.length;g++){for(var h=b[g],p=n||f(h.from,!0)*a,k=f(h.to,!1)*a;g<b.length-1;){n=f(b[g+1].from,!0)*a;if(n>k+.9)break;h=b[++g];k=f(h.to,!1)*a}if(k!=p){var k=Math.max(k-p,3),q=d.appendChild(document.createElement(\"div\"));q.style.cssText=\"position: absolute; right: 0px; width: \"+\nMath.max(c.display.barWidth-1,2)+\"px; top: \"+(p+this.buttonHeight)+\"px; height: \"+k+\"px\";q.className=this.options.className;h.id&&q.setAttribute(\"annotation-id\",h.id)}}this.div.textContent=\"\";this.div.appendChild(d)};e.prototype.clear=function(){this.cm.off(\"refresh\",this.resizeHandler);this.cm.off(\"markerAdded\",this.resizeHandler);this.cm.off(\"markerCleared\",this.resizeHandler);this.changeHandler&&this.cm.off(\"change\",this.changeHandler);this.div.parentNode.removeChild(this.div)}});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/scroll/scrollpastend.js",
    "content": "'use strict';(function(c){\"object\"==typeof exports&&\"object\"==typeof module?c(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],c):c(CodeMirror)})(function(c){function e(a,b){c.changeEnd(b).line==a.lastLine()&&d(a)}function d(a){var b=\"\";if(1<a.lineCount())var b=a.display.scroller.clientHeight-30,c=a.getLineHandle(a.lastLine()).height,b=b-c+\"px\";a.state.scrollPastEndPadding!=b&&(a.state.scrollPastEndPadding=b,a.display.lineSpace.parentNode.style.paddingBottom=\nb,a.off(\"refresh\",d),a.setSize(),a.on(\"refresh\",d))}c.defineOption(\"scrollPastEnd\",!1,function(a,b,f){f&&f!=c.Init&&(a.off(\"change\",e),a.off(\"refresh\",d),a.display.lineSpace.parentNode.style.paddingBottom=\"\",a.state.scrollPastEndPadding=null);b&&(a.on(\"change\",e),a.on(\"refresh\",d),d(a))})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/scroll/simplescrollbars.css",
    "content": ".CodeMirror-simplescroll-horizontal div,.CodeMirror-simplescroll-vertical div{position:absolute;background:#ccc;-moz-box-sizing:border-box;box-sizing:border-box;border:1px solid #bbb;border-radius:2px}.CodeMirror-simplescroll-horizontal,.CodeMirror-simplescroll-vertical{position:absolute;z-index:6;background:#eee}.CodeMirror-simplescroll-horizontal{bottom:0;left:0;height:8px}.CodeMirror-simplescroll-horizontal div{bottom:0;height:100%}.CodeMirror-simplescroll-vertical{right:0;top:0;width:8px}.CodeMirror-simplescroll-vertical div{right:0;width:100%}.CodeMirror-overlayscroll .CodeMirror-gutter-filler,.CodeMirror-overlayscroll .CodeMirror-scrollbar-filler{display:none}.CodeMirror-overlayscroll-horizontal div,.CodeMirror-overlayscroll-vertical div{position:absolute;background:#bcd;border-radius:3px}.CodeMirror-overlayscroll-horizontal,.CodeMirror-overlayscroll-vertical{position:absolute;z-index:6}.CodeMirror-overlayscroll-horizontal{bottom:0;left:0;height:6px}.CodeMirror-overlayscroll-horizontal div{bottom:0;height:100%}.CodeMirror-overlayscroll-vertical{right:0;top:0;width:6px}.CodeMirror-overlayscroll-vertical div{right:0;width:100%}"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/scroll/simplescrollbars.js",
    "content": "'use strict';(function(c){\"object\"==typeof exports&&\"object\"==typeof module?c(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],c):c(CodeMirror)})(function(c){function g(a,b,h){function e(a){var b=c.wheelEventPixels(a)[\"horizontal\"==d.orientation?\"x\":\"y\"],h=d.pos;d.moveTo(d.pos+b);d.pos!=h&&c.e_preventDefault(a)}this.orientation=b;this.scroll=h;this.screen=this.total=this.size=1;this.pos=0;this.node=document.createElement(\"div\");this.node.className=\na+\"-\"+b;this.inner=this.node.appendChild(document.createElement(\"div\"));var d=this;c.on(this.inner,\"mousedown\",function(a){function b(){c.off(document,\"mousemove\",h);c.off(document,\"mouseup\",b)}function h(a){if(1!=a.which)return b();d.moveTo(g+d.total/d.size*(a[e]-f))}if(1==a.which){c.e_preventDefault(a);var e=\"horizontal\"==d.orientation?\"pageX\":\"pageY\",f=a[e],g=d.pos;c.on(document,\"mousemove\",h);c.on(document,\"mouseup\",b)}});c.on(this.node,\"click\",function(a){c.e_preventDefault(a);var b=d.inner.getBoundingClientRect();\nd.moveTo(d.pos+(\"horizontal\"==d.orientation?a.clientX<b.left?-1:a.clientX>b.right?1:0:a.clientY<b.top?-1:a.clientY>b.bottom?1:0)*d.screen)});c.on(this.node,\"mousewheel\",e);c.on(this.node,\"DOMMouseScroll\",e)}function f(a,b,c){this.addClass=a;this.horiz=new g(a,\"horizontal\",c);b(this.horiz.node);this.vert=new g(a,\"vertical\",c);b(this.vert.node);this.width=null}g.prototype.setPos=function(a,b){0>a&&(a=0);a>this.total-this.screen&&(a=this.total-this.screen);if(!b&&a==this.pos)return!1;this.pos=a;this.inner.style[\"horizontal\"==\nthis.orientation?\"left\":\"top\"]=this.size/this.total*a+\"px\";return!0};g.prototype.moveTo=function(a){this.setPos(a)&&this.scroll(a,this.orientation)};g.prototype.update=function(a,b,c){var e=this.screen!=b||this.total!=a||this.size!=c;e&&(this.screen=b,this.total=a,this.size=c);a=this.size/this.total*this.screen;10>a&&(this.size-=10-a,a=10);this.inner.style[\"horizontal\"==this.orientation?\"width\":\"height\"]=a+\"px\";this.setPos(this.pos,e)};f.prototype.update=function(a){if(null==this.width){var b=window.getComputedStyle?\nwindow.getComputedStyle(this.horiz.node):this.horiz.node.currentStyle;b&&(this.width=parseInt(b.height))}var b=this.width||0,c=a.scrollWidth>a.clientWidth+1,e=a.scrollHeight>a.clientHeight+1;this.vert.node.style.display=e?\"block\":\"none\";this.horiz.node.style.display=c?\"block\":\"none\";e&&(this.vert.update(a.scrollHeight,a.clientHeight,a.viewHeight-(c?b:0)),this.vert.node.style.bottom=c?b+\"px\":\"0\");c&&(this.horiz.update(a.scrollWidth,a.clientWidth,a.viewWidth-(e?b:0)-a.barLeft),this.horiz.node.style.right=\ne?b+\"px\":\"0\",this.horiz.node.style.left=a.barLeft+\"px\");return{right:e?b:0,bottom:c?b:0}};f.prototype.setScrollTop=function(a){this.vert.setPos(a)};f.prototype.setScrollLeft=function(a){this.horiz.setPos(a)};f.prototype.clear=function(){var a=this.horiz.node.parentNode;a.removeChild(this.horiz.node);a.removeChild(this.vert.node)};c.scrollbarModel.simple=function(a,b){return new f(\"CodeMirror-simplescroll\",a,b)};c.scrollbarModel.overlay=function(a,b){return new f(\"CodeMirror-overlayscroll\",a,b)}});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/search/jump-to-line.js",
    "content": "'use strict';(function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\"),require(\"../dialog/dialog\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\",\"../dialog/dialog\"],e):e(CodeMirror)})(function(e){function g(a,d,b,c,e){a.openDialog?a.openDialog(d,e,{value:c,selectValueOnOpen:!0}):e(prompt(b,c))}function f(a,d){var b=Number(d);return/^[-+]/.test(d)?a.getCursor().line+b:b-1}e.commands.jumpToLine=function(a){var d=a.getCursor();g(a,'Jump to line: <input type=\"text\" style=\"width: 10em\" class=\"CodeMirror-search-field\"/> <span style=\"color: #888\" class=\"CodeMirror-search-hint\">(Use line:column or scroll% syntax)</span>',\n\"Jump to line:\",d.line+1+\":\"+d.ch,function(b){if(b){var c;(c=/^\\s*([\\+\\-]?\\d+)\\s*\\:\\s*(\\d+)\\s*$/.exec(b))?a.setCursor(f(a,c[1]),Number(c[2])):(c=/^\\s*([\\+\\-]?\\d+(\\.\\d+)?)\\%\\s*/.exec(b))?(b=Math.round(a.lineCount()*Number(c[1])/100),/^[-+]/.test(c[1])&&(b=d.line+b+1),a.setCursor(b-1,d.ch)):(c=/^\\s*\\:?\\s*([\\+\\-]?\\d+)\\s*/.exec(b))&&a.setCursor(f(a,c[1]),d.ch)}})};e.keyMap[\"default\"][\"Alt-G\"]=\"jumpToLine\"});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/search/match-highlighter.js",
    "content": "'use strict';(function(f){\"object\"==typeof exports&&\"object\"==typeof module?f(require(\"../../lib/codemirror\"),require(\"./matchesonscrollbar\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\",\"./matchesonscrollbar\"],f):f(CodeMirror)})(function(f){function q(a){this.options={};for(var b in g)this.options[b]=(a&&a.hasOwnProperty(b)?a:g)[b];this.matchesonscroll=this.overlay=this.timeout=null;this.active=!1}function h(a){var b=a.state.matchHighlighter;(b.active||a.hasFocus())&&k(a,\nb)}function l(a){var b=a.state.matchHighlighter;b.active||(b.active=!0,k(a,b))}function k(a,b){clearTimeout(b.timeout);b.timeout=setTimeout(function(){m(a)},b.options.delay)}function n(a,b,d,c){var e=a.state.matchHighlighter;a.addOverlay(e.overlay=r(b,d,c));e.options.annotateScrollbar&&a.showMatchesOnScrollbar&&(e.matchesonscroll=a.showMatchesOnScrollbar(d?new RegExp(\"\\\\b\"+b+\"\\\\b\"):b,!1,{className:\"CodeMirror-selection-highlight-scrollbar\"}))}function p(a){var b=a.state.matchHighlighter;b.overlay&&\n(a.removeOverlay(b.overlay),b.overlay=null,b.matchesonscroll&&(b.matchesonscroll.clear(),b.matchesonscroll=null))}function m(a){a.operation(function(){var b=a.state.matchHighlighter;p(a);if(!a.somethingSelected()&&b.options.showToken){for(var d=!0===b.options.showToken?/[\\w$]/:b.options.showToken,c=a.getCursor(),e=a.getLine(c.line),f=c=c.ch;c&&d.test(e.charAt(c-1));)--c;for(;f<e.length&&d.test(e.charAt(f));)++f;c<f&&n(a,e.slice(c,f),d,b.options.style)}else if(d=a.getCursor(\"from\"),e=a.getCursor(\"to\"),\nd.line==e.line){if(c=b.options.wordsOnly){a:if(null!==a.getRange(d,e).match(/^\\w+$/)){if(0<d.ch&&(c={line:d.line,ch:d.ch-1},c=a.getRange(c,d),null===c.match(/\\W/))){c=!1;break a}if(e.ch<a.getLine(d.line).length&&(c={line:e.line,ch:e.ch+1},c=a.getRange(e,c),null===c.match(/\\W/))){c=!1;break a}c=!0}else c=!1;c=!c}c||(d=a.getRange(d,e),b.options.trim&&(d=d.replace(/^\\s+|\\s+$/g,\"\")),d.length>=b.options.minChars&&n(a,d,!1,b.options.style))}})}function r(a,b,d){return{token:function(c){var e;if(e=c.match(a))(e=\n!b)||(e=(!c.start||!b.test(c.string.charAt(c.start-1)))&&(c.pos==c.string.length||!b.test(c.string.charAt(c.pos))));if(e)return d;c.next();c.skipTo(a.charAt(0))||c.skipToEnd()}}}var g={style:\"matchhighlight\",minChars:2,delay:100,wordsOnly:!1,annotateScrollbar:!1,showToken:!1,trim:!0};f.defineOption(\"highlightSelectionMatches\",!1,function(a,b,d){d&&d!=f.Init&&(p(a),clearTimeout(a.state.matchHighlighter.timeout),a.state.matchHighlighter=null,a.off(\"cursorActivity\",h),a.off(\"focus\",l));if(b){b=a.state.matchHighlighter=\nnew q(b);if(a.hasFocus())b.active=!0,m(a);else a.on(\"focus\",l);a.on(\"cursorActivity\",h)}})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/search/matchesonscrollbar.css",
    "content": ".CodeMirror-search-match{background:gold;border-top:1px solid orange;border-bottom:1px solid orange;-moz-box-sizing:border-box;box-sizing:border-box;opacity:.5}"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/search/matchesonscrollbar.js",
    "content": "'use strict';(function(d){\"object\"==typeof exports&&\"object\"==typeof module?d(require(\"../../lib/codemirror\"),require(\"./searchcursor\"),require(\"../scroll/annotatescrollbar\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\",\"./searchcursor\",\"../scroll/annotatescrollbar\"],d):d(CodeMirror)})(function(d){function g(a,c,b,e){this.cm=a;this.options=e;var f={listenForChanges:!1},d;for(d in e)f[d]=e[d];f.className||(f.className=\"CodeMirror-search-match\");this.annotation=a.annotateScrollbar(f);\nthis.query=c;this.caseFold=b;this.gap={from:a.firstLine(),to:a.lastLine()+1};this.matches=[];this.update=null;this.findMatches();this.annotation.update(this.matches);var g=this;a.on(\"change\",this.changeHandler=function(a,b){g.onChange(b)})}function h(a,c,b){return a<=c?a:Math.max(c,a+b)}d.defineExtension(\"showMatchesOnScrollbar\",function(a,c,b){\"string\"==typeof b&&(b={className:b});b||(b={});return new g(this,a,c,b)});g.prototype.findMatches=function(){if(this.gap){for(var a=0;a<this.matches.length;a++){var c=\nthis.matches[a];if(c.from.line>=this.gap.to)break;c.to.line>=this.gap.from&&this.matches.splice(a--,1)}for(var b=this.cm.getSearchCursor(this.query,d.Pos(this.gap.from,0),this.caseFold),e=this.options&&this.options.maxMatches||1E3;b.findNext();){c={from:b.from(),to:b.to()};if(c.from.line>=this.gap.to)break;this.matches.splice(a++,0,c);if(this.matches.length>e)break}this.gap=null}};g.prototype.onChange=function(a){var c=a.from.line,b=d.changeEnd(a).line,e=b-a.to.line;this.gap?(this.gap.from=Math.min(h(this.gap.from,\nc,e),a.from.line),this.gap.to=Math.max(h(this.gap.to,c,e),a.from.line)):this.gap={from:a.from.line,to:b+1};if(e)for(a=0;a<this.matches.length;a++){var b=this.matches[a],f=h(b.from.line,c,e);f!=b.from.line&&(b.from=d.Pos(f,b.from.ch));f=h(b.to.line,c,e);f!=b.to.line&&(b.to=d.Pos(f,b.to.ch))}clearTimeout(this.update);var g=this;this.update=setTimeout(function(){g.updateAfterChange()},250)};g.prototype.updateAfterChange=function(){this.findMatches();this.annotation.update(this.matches)};g.prototype.clear=\nfunction(){this.cm.off(\"change\",this.changeHandler);this.annotation.clear()}});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/search/search.js",
    "content": "'use strict';var $jscomp={scope:{},findInternal:function(b,h,e){b instanceof String&&(b=String(b));for(var k=b.length,g=0;g<k;g++){var l=b[g];if(h.call(e,l,g,b))return{i:g,v:l}}return{i:-1,v:void 0}}};$jscomp.defineProperty=\"function\"==typeof Object.defineProperties?Object.defineProperty:function(b,h,e){if(e.get||e.set)throw new TypeError(\"ES3 does not support getters and setters.\");b!=Array.prototype&&b!=Object.prototype&&(b[h]=e.value)};\n$jscomp.getGlobal=function(b){return\"undefined\"!=typeof window&&window===b?b:\"undefined\"!=typeof global?global:b};$jscomp.global=$jscomp.getGlobal(this);$jscomp.polyfill=function(b,h,e,k){if(h){e=$jscomp.global;b=b.split(\".\");for(k=0;k<b.length-1;k++){var g=b[k];g in e||(e[g]={});e=e[g]}b=b[b.length-1];k=e[b];h=h(k);h!=k&&null!=h&&$jscomp.defineProperty(e,b,{configurable:!0,writable:!0,value:h})}};\n$jscomp.polyfill(\"Array.prototype.find\",function(b){return b?b:function(b,e){return $jscomp.findInternal(this,b,e).v}},\"es6-impl\",\"es3\");\n(function(b){\"object\"==typeof exports&&\"object\"==typeof module?b(require(\"../../lib/codemirror\"),require(\"./searchcursor\"),require(\"../dialog/dialog\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\",\"./searchcursor\",\"../dialog/dialog\"],b):b(CodeMirror)})(function(b){function h(a,c){\"string\"==typeof a?a=new RegExp(a.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g,\"\\\\$&\"),c?\"gi\":\"g\"):a.global||(a=new RegExp(a.source,a.ignoreCase?\"gi\":\"g\"));return{token:function(c){a.lastIndex=c.pos;\nvar b=a.exec(c.string);if(b&&b.index==c.pos)return c.pos+=b[0].length||1,\"searching\";b?c.pos=b.index:c.skipToEnd()}}}function e(){this.overlay=this.posFrom=this.posTo=this.lastQuery=this.query=null}function k(a){return a.state.search||(a.state.search=new e)}function g(a){return\"string\"==typeof a&&a==a.toLowerCase()}function l(a,c,b){return a.getSearchCursor(c,b,g(c))}function y(a,c,b,f,d){a.openDialog(c,f,{value:b,selectValueOnOpen:!0,closeOnEnter:!1,onClose:function(){n(a)},onKeyDown:d})}function r(a,\nc,b,f,d){a.openDialog?a.openDialog(c,d,{value:f,selectValueOnOpen:!0}):d(prompt(b,f))}function z(a,c,b,f){if(a.openConfirm)a.openConfirm(c,f);else if(confirm(b))f[0]()}function u(a){return a.replace(/\\\\(.)/g,function(a,b){return\"n\"==b?\"\\n\":\"r\"==b?\"\\r\":b})}function v(a){var b=a.match(/^\\/(.*)\\/([a-z]*)$/);if(b)try{a=new RegExp(b[1],-1==b[2].indexOf(\"i\")?\"\":\"i\")}catch(A){}else a=u(a);if(\"string\"==typeof a?\"\"==a:a.test(\"\"))a=/x^/;return a}function p(a,b,e){b.queryText=e;b.query=v(e);a.removeOverlay(b.overlay,\ng(b.query));b.overlay=h(b.query,g(b.query));a.addOverlay(b.overlay);a.showMatchesOnScrollbar&&(b.annotate&&(b.annotate.clear(),b.annotate=null),b.annotate=a.showMatchesOnScrollbar(b.query,g(b.query)))}function m(a,c,e,f){var d=k(a);if(d.query)return q(a,c);var g=a.getSelection()||d.lastQuery;if(e&&a.openDialog){var t=null,h=function(c,f){b.e_stop(f);c&&(c!=d.queryText&&(p(a,d,c),d.posFrom=d.posTo=a.getCursor()),t&&(t.style.opacity=1),q(a,f.shiftKey,function(b,c){var d;3>c.line&&document.querySelector&&\n(d=a.display.wrapper.querySelector(\".CodeMirror-dialog\"))&&d.getBoundingClientRect().bottom-4>a.cursorCoords(c,\"window\").top&&((t=d).style.opacity=.4)}))};y(a,'Search: <input type=\"text\" style=\"width: 10em\" class=\"CodeMirror-search-field\"/> <span style=\"color: #888\" class=\"CodeMirror-search-hint\">(Use /re/ syntax for regexp search)</span>',g,h,function(c,d){var f=b.keyName(c),e=b.keyMap[a.getOption(\"keyMap\")][f];e||(e=a.getOption(\"extraKeys\")[f]);if(\"findNext\"==e||\"findPrev\"==e||\"findPersistentNext\"==\ne||\"findPersistentPrev\"==e)b.e_stop(c),p(a,k(a),d),a.execCommand(e);else if(\"find\"==e||\"findPersistent\"==e)b.e_stop(c),h(d,c)});f&&g&&(p(a,d,g),q(a,c))}else r(a,'Search: <input type=\"text\" style=\"width: 10em\" class=\"CodeMirror-search-field\"/> <span style=\"color: #888\" class=\"CodeMirror-search-hint\">(Use /re/ syntax for regexp search)</span>',\"Search for:\",g,function(b){b&&!d.query&&a.operation(function(){p(a,d,b);d.posFrom=d.posTo=a.getCursor();q(a,c)})})}function q(a,c,e){a.operation(function(){var f=\nk(a),d=l(a,f.query,c?f.posFrom:f.posTo);if(!d.find(c)&&(d=l(a,f.query,c?b.Pos(a.lastLine()):b.Pos(a.firstLine(),0)),!d.find(c)))return;a.setSelection(d.from(),d.to());a.scrollIntoView({from:d.from(),to:d.to()},20);f.posFrom=d.from();f.posTo=d.to();e&&e(d.from(),d.to())})}function n(a){a.operation(function(){var b=k(a);if(b.lastQuery=b.query)b.query=b.queryText=null,a.removeOverlay(b.overlay),b.annotate&&(b.annotate.clear(),b.annotate=null)})}function w(a,b,e){a.operation(function(){for(var c=l(a,\nb);c.findNext();)if(\"string\"!=typeof b){var d=a.getRange(c.from(),c.to()).match(b);c.replace(e.replace(/\\$(\\d)/g,function(a,b){return d[b]}))}else c.replace(e)})}function x(a,b){if(!a.getOption(\"readOnly\")){var c=a.getSelection()||k(a).lastQuery,e=b?\"Replace all:\":\"Replace:\";r(a,e+' <input type=\"text\" style=\"width: 10em\" class=\"CodeMirror-search-field\"/> <span style=\"color: #888\" class=\"CodeMirror-search-hint\">(Use /re/ syntax for regexp search)</span>',e,c,function(c){c&&(c=v(c),r(a,'With: <input type=\"text\" style=\"width: 10em\" class=\"CodeMirror-search-field\"/>',\n\"Replace with:\",\"\",function(e){e=u(e);if(b)w(a,c,e);else{n(a);var d=l(a,c,a.getCursor(\"from\")),f=function(){var b=d.from(),h;if(!(h=d.findNext())&&(d=l(a,c),!(h=d.findNext())||b&&d.from().line==b.line&&d.from().ch==b.ch))return;a.setSelection(d.from(),d.to());a.scrollIntoView({from:d.from(),to:d.to()});z(a,\"Replace? <button>Yes</button> <button>No</button> <button>All</button> <button>Stop</button>\",\"Replace?\",[function(){g(h)},f,function(){w(a,c,e)}])},g=function(a){d.replace(\"string\"==typeof c?\ne:e.replace(/\\$(\\d)/g,function(b,c){return a[c]}));f()};f()}}))})}}b.commands.find=function(a){n(a);m(a)};b.commands.findPersistent=function(a){n(a);m(a,!1,!0)};b.commands.findPersistentNext=function(a){m(a,!1,!0,!0)};b.commands.findPersistentPrev=function(a){m(a,!0,!0,!0)};b.commands.findNext=m;b.commands.findPrev=function(a){m(a,!0)};b.commands.clearSearch=n;b.commands.replace=x;b.commands.replaceAll=function(a){x(a,!0)}});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/search/searchcursor.js",
    "content": "'use strict';var $jscomp={scope:{},findInternal:function(a,e,k){a instanceof String&&(a=String(a));for(var g=a.length,b=0;b<g;b++){var d=a[b];if(e.call(k,d,b,a))return{i:b,v:d}}return{i:-1,v:void 0}}};$jscomp.defineProperty=\"function\"==typeof Object.defineProperties?Object.defineProperty:function(a,e,k){if(k.get||k.set)throw new TypeError(\"ES3 does not support getters and setters.\");a!=Array.prototype&&a!=Object.prototype&&(a[e]=k.value)};\n$jscomp.getGlobal=function(a){return\"undefined\"!=typeof window&&window===a?a:\"undefined\"!=typeof global?global:a};$jscomp.global=$jscomp.getGlobal(this);$jscomp.polyfill=function(a,e,k,g){if(e){k=$jscomp.global;a=a.split(\".\");for(g=0;g<a.length-1;g++){var b=a[g];b in k||(k[b]={});k=k[b]}a=a[a.length-1];g=k[a];e=e(g);e!=g&&null!=e&&$jscomp.defineProperty(k,a,{configurable:!0,writable:!0,value:e})}};\n$jscomp.polyfill(\"Array.prototype.find\",function(a){return a?a:function(a,k){return $jscomp.findInternal(this,a,k).v}},\"es6-impl\",\"es3\");\n(function(a){\"object\"==typeof exports&&\"object\"==typeof module?a(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],a):a(CodeMirror)})(function(a){function e(b,a,h,q){this.atOccurrence=!1;this.doc=b;null==q&&\"string\"==typeof a&&(q=!1);h=h?b.clipPos(h):g(0,0);this.pos={from:h,to:h};if(\"string\"!=typeof a)a.global||(a=new RegExp(a.source,a.ignoreCase?\"ig\":\"g\")),this.matches=function(m,f){if(m){a.lastIndex=0;m=b.getLine(f.line).slice(0,f.ch);for(var l=\n0,c,d;;){a.lastIndex=l;l=a.exec(m);if(!l)break;c=l;d=c.index;l=c.index+(c[0].length||1);if(l==m.length)break}(l=c&&c[0].length||0)||(0==d&&0==m.length?c=void 0:d!=b.getLine(f.line).length&&l++)}else a.lastIndex=f.ch,m=b.getLine(f.line),l=(c=a.exec(m))&&c[0].length||0,d=c&&c.index,d+l==m.length||l||(l=1);if(c&&l)return{from:g(f.line,d),to:g(f.line,d+l),match:c}};else{var d=a;q&&(a=a.toLowerCase());var e=q?function(a){return a.toLowerCase()}:function(a){return a},n=a.split(\"\\n\");if(1==n.length)this.matches=\na.length?function(m,f){if(m){m=b.getLine(f.line).slice(0,f.ch);var l=e(m),c=l.lastIndexOf(a);if(-1<c)return c=k(m,l,c),{from:g(f.line,c),to:g(f.line,c+d.length)}}else if(m=b.getLine(f.line).slice(f.ch),l=e(m),c=l.indexOf(a),-1<c)return c=k(m,l,c)+f.ch,{from:g(f.line,c),to:g(f.line,c+d.length)}}:function(){};else{var p=d.split(\"\\n\");this.matches=function(a,f){var d=n.length-1;if(a){if(!(f.line-(n.length-1)<b.firstLine()||e(b.getLine(f.line).slice(0,p[d].length))!=n[n.length-1])){a=g(f.line,p[d].length);\nf=f.line-1;for(var c=d-1;1<=c;--c,--f)if(n[c]!=e(b.getLine(f)))return;var c=b.getLine(f),h=c.length-p[0].length;return e(c.slice(h))!=n[0]?void 0:{from:g(f,h),to:a}}}else if(!(f.line+(n.length-1)>b.lastLine())&&(c=b.getLine(f.line),h=c.length-p[0].length,e(c.slice(h))==n[0])){a=g(f.line,h);f=f.line+1;for(c=1;c<d;++c,++f)if(n[c]!=e(b.getLine(f)))return;return e(b.getLine(f).slice(0,p[d].length))!=n[d]?void 0:{from:a,to:g(f,p[d].length)}}}}}}function k(a,d,h){if(a.length==d.length)return h;for(d=Math.min(h,\na.length);;){var b=a.slice(0,d).toLowerCase().length;if(b<h)++d;else if(b>h)--d;else return d}}var g=a.Pos;e.prototype={findNext:function(){return this.find(!1)},findPrevious:function(){return this.find(!0)},find:function(a){function b(a){a=g(a,0);h.pos={from:a,to:a};return h.atOccurrence=!1}for(var h=this,e=this.doc.clipPos(a?this.pos.from:this.pos.to);;){if(this.pos=this.matches(a,e))return this.atOccurrence=!0,this.pos.match||!0;if(a){if(!e.line)return b(0);e=g(e.line-1,this.doc.getLine(e.line-\n1).length)}else{var k=this.doc.lineCount();if(e.line==k-1)return b(k);e=g(e.line+1,0)}}},from:function(){if(this.atOccurrence)return this.pos.from},to:function(){if(this.atOccurrence)return this.pos.to},replace:function(b,d){this.atOccurrence&&(b=a.splitLines(b),this.doc.replaceRange(b,this.pos.from,this.pos.to,d),this.pos.to=g(this.pos.from.line+b.length-1,b[b.length-1].length+(1==b.length?this.pos.from.ch:0)))}};a.defineExtension(\"getSearchCursor\",function(a,d,h){return new e(this.doc,a,d,h)});\na.defineDocExtension(\"getSearchCursor\",function(a,d,h){return new e(this,a,d,h)});a.defineExtension(\"selectMatches\",function(b,d){var e=[];for(b=this.getSearchCursor(b,this.getCursor(\"from\"),d);b.findNext()&&!(0<a.cmpPos(b.to(),this.getCursor(\"to\")));)e.push({anchor:b.from(),head:b.to()});e.length&&this.setSelections(e,0)})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/selection/active-line.js",
    "content": "'use strict';(function(d){\"object\"==typeof exports&&\"object\"==typeof module?d(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],d):d(CodeMirror)})(function(d){function f(a){for(var b=0;b<a.state.activeLines.length;b++)a.removeLineClass(a.state.activeLines[b],\"wrap\",\"CodeMirror-activeline\"),a.removeLineClass(a.state.activeLines[b],\"background\",\"CodeMirror-activeline-background\"),a.removeLineClass(a.state.activeLines[b],\"gutter\",\"CodeMirror-activeline-gutter\")}\nfunction k(a,b){if(a.length!=b.length)return!1;for(var c=0;c<a.length;c++)if(a[c]!=b[c])return!1;return!0}function g(a,b){for(var c=[],d=0;d<b.length;d++){var e=b[d];e.empty()&&(e=a.getLineHandleVisualStart(e.head.line),c[c.length-1]!=e&&c.push(e))}k(a.state.activeLines,c)||a.operation(function(){f(a);for(var b=0;b<c.length;b++)a.addLineClass(c[b],\"wrap\",\"CodeMirror-activeline\"),a.addLineClass(c[b],\"background\",\"CodeMirror-activeline-background\"),a.addLineClass(c[b],\"gutter\",\"CodeMirror-activeline-gutter\");\na.state.activeLines=c})}function h(a,b){g(a,b.ranges)}d.defineOption(\"styleActiveLine\",!1,function(a,b,c){c=c&&c!=d.Init;b&&!c?(a.state.activeLines=[],g(a,a.listSelections()),a.on(\"beforeSelectionChange\",h)):!b&&c&&(a.off(\"beforeSelectionChange\",h),f(a),delete a.state.activeLines)})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/selection/mark-selection.js",
    "content": "'use strict';var $jscomp={scope:{},findInternal:function(a,d,c){a instanceof String&&(a=String(a));for(var e=a.length,g=0;g<e;g++){var h=a[g];if(d.call(c,h,g,a))return{i:g,v:h}}return{i:-1,v:void 0}}};$jscomp.defineProperty=\"function\"==typeof Object.defineProperties?Object.defineProperty:function(a,d,c){if(c.get||c.set)throw new TypeError(\"ES3 does not support getters and setters.\");a!=Array.prototype&&a!=Object.prototype&&(a[d]=c.value)};\n$jscomp.getGlobal=function(a){return\"undefined\"!=typeof window&&window===a?a:\"undefined\"!=typeof global?global:a};$jscomp.global=$jscomp.getGlobal(this);$jscomp.polyfill=function(a,d,c,e){if(d){c=$jscomp.global;a=a.split(\".\");for(e=0;e<a.length-1;e++){var g=a[e];g in c||(c[g]={});c=c[g]}a=a[a.length-1];e=c[a];d=d(e);d!=e&&null!=d&&$jscomp.defineProperty(c,a,{configurable:!0,writable:!0,value:d})}};\n$jscomp.polyfill(\"Array.prototype.find\",function(a){return a?a:function(a,c){return $jscomp.findInternal(this,a,c).v}},\"es6-impl\",\"es3\");\n(function(a){\"object\"==typeof exports&&\"object\"==typeof module?a(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],a):a(CodeMirror)})(function(a){function d(b){b.operation(function(){r(b)})}function c(b){b.state.markedSelection.length&&b.operation(function(){g(b)})}function e(b,a,f,c){if(0!=l(a,f))for(var n=b.state.markedSelection,e=b.state.markedSelectionStyle,g=a.line;;){var d=g==a.line?a:q(g,0),g=g+m,p=g>=f.line,h=p?f:q(g,0),d=b.markText(d,h,\n{className:e});null==c?n.push(d):n.splice(c++,0,d);if(p)break}}function g(b){b=b.state.markedSelection;for(var a=0;a<b.length;++a)b[a].clear();b.length=0}function h(a){g(a);for(var b=a.listSelections(),f=0;f<b.length;f++)e(a,b[f].from(),b[f].to())}function r(a){if(!a.somethingSelected())return g(a);if(1<a.listSelections().length)return h(a);var b=a.getCursor(\"start\"),f=a.getCursor(\"end\"),c=a.state.markedSelection;if(!c.length)return e(a,b,f);var d=c[0].find(),k=c[c.length-1].find();if(!d||!k||f.line-\nb.line<m||0<=l(b,k.to)||0>=l(f,d.from))return h(a);for(;0<l(b,d.from);)c.shift().clear(),d=c[0].find();0>l(b,d.from)&&(d.to.line-b.line<m?(c.shift().clear(),e(a,b,d.to,0)):e(a,b,d.from,0));for(;0>l(f,k.to);)c.pop().clear(),k=c[c.length-1].find();0<l(f,k.to)&&(f.line-k.from.line<m?(c.pop().clear(),e(a,k.from,f)):e(a,k.to,f))}a.defineOption(\"styleSelectedText\",!1,function(b,e,f){f=f&&f!=a.Init;e&&!f?(b.state.markedSelection=[],b.state.markedSelectionStyle=\"string\"==typeof e?e:\"CodeMirror-selectedtext\",\nh(b),b.on(\"cursorActivity\",d),b.on(\"change\",c)):!e&&f&&(b.off(\"cursorActivity\",d),b.off(\"change\",c),g(b),b.state.markedSelection=b.state.markedSelectionStyle=null)});var m=8,q=a.Pos,l=a.cmpPos});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/selection/selection-pointer.js",
    "content": "'use strict';(function(c){\"object\"==typeof exports&&\"object\"==typeof module?c(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],c):c(CodeMirror)})(function(c){function e(b){b.state.selectionPointer.rects=null;f(b)}function f(b){b.state.selectionPointer.willUpdate||(b.state.selectionPointer.willUpdate=!0,setTimeout(function(){var a=b.state.selectionPointer;if(a){if(null==a.rects&&null!=a.mouseX&&(a.rects=[],b.somethingSelected()))for(var d=b.display.selectionDiv.firstChild;d;d=\nd.nextSibling)a.rects.push(d.getBoundingClientRect());d=!1;if(null!=a.mouseX)for(var g=0;g<a.rects.length;g++){var c=a.rects[g];c.left<=a.mouseX&&c.right>=a.mouseX&&c.top<=a.mouseY&&c.bottom>=a.mouseY&&(d=!0)}a=d?a.value:\"\";b.display.lineDiv.style.cursor!=a&&(b.display.lineDiv.style.cursor=a)}b.state.selectionPointer.willUpdate=!1},50))}c.defineOption(\"selectionPointer\",!1,function(b,a){var d=b.state.selectionPointer;d&&(c.off(b.getWrapperElement(),\"mousemove\",d.mousemove),c.off(b.getWrapperElement(),\n\"mouseout\",d.mouseout),c.off(window,\"scroll\",d.windowScroll),b.off(\"cursorActivity\",e),b.off(\"scroll\",e),b.state.selectionPointer=null,b.display.lineDiv.style.cursor=\"\");a&&(d=b.state.selectionPointer={value:\"string\"==typeof a?a:\"default\",mousemove:function(a){var c=b.state.selectionPointer;(null==a.buttons?a.which:a.buttons)?c.mouseX=c.mouseY=null:(c.mouseX=a.clientX,c.mouseY=a.clientY);f(b)},mouseout:function(a){b.getWrapperElement().contains(a.relatedTarget)||(a=b.state.selectionPointer,a.mouseX=\na.mouseY=null,f(b))},windowScroll:function(){e(b)},rects:null,mouseX:null,mouseY:null,willUpdate:!1},c.on(b.getWrapperElement(),\"mousemove\",d.mousemove),c.on(b.getWrapperElement(),\"mouseout\",d.mouseout),c.on(window,\"scroll\",d.windowScroll),b.on(\"cursorActivity\",e),b.on(\"scroll\",e))})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/tern/tern.css",
    "content": ".CodeMirror-Tern-completion{padding-left:22px;position:relative;line-height:1.5}.CodeMirror-Tern-completion:before{position:absolute;left:2px;bottom:2px;border-radius:50%;font-size:12px;font-weight:700;height:15px;width:15px;line-height:16px;text-align:center;color:#fff;-moz-box-sizing:border-box;box-sizing:border-box}.CodeMirror-Tern-completion-unknown:before{content:\"?\";background:#4bb}.CodeMirror-Tern-completion-object:before{content:\"O\";background:#77c}.CodeMirror-Tern-completion-fn:before{content:\"F\";background:#7c7}.CodeMirror-Tern-completion-array:before{content:\"A\";background:#c66}.CodeMirror-Tern-completion-number:before{content:\"1\";background:#999}.CodeMirror-Tern-completion-string:before{content:\"S\";background:#999}.CodeMirror-Tern-completion-bool:before{content:\"B\";background:#999}.CodeMirror-Tern-completion-guess{color:#999}.CodeMirror-Tern-tooltip{border:1px solid silver;border-radius:3px;color:#444;padding:2px 5px;font-size:90%;font-family:monospace;background-color:#fff;white-space:pre-wrap;max-width:40em;position:absolute;z-index:10;-webkit-box-shadow:2px 3px 5px rgba(0,0,0,.2);-moz-box-shadow:2px 3px 5px rgba(0,0,0,.2);box-shadow:2px 3px 5px rgba(0,0,0,.2);transition:opacity 1s;-moz-transition:opacity 1s;-webkit-transition:opacity 1s;-o-transition:opacity 1s;-ms-transition:opacity 1s}.CodeMirror-Tern-hint-doc{max-width:25em;margin-top:-3px}.CodeMirror-Tern-fname{color:#000}.CodeMirror-Tern-farg{color:#70a}.CodeMirror-Tern-farg-current{text-decoration:underline}.CodeMirror-Tern-type{color:#07c}.CodeMirror-Tern-fhint-guess{opacity:.7}"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/tern/tern.js",
    "content": "'use strict';(function(h){\"object\"==typeof exports&&\"object\"==typeof module?h(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],h):h(CodeMirror)})(function(h){function B(a,c,b){var d=a.docs[c];d?b(x(a,d)):a.options.getFile?a.options.getFile(c,b):b(null)}function u(a,c,b){for(var d in a.docs){var e=a.docs[d];if(e.doc==c)return e}if(!b)for(b=0;;++b)if(d=\"[doc\"+(b||\"\")+\"]\",!a.docs[d]){b=d;break}return a.addDoc(b,c)}function C(a,c){if(\"string\"==typeof c)return a.docs[c];\nc instanceof h&&(c=c.getDoc());if(c instanceof h.Doc)return u(a,c)}function L(a,c,b){var d=u(a,c),e=a.cachedArgHints;e&&e.doc==c&&0<=y(e.start,b.to)&&(a.cachedArgHints=null);e=d.changed;null==e&&(d.changed=e={from:b.from.line,to:b.from.line});var f=b.from.line+(b.text.length-1);b.from.line<e.to&&(e.to-=b.to.line-f);f>=e.to&&(e.to=f+1);e.from>b.from.line&&(e.from=b.from.line);c.lineCount()>D&&100<b.to-e.from&&setTimeout(function(){d.changed&&100<d.changed.to-d.changed.from&&E(a,d)},200)}function E(a,\nc){a.server.request({files:[{type:\"full\",name:c.name,text:x(a,c)}]},function(a){a?window.console.error(a):c.changed=null})}function M(a,c,b){a.request(c,{type:\"completions\",types:!0,docs:!0,urls:!0},function(d,e){if(d)return t(a,c,d);d=[];var f=\"\",g=e.start,v=e.end;'[\"'==c.getRange(q(g.line,g.ch-2),g)&&'\"]'!=c.getRange(v,q(v.line,v.ch+2))&&(f='\"]');for(var n=0;n<e.completions.length;++n){var l=e.completions[n],r=N(l.type);e.guess&&(r+=\" \"+k+\"guess\");d.push({text:l.name+f,displayText:l.displayName||\nl.name,className:r,data:l})}e={from:g,to:v,list:d};var m=null;h.on(e,\"close\",function(){w(m)});h.on(e,\"update\",function(){w(m)});h.on(e,\"select\",function(c,b){w(m);if(c=a.options.completionTip?a.options.completionTip(c.data):c.data.doc)m=A(b.parentNode.getBoundingClientRect().right+window.pageXOffset,b.getBoundingClientRect().top+window.pageYOffset,c),m.className+=\" \"+k+\"hint-doc\"});b(e)})}function N(a){a=\"?\"==a?\"unknown\":\"number\"==a||\"string\"==a||\"bool\"==a?a:/^fn\\(/.test(a)?\"fn\":/^\\[/.test(a)?\"array\":\n\"object\";return k+\"completion \"+k+\"completion-\"+a}function F(a,c,b,d,e){a.request(c,d,function(b,d){if(b)return t(a,c,b);if(a.options.typeTip)b=a.options.typeTip(d);else if(b=p(\"span\",null,p(\"strong\",null,d.type||\"not found\")),d.doc&&b.appendChild(document.createTextNode(\" \\u2014 \"+d.doc)),d.url){b.appendChild(document.createTextNode(\" \"));var g=b.appendChild(p(\"a\",null,\"[docs]\"));g.href=d.url;g.target=\"_blank\"}G(c,b,a);e&&e()},b)}function O(a,c){z(a);if(!c.somethingSelected()){var b=c.getTokenAt(c.getCursor()).state,\nb=h.innerMode(c.getMode(),b);if(\"javascript\"==b.mode.name&&(b=b.state.lexical,\"call\"==b.info)){for(var d,e=b.pos||0,f=c.getOption(\"tabSize\"),g=c.getCursor().line,v=Math.max(0,g-9),n=!1;g>=v;--g){for(var l=c.getLine(g),r=d=0;;){r=l.indexOf(\"\\t\",r);if(-1==r)break;d+=f-(r+d)%f-1;r+=1}d=b.column-d;if(\"(\"==l.charAt(d)){n=!0;break}}if(n){var m=q(g,d);if((b=a.cachedArgHints)&&b.doc==c.getDoc()&&0==y(m,b.start))return H(a,c,e);a.request(c,{type:\"type\",preferFunction:!0,end:m},function(b,d){!b&&d.type&&/^fn\\(/.test(d.type)&&\n(a.cachedArgHints={start:m,type:P(d.type),name:d.exprName||d.name||\"fn\",guess:d.guess,doc:c.getDoc()},H(a,c,e))})}}}}function H(a,c,b){z(a);for(var d=a.cachedArgHints,e=d.type,d=p(\"span\",d.guess?k+\"fhint-guess\":null,p(\"span\",k+\"fname\",d.name),\"(\"),f=0;f<e.args.length;++f){f&&d.appendChild(document.createTextNode(\", \"));var g=e.args[f];d.appendChild(p(\"span\",k+\"farg\"+(f==b?\" \"+k+\"farg-current\":\"\"),g.name||\"?\"));\"?\"!=g.type&&(d.appendChild(document.createTextNode(\":\\u00a0\")),d.appendChild(p(\"span\",\nk+\"type\",g.type)))}d.appendChild(document.createTextNode(e.rettype?\") ->\\u00a0\":\")\"));e.rettype&&d.appendChild(p(\"span\",k+\"type\",e.rettype));c=c.cursorCoords(null,\"page\");a.activeArgHints=A(c.right+1,c.bottom,d)}function P(a){function c(c){for(var b=0,e=d;;){var f=a.charAt(d);if(c.test(f)&&!b)return a.slice(e,d);/[{\\[\\(]/.test(f)?++b:/[}\\]\\)]/.test(f)&&--b;++d}}var b=[],d=3;if(\")\"!=a.charAt(d))for(;;){var e=a.slice(d).match(/^([^, \\(\\[\\{]+): /);e&&(d+=e[0].length,e=e[1]);b.push({name:e,type:c(/[\\),]/)});\nif(\")\"==a.charAt(d))break;d+=2}e=a.slice(d).match(/^\\) -> (.*)$/);return{args:b,rettype:e&&e[1]}}function Q(a,c){function b(b){b={type:\"definition\",variable:b||null};var d=u(a,c.getDoc());a.server.request(I(a,d,b),function(b,e){if(b)return t(a,c,b);if(!e.file&&e.url)window.open(e.url);else{if(e.file){b=a.docs[e.file];var f,g;if(g=b){var l;var h=b.doc;f=e.context.slice(0,e.contextOffset).split(\"\\n\");var m=e.start.line-(f.length-1);g=q(m,(1==f.length?e.start.ch:h.getLine(m).length)-f[0].length);for(var k=\nh.getLine(m).slice(g.ch),m=m+1;m<h.lineCount()&&k.length<e.context.length;++m)k+=\"\\n\"+h.getLine(m);if(k.slice(0,e.context.length)==e.context)l=e;else{h=h.getSearchCursor(e.context,0,!1);for(k=Infinity;h.findNext();){var m=h.from(),p=1E4*Math.abs(m.line-g.line);p||(p=Math.abs(m.ch-g.ch));p<k&&(l=m,k=p)}l?(1==f.length?l.ch+=f[0].length:l=q(l.line+(f.length-1),f[f.length-1].length),e=e.start.line==e.end.line?q(l.line,l.ch+(e.end.ch-e.start.ch)):q(l.line+(e.end.line-e.start.line),e.end.ch),l={start:l,\nend:e}):l=null}g=f=l}if(g){a.jumpStack.push({file:d.name,start:c.getCursor(\"from\"),end:c.getCursor(\"to\")});J(a,d,b,f.start,f.end);return}}t(a,c,\"Could not find a definition.\")}})}R(c)?b():K(c,\"Jump to variable\",function(a){a&&b(a)})}function J(a,c,b,d,e){b.doc.setSelection(d,e);c!=b&&a.options.switchToDoc&&(z(a),a.options.switchToDoc(b.name,b.doc))}function R(a){var c=a.getCursor(\"end\"),b=a.getTokenAt(c);return b.start<c.ch&&\"comment\"==b.type?!1:/[\\w)\\]]/.test(a.getLine(c.line).slice(Math.max(c.ch-\n1,0),c.ch+1))}function S(a,c){var b=c.getTokenAt(c.getCursor());if(!/\\w/.test(b.string))return t(a,c,\"Not at a variable\");K(c,\"New name for \"+b.string,function(b){a.request(c,{type:\"rename\",newName:b,fullDocs:!0},function(b,d){if(b)return t(a,c,b);T(a,d.changes)})})}function U(a,c){var b=u(a,c.doc).name;a.request(c,{type:\"refs\"},function(d,e){if(d)return t(a,c,d);d=[];for(var f=0,g=c.getCursor(),h=0;h<e.refs.length;h++){var n=e.refs[h];n.file==b&&(d.push({anchor:n.start,head:n.end}),0<=y(g,n.start)&&\n0>=y(g,n.end)&&(f=d.length-1))}c.setSelections(d,f)})}function T(a,c){for(var b=Object.create(null),d=0;d<c.length;++d){var e=c[d];(b[e.file]||(b[e.file]=[])).push(e)}for(var f in b){c=a.docs[f];var g=b[f];if(c){g.sort(function(a,b){return y(b.start,a.start)});for(var h=\"*rename\"+ ++V,d=0;d<g.length;++d)e=g[d],c.doc.replaceRange(e.text,e.start,e.end,h)}}}function I(a,c,b,d){var e=[],f;(f=!b.fullDocs)||delete b.fullDocs;\"string\"==typeof b&&(b={type:b});b.lineCharPositions=!0;null==b.end&&(b.end=d||\nc.doc.getCursor(\"end\"),c.doc.somethingSelected()&&(b.start=c.doc.getCursor(\"start\")));d=b.start||b.end;c.changed?c.doc.lineCount()>D&&!1!==f&&100>c.changed.to-c.changed.from&&c.changed.from<=d.line&&c.changed.to>b.end.line?(e.push(W(c,d,b.end)),b.file=\"#0\",f=e[0].offsetLines,null!=b.start&&(b.start=q(b.start.line- -f,b.start.ch)),b.end=q(b.end.line-f,b.end.ch)):(e.push({type:\"full\",name:c.name,text:x(a,c)}),b.file=c.name,c.changed=null):b.file=c.name;for(var g in a.docs)f=a.docs[g],f.changed&&f!=\nc&&(e.push({type:\"full\",name:f.name,text:x(a,f)}),f.changed=null);return{query:b,files:e}}function W(a,c,b){for(var d=a.doc,e=null,f=null,g=c.line-1,k=Math.max(0,g-50);g>=k;--g){var n=d.getLine(g);0>n.search(/\\bfunction\\b/)||(n=h.countColumn(n,null,4),null!=e&&e<=n||(e=n,f=g))}null==f&&(f=k);g=Math.min(d.lastLine(),b.line+20);if(null==e||e==h.countColumn(d.getLine(c.line),null,4))c=g;else for(c=b.line+1;c<g&&!(n=h.countColumn(d.getLine(c),null,4),n<=e);++c);e=q(f,0);return{type:\"part\",name:a.name,\noffsetLines:e.line,text:d.getRange(e,q(c,0))}}function p(a,c){var b=document.createElement(a);c&&(b.className=c);for(var d=2;d<arguments.length;++d){var e=arguments[d];\"string\"==typeof e&&(e=document.createTextNode(e));b.appendChild(e)}return b}function K(a,c,b){a.openDialog?a.openDialog(c+\": <input type=text>\",b):b(prompt(c,\"\"))}function G(a,c,b){function d(){a.state.ternTooltip=null;f.parentNode&&(a.off(\"cursorActivity\",d),a.off(\"blur\",d),a.off(\"scroll\",d),X(f))}a.state.ternTooltip&&w(a.state.ternTooltip);\nvar e=a.cursorCoords(),f=a.state.ternTooltip=A(e.right+1,e.bottom,c),g=!1,k=!1;h.on(f,\"mousemove\",function(){g=!0});h.on(f,\"mouseout\",function(a){h.contains(f,a.relatedTarget||a.toElement)||(k?d():g=!1)});setTimeout(function(){k=!0;g||d()},b.options.hintDelay?b.options.hintDelay:1700);a.on(\"cursorActivity\",d);a.on(\"blur\",d);a.on(\"scroll\",d)}function A(a,c,b){b=p(\"div\",k+\"tooltip\",b);b.style.left=a+\"px\";b.style.top=c+\"px\";document.body.appendChild(b);return b}function w(a){var c=a&&a.parentNode;c&&\nc.removeChild(a)}function X(a){a.style.opacity=\"0\";setTimeout(function(){w(a)},1100)}function t(a,c,b){a.options.showError?a.options.showError(c,b):G(c,String(b),a)}function z(a){a.activeArgHints&&(w(a.activeArgHints),a.activeArgHints=null)}function x(a,c){var b=c.doc.getValue();a.options.fileFilter&&(b=a.options.fileFilter(b,c.name,c.doc));return b}function Y(a){function c(a,c){c&&(a.id=++d,e[d]=c);b.postMessage(a)}var b=a.worker=new Worker(a.options.workerScript);b.postMessage({type:\"init\",defs:a.options.defs,\nplugins:a.options.plugins,scripts:a.options.workerDeps});var d=0,e={};b.onmessage=function(b){var d=b.data;\"getFile\"==d.type?B(a,d.name,function(a,b){c({type:\"getFile\",err:String(a),text:b,id:d.id})}):\"debug\"==d.type?window.console.log(d.message):d.id&&e[d.id]&&(e[d.id](d.err,d.body),delete e[d.id])};b.onerror=function(a){for(var b in e)e[b](a);e={}};this.addFile=function(a,b){c({type:\"add\",name:a,text:b})};this.delFile=function(a){c({type:\"del\",name:a})};this.request=function(a,b){c({type:\"req\",\nbody:a},b)}}h.TernServer=function(a){var c=this;this.options=a||{};a=this.options.plugins||(this.options.plugins={});a.doc_comment||(a.doc_comment=!0);this.docs=Object.create(null);this.server=this.options.useWorker?new Y(this):new tern.Server({getFile:function(a,d){return B(c,a,d)},async:!0,defs:this.options.defs||[],plugins:a});this.trackChange=function(a,d){L(c,a,d)};this.activeArgHints=this.cachedArgHints=null;this.jumpStack=[];this.getHint=function(a,d){return M(c,a,d)};this.getHint.async=!0};\nh.TernServer.prototype={addDoc:function(a,c){var b={doc:c,name:a,changed:null};this.server.addFile(a,x(this,b));h.on(c,\"change\",this.trackChange);return this.docs[a]=b},delDoc:function(a){if(a=C(this,a))h.off(a.doc,\"change\",this.trackChange),delete this.docs[a.name],this.server.delFile(a.name)},hideDoc:function(a){z(this);(a=C(this,a))&&a.changed&&E(this,a)},complete:function(a){a.showHint({hint:this.getHint})},showType:function(a,c,b){F(this,a,c,\"type\",b)},showDocs:function(a,c,b){F(this,a,c,\"documentation\",\nb)},updateArgHints:function(a){O(this,a)},jumpToDef:function(a){Q(this,a)},jumpBack:function(a){var c=this.jumpStack.pop(),b=c&&this.docs[c.file];b&&J(this,u(this,a.getDoc()),b,c.start,c.end)},rename:function(a){S(this,a)},selectName:function(a){U(this,a)},request:function(a,c,b,d){var e=this,f=u(this,a.getDoc()),g=I(this,f,c,d);if(a=g.query&&this.options.queryOptions&&this.options.queryOptions[g.query.type])for(var h in a)g.query[h]=a[h];this.server.request(g,function(a,d){!a&&e.options.responseFilter&&\n(d=e.options.responseFilter(f,c,g,a,d));b(a,d)})},destroy:function(){z(this);this.worker&&(this.worker.terminate(),this.worker=null)}};var q=h.Pos,k=\"CodeMirror-Tern-\",D=250,V=0,y=h.cmpPos});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/tern/worker.js",
    "content": "'use strict';var server;this.onmessage=function(b){var a=b.data;switch(a.type){case \"init\":return startServer(a.defs,a.plugins,a.scripts);case \"add\":return server.addFile(a.name,a.text);case \"del\":return server.delFile(a.name);case \"req\":return server.request(a.body,function(b,d){postMessage({id:a.id,body:d,err:b&&String(b)})});case \"getFile\":return b=pending[a.id],delete pending[a.id],b(a.err,a.text);default:throw Error(\"Unknown message type: \"+a.type);}};var nextId=0,pending={};\nfunction getFile(b,a){postMessage({type:\"getFile\",name:b,id:++nextId});pending[nextId]=a}function startServer(b,a,c){c&&importScripts.apply(null,c);server=new tern.Server({getFile:getFile,async:!0,defs:b,plugins:a})}this.console={log:function(b){postMessage({type:\"debug\",message:b})}};\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/addon/wrap/hardwrap.js",
    "content": "'use strict';(function(k){\"object\"==typeof exports&&\"object\"==typeof module?k(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],k):k(CodeMirror)})(function(k){function p(c,a,b){for(var e=b.paragraphStart||c.getHelper(a,\"paragraphStart\"),d=a.line,f=c.firstLine();d>f;--d){var g=c.getLine(d);if(e&&e.test(g))break;if(!/\\S/.test(g)){++d;break}}b=b.paragraphEnd||c.getHelper(a,\"paragraphEnd\");a=a.line+1;for(e=c.lastLine();a<=e;++a){g=c.getLine(a);if(b&&\nb.test(g)){++a;break}if(!/\\S/.test(g))break}return{from:d,to:a}}function v(c,a,b,e){for(var d=a;d<c.length&&\" \"==c.charAt(d);)d++;for(;0<d&&!b.test(c.slice(d-1,d+1));--d);for(b=!0;;b=!1){var f=d;if(e)for(;\" \"==c.charAt(f-1);)--f;if(0==f&&b)d=a;else return{from:f,to:d}}}function n(c,a,b,e){a=c.clipPos(a);b=c.clipPos(b);var d=e.column||80,f=e.wrapOn||/\\s\\S|-[^\\.\\d]/;e=!1!==e.killTrailingSpace;var g=[],h=\"\",q=a.line;a=c.getRange(a,b,!1);if(!a.length)return null;b=a[0].match(/^[ \\t]*/)[0];for(var r=0;r<\na.length;++r){var l=a[r],n=h.length,p=0;h&&l&&!f.test(h.charAt(h.length-1)+l.charAt(0))&&(h+=\" \",p=1);var t=\"\";r&&(t=l.match(/^\\s*/)[0],l=l.slice(t.length));h+=l;if(r){var u=h.length>d&&b==t&&v(h,d,f,e);u&&u.from==n&&u.to==n+p?(h=b+l,++q):g.push({text:[p?\" \":\"\"],from:m(q,n),to:m(q+1,t.length)})}for(;h.length>d;)l=v(h,d,f,e),g.push({text:[\"\",b],from:m(q,l.from),to:m(q,l.to)}),h=b+h.slice(l.to),++q}g.length&&c.operation(function(){for(var b=0;b<g.length;++b){var a=g[b];(a.text||k.cmpPos(a.from,a.to))&&\nc.replaceRange(a.text,a.from,a.to)}});return g.length?{from:g[0].from,to:k.changeEnd(g[g.length-1])}:null}var m=k.Pos;k.defineExtension(\"wrapParagraph\",function(c,a){a=a||{};c||(c=this.getCursor());c=p(this,c,a);return n(this,m(c.from,0),m(c.to-1),a)});k.commands.wrapLines=function(c){c.operation(function(){for(var a,b,e=c.listSelections(),d=c.lastLine()+1,f=e.length-1;0<=f;f--)b=e[f],b.empty()?(b=p(c,b.head,{}),a=m(b.from,0),b=m(b.to-1)):(a=b.from(),b=b.to()),b.line>=d||(d=a.line,n(c,a,b,{}))})};\nk.defineExtension(\"wrapRange\",function(c,a,b){return n(this,c,a,b||{})});k.defineExtension(\"wrapParagraphsInRange\",function(c,a,b){b=b||{};var e=this,d=[];for(c=c.line;c<=a.line;)c=p(e,m(c,0),b),d.push(c),c=c.to;var f=!1;d.length&&e.operation(function(){for(var a=d.length-1;0<=a;--a)f=f||n(e,m(d[a].from,0),m(d[a].to-1),b)});return f})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/lib/codemirror.css",
    "content": ".CodeMirror{font-family:monospace;height:300px;color:#000}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta,.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-invalidchar,.cm-s-default .cm-error{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0f0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#f22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important;-webkit-user-select:none;-moz-user-select:none;user-select:none}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:none;font-variant-ligatures:none}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;overflow:auto}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}.CodeMirror-focused div.CodeMirror-cursors,div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected,.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background:#ffa;background:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}"
  },
  {
    "path": "app/src/main/assets/code_mirror/lib/codemirror.js",
    "content": "'use strict';var $jscomp={scope:{},findInternal:function(l,aa,I){l instanceof String&&(l=String(l));for(var S=l.length,ba=0;ba<S;ba++){var Qa=l[ba];if(aa.call(I,Qa,ba,l))return{i:ba,v:Qa}}return{i:-1,v:void 0}}};$jscomp.defineProperty=\"function\"==typeof Object.defineProperties?Object.defineProperty:function(l,aa,I){if(I.get||I.set)throw new TypeError(\"ES3 does not support getters and setters.\");l!=Array.prototype&&l!=Object.prototype&&(l[aa]=I.value)};\n$jscomp.getGlobal=function(l){return\"undefined\"!=typeof window&&window===l?l:\"undefined\"!=typeof global?global:l};$jscomp.global=$jscomp.getGlobal(this);$jscomp.polyfill=function(l,aa,I,S){if(aa){I=$jscomp.global;l=l.split(\".\");for(S=0;S<l.length-1;S++){var ba=l[S];ba in I||(I[ba]={});I=I[ba]}l=l[l.length-1];S=I[l];aa=aa(S);aa!=S&&null!=aa&&$jscomp.defineProperty(I,l,{configurable:!0,writable:!0,value:aa})}};\n$jscomp.polyfill(\"Array.prototype.find\",function(l){return l?l:function(l,I){return $jscomp.findInternal(this,l,I).v}},\"es6-impl\",\"es3\");\n(function(l){if(\"object\"==typeof exports&&\"object\"==typeof module)module.exports=l();else{if(\"function\"==typeof define&&define.amd)return define([],l);(this||window).CodeMirror=l()}})(function(){function l(a,b){if(!(this instanceof l))return new l(a,b);this.options=b=b?da(b):{};da(Af,b,!1);Dc(b);var c=b.value;\"string\"==typeof c&&(c=new U(c,b.mode,null,b.lineSeparator));this.doc=c;var d=new l.inputStyles[b.inputStyle](this);a=this.display=new aa(a,c,d);a.wrapper.CodeMirror=this;Ed(this);Fd(this);b.lineWrapping&&\n(this.display.wrapper.className+=\" CodeMirror-wrap\");b.autofocus&&!ib&&a.input.focus();Gd(this);this.state={keyMaps:[],overlays:[],modeGen:0,overwrite:!1,delayingBlurEvent:!1,focused:!1,suppressEdits:!1,pasteIncoming:!1,cutIncoming:!1,selectingText:!1,draggingText:!1,highlight:new Ba,keySeq:null,specialChars:null};var e=this;B&&11>A&&setTimeout(function(){e.display.input.reset(!0)},20);Bf(this);Hd||(Cf(),Hd=!0);Ra(this);this.curOp.forceUpdate=!0;Id(this,c);b.autofocus&&!ib||e.hasFocus()?setTimeout(Ec(Fc,\nthis),20):jb(this);for(var f in Sa)if(Sa.hasOwnProperty(f))Sa[f](this,b[f],Jd);Kd(this);b.finishInit&&b.finishInit(this);for(c=0;c<Gc.length;++c)Gc[c](this);Ta(this);M&&b.lineWrapping&&\"optimizelegibility\"==getComputedStyle(a.lineDiv).textRendering&&(a.lineDiv.style.textRendering=\"auto\")}function aa(a,b,c){this.input=c;this.scrollbarFiller=r(\"div\",null,\"CodeMirror-scrollbar-filler\");this.scrollbarFiller.setAttribute(\"cm-not-content\",\"true\");this.gutterFiller=r(\"div\",null,\"CodeMirror-gutter-filler\");\nthis.gutterFiller.setAttribute(\"cm-not-content\",\"true\");this.lineDiv=r(\"div\",null,\"CodeMirror-code\");this.selectionDiv=r(\"div\",null,null,\"position: relative; z-index: 1\");this.cursorDiv=r(\"div\",null,\"CodeMirror-cursors\");this.measure=r(\"div\",null,\"CodeMirror-measure\");this.lineMeasure=r(\"div\",null,\"CodeMirror-measure\");this.lineSpace=r(\"div\",[this.measure,this.lineMeasure,this.selectionDiv,this.cursorDiv,this.lineDiv],null,\"position: relative; outline: none\");this.mover=r(\"div\",[r(\"div\",[this.lineSpace],\n\"CodeMirror-lines\")],null,\"position: relative\");this.sizer=r(\"div\",[this.mover],\"CodeMirror-sizer\");this.sizerWidth=null;this.heightForcer=r(\"div\",null,null,\"position: absolute; height: \"+Ld+\"px; width: 1px;\");this.gutters=r(\"div\",null,\"CodeMirror-gutters\");this.lineGutter=null;this.scroller=r(\"div\",[this.sizer,this.heightForcer,this.gutters],\"CodeMirror-scroll\");this.scroller.setAttribute(\"tabIndex\",\"-1\");this.wrapper=r(\"div\",[this.scrollbarFiller,this.gutterFiller,this.scroller],\"CodeMirror\");B&&\n8>A&&(this.gutters.style.zIndex=-1,this.scroller.style.paddingRight=0);M||va&&ib||(this.scroller.draggable=!0);a&&(a.appendChild?a.appendChild(this.wrapper):a(this.wrapper));this.reportedViewFrom=this.reportedViewTo=this.viewFrom=this.viewTo=b.first;this.view=[];this.externalMeasured=this.renderedView=null;this.lastWrapHeight=this.lastWrapWidth=this.viewOffset=0;this.updateLineNumbers=null;this.nativeBarWidth=this.barHeight=this.barWidth=0;this.scrollbarsClipped=!1;this.lineNumWidth=this.lineNumInnerWidth=\nthis.lineNumChars=null;this.alignWidgets=!1;this.maxLine=this.cachedCharWidth=this.cachedTextHeight=this.cachedPaddingH=null;this.maxLineLength=0;this.maxLineChanged=!1;this.wheelDX=this.wheelDY=this.wheelStartX=this.wheelStartY=null;this.shift=!1;this.activeTouch=this.selForContextMenu=null;c.init(this)}function I(a){a.doc.mode=l.getMode(a.options,a.doc.modeOption);S(a)}function S(a){a.doc.iter(function(a){a.stateAfter&&(a.stateAfter=null);a.styles&&(a.styles=null)});a.doc.frontier=a.doc.first;kb(a,\n100);a.state.modeGen++;a.curOp&&P(a)}function ba(a){var b=Ca(a.display),c=a.options.lineWrapping,d=c&&Math.max(5,a.display.scroller.clientWidth/lb(a.display)-3);return function(e){if(Da(a.doc,e))return 0;var f=0;if(e.widgets)for(var g=0;g<e.widgets.length;g++)e.widgets[g].height&&(f+=e.widgets[g].height);return c?f+(Math.ceil(e.text.length/d)||1)*b:f+b}}function Qa(a){var b=a.doc,c=ba(a);b.iter(function(a){var b=c(a);b!=a.height&&ja(a,b)})}function Fd(a){a.display.wrapper.className=a.display.wrapper.className.replace(/\\s*cm-s-\\S+/g,\n\"\")+a.options.theme.replace(/(^|\\s)\\s*/g,\" cm-s-\");mb(a)}function nb(a){Ed(a);P(a);setTimeout(function(){Hc(a)},20)}function Ed(a){var b=a.display.gutters,c=a.options.gutters;wa(b);for(var d=0;d<c.length;++d){var e=c[d],f=b.appendChild(r(\"div\",null,\"CodeMirror-gutter \"+e));\"CodeMirror-linenumbers\"==e&&(a.display.lineGutter=f,f.style.width=(a.display.lineNumWidth||1)+\"px\")}b.style.display=d?\"\":\"none\";Ic(a)}function Ic(a){a.display.sizer.style.marginLeft=a.display.gutters.offsetWidth+\"px\"}function Pb(a){if(0==\na.height)return 0;for(var b=a.text.length,c,d=a;c=Ea(d,!0);)c=c.find(0,!0),d=c.from.line,b+=c.from.ch-c.to.ch;for(d=a;c=Ea(d,!1);)c=c.find(0,!0),b-=d.text.length-c.from.ch,d=c.to.line,b+=d.text.length-c.to.ch;return b}function Jc(a){var b=a.display;a=a.doc;b.maxLine=w(a,a.first);b.maxLineLength=Pb(b.maxLine);b.maxLineChanged=!0;a.iter(function(a){var c=Pb(a);c>b.maxLineLength&&(b.maxLineLength=c,b.maxLine=a)})}function Dc(a){var b=N(a.gutters,\"CodeMirror-linenumbers\");-1==b&&a.lineNumbers?a.gutters=\na.gutters.concat([\"CodeMirror-linenumbers\"]):-1<b&&!a.lineNumbers&&(a.gutters=a.gutters.slice(0),a.gutters.splice(b,1))}function ob(a){var b=a.display,c=b.gutters.offsetWidth,d=Math.round(a.doc.height+Kc(a.display));return{clientHeight:b.scroller.clientHeight,viewHeight:b.wrapper.clientHeight,scrollWidth:b.scroller.scrollWidth,clientWidth:b.scroller.clientWidth,viewWidth:b.wrapper.clientWidth,barLeft:a.options.fixedGutter?c:0,docHeight:d,scrollHeight:d+ka(a)+b.barHeight,nativeBarWidth:b.nativeBarWidth,\ngutterWidth:c}}function Lc(a,b,c){this.cm=c;var d=this.vert=r(\"div\",[r(\"div\",null,null,\"min-width: 1px\")],\"CodeMirror-vscrollbar\"),e=this.horiz=r(\"div\",[r(\"div\",null,null,\"height: 100%; min-height: 1px\")],\"CodeMirror-hscrollbar\");a(d);a(e);y(d,\"scroll\",function(){d.clientHeight&&b(d.scrollTop,\"vertical\")});y(e,\"scroll\",function(){e.clientWidth&&b(e.scrollLeft,\"horizontal\")});this.checkedZeroWidth=!1;B&&8>A&&(this.horiz.style.minHeight=this.vert.style.minWidth=\"18px\")}function Mc(){}function Gd(a){a.display.scrollbars&&\n(a.display.scrollbars.clear(),a.display.scrollbars.addClass&&pb(a.display.wrapper,a.display.scrollbars.addClass));a.display.scrollbars=new l.scrollbarModel[a.options.scrollbarStyle](function(b){a.display.wrapper.insertBefore(b,a.display.scrollbarFiller);y(b,\"mousedown\",function(){a.state.focused&&setTimeout(function(){a.display.input.focus()},0)});b.setAttribute(\"cm-not-content\",\"true\")},function(b,c){\"horizontal\"==c?Ua(a,b):qb(a,b)},a);a.display.scrollbars.addClass&&rb(a.display.wrapper,a.display.scrollbars.addClass)}\nfunction Va(a,b){b||(b=ob(a));var c=a.display.barWidth,d=a.display.barHeight;Md(a,b);for(b=0;4>b&&c!=a.display.barWidth||d!=a.display.barHeight;b++)c!=a.display.barWidth&&a.options.lineWrapping&&Qb(a),Md(a,ob(a)),c=a.display.barWidth,d=a.display.barHeight}function Md(a,b){var c=a.display,d=c.scrollbars.update(b);c.sizer.style.paddingRight=(c.barWidth=d.right)+\"px\";c.sizer.style.paddingBottom=(c.barHeight=d.bottom)+\"px\";c.heightForcer.style.borderBottom=d.bottom+\"px solid transparent\";d.right&&d.bottom?\n(c.scrollbarFiller.style.display=\"block\",c.scrollbarFiller.style.height=d.bottom+\"px\",c.scrollbarFiller.style.width=d.right+\"px\"):c.scrollbarFiller.style.display=\"\";d.bottom&&a.options.coverGutterNextToScrollbar&&a.options.fixedGutter?(c.gutterFiller.style.display=\"block\",c.gutterFiller.style.height=d.bottom+\"px\",c.gutterFiller.style.width=b.gutterWidth+\"px\"):c.gutterFiller.style.display=\"\"}function Nc(a,b,c){var d=c&&null!=c.top?Math.max(0,c.top):a.scroller.scrollTop,d=Math.floor(d-a.lineSpace.offsetTop),\ne=c&&null!=c.bottom?c.bottom:d+a.wrapper.clientHeight,d=Fa(b,d),e=Fa(b,e);if(c&&c.ensure){var f=c.ensure.from.line;c=c.ensure.to.line;f<d?(d=f,e=Fa(b,la(w(b,f))+a.wrapper.clientHeight)):Math.min(c,b.lastLine())>=e&&(d=Fa(b,la(w(b,c))-a.wrapper.clientHeight),e=c)}return{from:d,to:Math.max(e,d+1)}}function Hc(a){var b=a.display,c=b.view;if(b.alignWidgets||b.gutters.firstChild&&a.options.fixedGutter){for(var d=Oc(b)-b.scroller.scrollLeft+a.doc.scrollLeft,e=b.gutters.offsetWidth,f=d+\"px\",g=0;g<c.length;g++)if(!c[g].hidden){a.options.fixedGutter&&\n(c[g].gutter&&(c[g].gutter.style.left=f),c[g].gutterBackground&&(c[g].gutterBackground.style.left=f));var h=c[g].alignable;if(h)for(var k=0;k<h.length;k++)h[k].style.left=f}a.options.fixedGutter&&(b.gutters.style.left=d+e+\"px\")}}function Kd(a){if(!a.options.lineNumbers)return!1;var b=a.doc,b=Pc(a.options,b.first+b.size-1),c=a.display;if(b.length!=c.lineNumChars){var d=c.measure.appendChild(r(\"div\",[r(\"div\",b)],\"CodeMirror-linenumber CodeMirror-gutter-elt\")),e=d.firstChild.offsetWidth,d=d.offsetWidth-\ne;c.lineGutter.style.width=\"\";c.lineNumInnerWidth=Math.max(e,c.lineGutter.offsetWidth-d)+1;c.lineNumWidth=c.lineNumInnerWidth+d;c.lineNumChars=c.lineNumInnerWidth?b.length:-1;c.lineGutter.style.width=c.lineNumWidth+\"px\";Ic(a);return!0}return!1}function Pc(a,b){return String(a.lineNumberFormatter(b+a.firstLineNumber))}function Oc(a){return a.scroller.getBoundingClientRect().left-a.sizer.getBoundingClientRect().left}function Rb(a,b,c){var d=a.display;this.viewport=b;this.visible=Nc(d,a.doc,b);this.editorIsHidden=\n!d.wrapper.offsetWidth;this.wrapperHeight=d.wrapper.clientHeight;this.wrapperWidth=d.wrapper.clientWidth;this.oldDisplayWidth=Ga(a);this.force=c;this.dims=Qc(a);this.events=[]}function Rc(a,b){var c=a.display,d=a.doc;if(b.editorIsHidden)return xa(a),!1;if(!b.force&&b.visible.from>=c.viewFrom&&b.visible.to<=c.viewTo&&(null==c.updateLineNumbers||c.updateLineNumbers>=c.viewTo)&&c.renderedView==c.view&&0==Nd(a))return!1;Kd(a)&&(xa(a),b.dims=Qc(a));var e=d.first+d.size,f=Math.max(b.visible.from-a.options.viewportMargin,\nd.first),g=Math.min(e,b.visible.to+a.options.viewportMargin);c.viewFrom<f&&20>f-c.viewFrom&&(f=Math.max(d.first,c.viewFrom));c.viewTo>g&&20>c.viewTo-g&&(g=Math.min(e,c.viewTo));ya&&(f=Sc(a.doc,f),g=Od(a.doc,g));d=f!=c.viewFrom||g!=c.viewTo||c.lastWrapHeight!=b.wrapperHeight||c.lastWrapWidth!=b.wrapperWidth;e=a.display;0==e.view.length||f>=e.viewTo||g<=e.viewFrom?(e.view=Sb(a,f,g),e.viewFrom=f):(e.viewFrom>f?e.view=Sb(a,f,e.viewFrom).concat(e.view):e.viewFrom<f&&(e.view=e.view.slice(Ha(a,f))),e.viewFrom=\nf,e.viewTo<g?e.view=e.view.concat(Sb(a,e.viewTo,g)):e.viewTo>g&&(e.view=e.view.slice(0,Ha(a,g))));e.viewTo=g;c.viewOffset=la(w(a.doc,c.viewFrom));a.display.mover.style.top=c.viewOffset+\"px\";g=Nd(a);if(!d&&0==g&&!b.force&&c.renderedView==c.view&&(null==c.updateLineNumbers||c.updateLineNumbers>=c.viewTo))return!1;f=ma();4<g&&(c.lineDiv.style.display=\"none\");Df(a,c.updateLineNumbers,b.dims);4<g&&(c.lineDiv.style.display=\"\");c.renderedView=c.view;f&&ma()!=f&&f.offsetHeight&&f.focus();wa(c.cursorDiv);\nwa(c.selectionDiv);c.gutters.style.height=c.sizer.style.minHeight=0;d&&(c.lastWrapHeight=b.wrapperHeight,c.lastWrapWidth=b.wrapperWidth,kb(a,400));c.updateLineNumbers=null;return!0}function Pd(a,b){for(var c=b.viewport,d=!0;;d=!1){if(!d||!a.options.lineWrapping||b.oldDisplayWidth==Ga(a))if(c&&null!=c.top&&(c={top:Math.min(a.doc.height+Kc(a.display)-Tc(a),c.top)}),b.visible=Nc(a.display,a.doc,c),b.visible.from>=a.display.viewFrom&&b.visible.to<=a.display.viewTo)break;if(!Rc(a,b))break;Qb(a);d=ob(a);\nsb(a);Va(a,d);Uc(a,d)}b.signal(a,\"update\",a);if(a.display.viewFrom!=a.display.reportedViewFrom||a.display.viewTo!=a.display.reportedViewTo)b.signal(a,\"viewportChange\",a,a.display.viewFrom,a.display.viewTo),a.display.reportedViewFrom=a.display.viewFrom,a.display.reportedViewTo=a.display.viewTo}function Vc(a,b){b=new Rb(a,b);if(Rc(a,b)){Qb(a);Pd(a,b);var c=ob(a);sb(a);Va(a,c);Uc(a,c);b.finish()}}function Uc(a,b){a.display.sizer.style.minHeight=b.docHeight+\"px\";a.display.heightForcer.style.top=b.docHeight+\n\"px\";a.display.gutters.style.height=b.docHeight+a.display.barHeight+ka(a)+\"px\"}function Qb(a){a=a.display;for(var b=a.lineDiv.offsetTop,c=0;c<a.view.length;c++){var d=a.view[c],e;if(!d.hidden){if(B&&8>A){var f=d.node.offsetTop+d.node.offsetHeight;e=f-b;b=f}else e=d.node.getBoundingClientRect(),e=e.bottom-e.top;f=d.line.height-e;2>e&&(e=Ca(a));if(.001<f||-.001>f)if(ja(d.line,e),Qd(d.line),d.rest)for(e=0;e<d.rest.length;e++)Qd(d.rest[e])}}}function Qd(a){if(a.widgets)for(var b=0;b<a.widgets.length;++b)a.widgets[b].height=\na.widgets[b].node.parentNode.offsetHeight}function Qc(a){for(var b=a.display,c={},d={},e=b.gutters.clientLeft,f=b.gutters.firstChild,g=0;f;f=f.nextSibling,++g)c[a.options.gutters[g]]=f.offsetLeft+f.clientLeft+e,d[a.options.gutters[g]]=f.clientWidth;return{fixedPos:Oc(b),gutterTotalWidth:b.gutters.offsetWidth,gutterLeft:c,gutterWidth:d,wrapperWidth:b.wrapper.clientWidth}}function Df(a,b,c){function d(b){var c=b.nextSibling;M&&ea&&a.display.currentWheelTarget==b?b.style.display=\"none\":b.parentNode.removeChild(b);\nreturn c}for(var e=a.display,f=a.options.lineNumbers,g=e.lineDiv,h=g.firstChild,k=e.view,e=e.viewFrom,m=0;m<k.length;m++){var p=k[m];if(!p.hidden)if(p.node&&p.node.parentNode==g){for(;h!=p.node;)h=d(h);h=f&&null!=b&&b<=e&&p.lineNumber;p.changes&&(-1<N(p.changes,\"gutter\")&&(h=!1),Rd(a,p,e,c));h&&(wa(p.lineNumber),p.lineNumber.appendChild(document.createTextNode(Pc(a.options,e))));h=p.node.nextSibling}else{var u=Ef(a,p,e,c);g.insertBefore(u,h)}e+=p.size}for(;h;)h=d(h)}function Rd(a,b,c,d){for(var e=\n0;e<b.changes.length;e++){var f=b.changes[e];if(\"text\"==f){var f=b,g=f.text.className,h=Sd(a,f);f.text==f.node&&(f.node=h.pre);f.text.parentNode.replaceChild(h.pre,f.text);f.text=h.pre;h.bgClass!=f.bgClass||h.textClass!=f.textClass?(f.bgClass=h.bgClass,f.textClass=h.textClass,Wc(f)):g&&(f.text.className=g)}else if(\"gutter\"==f)Td(a,b,c,d);else if(\"class\"==f)Wc(b);else if(\"widget\"==f){f=a;g=b;h=d;g.alignable&&(g.alignable=null);for(var k=g.node.firstChild,m;k;k=m)m=k.nextSibling,\"CodeMirror-linewidget\"==\nk.className&&g.node.removeChild(k);Ud(f,g,h)}}b.changes=null}function tb(a){a.node==a.text&&(a.node=r(\"div\",null,null,\"position: relative\"),a.text.parentNode&&a.text.parentNode.replaceChild(a.node,a.text),a.node.appendChild(a.text),B&&8>A&&(a.node.style.zIndex=2));return a.node}function Sd(a,b){var c=a.display.externalMeasured;return c&&c.line==b.line?(a.display.externalMeasured=null,b.measure=c.measure,c.built):Vd(a,b)}function Wc(a){var b=a.bgClass?a.bgClass+\" \"+(a.line.bgClass||\"\"):a.line.bgClass;\nb&&(b+=\" CodeMirror-linebackground\");if(a.background)b?a.background.className=b:(a.background.parentNode.removeChild(a.background),a.background=null);else if(b){var c=tb(a);a.background=c.insertBefore(r(\"div\",null,b),c.firstChild)}a.line.wrapClass?tb(a).className=a.line.wrapClass:a.node!=a.text&&(a.node.className=\"\");a.text.className=(a.textClass?a.textClass+\" \"+(a.line.textClass||\"\"):a.line.textClass)||\"\"}function Td(a,b,c,d){b.gutter&&(b.node.removeChild(b.gutter),b.gutter=null);b.gutterBackground&&\n(b.node.removeChild(b.gutterBackground),b.gutterBackground=null);if(b.line.gutterClass){var e=tb(b);b.gutterBackground=r(\"div\",null,\"CodeMirror-gutter-background \"+b.line.gutterClass,\"left: \"+(a.options.fixedGutter?d.fixedPos:-d.gutterTotalWidth)+\"px; width: \"+d.gutterTotalWidth+\"px\");e.insertBefore(b.gutterBackground,b.text)}var f=b.line.gutterMarkers;if(a.options.lineNumbers||f){var e=tb(b),g=b.gutter=r(\"div\",null,\"CodeMirror-gutter-wrapper\",\"left: \"+(a.options.fixedGutter?d.fixedPos:-d.gutterTotalWidth)+\n\"px\");a.display.input.setUneditable(g);e.insertBefore(g,b.text);b.line.gutterClass&&(g.className+=\" \"+b.line.gutterClass);!a.options.lineNumbers||f&&f[\"CodeMirror-linenumbers\"]||(b.lineNumber=g.appendChild(r(\"div\",Pc(a.options,c),\"CodeMirror-linenumber CodeMirror-gutter-elt\",\"left: \"+d.gutterLeft[\"CodeMirror-linenumbers\"]+\"px; width: \"+a.display.lineNumInnerWidth+\"px\")));if(f)for(b=0;b<a.options.gutters.length;++b)c=a.options.gutters[b],(e=f.hasOwnProperty(c)&&f[c])&&g.appendChild(r(\"div\",[e],\"CodeMirror-gutter-elt\",\n\"left: \"+d.gutterLeft[c]+\"px; width: \"+d.gutterWidth[c]+\"px\"))}}function Ef(a,b,c,d){var e=Sd(a,b);b.text=b.node=e.pre;e.bgClass&&(b.bgClass=e.bgClass);e.textClass&&(b.textClass=e.textClass);Wc(b);Td(a,b,c,d);Ud(a,b,d);return b.node}function Ud(a,b,c){Wd(a,b.line,b,c,!0);if(b.rest)for(var d=0;d<b.rest.length;d++)Wd(a,b.rest[d],b,c,!1)}function Wd(a,b,c,d,e){if(b.widgets){var f=tb(c),g=0;for(b=b.widgets;g<b.length;++g){var h=b[g],k=r(\"div\",[h.node],\"CodeMirror-linewidget\");h.handleMouseEvents||k.setAttribute(\"cm-ignore-events\",\n\"true\");var m=h,p=k,u=d;if(m.noHScroll){(c.alignable||(c.alignable=[])).push(p);var n=u.wrapperWidth;p.style.left=u.fixedPos+\"px\";m.coverGutter||(n-=u.gutterTotalWidth,p.style.paddingLeft=u.gutterTotalWidth+\"px\");p.style.width=n+\"px\"}m.coverGutter&&(p.style.zIndex=5,p.style.position=\"relative\",m.noHScroll||(p.style.marginLeft=-u.gutterTotalWidth+\"px\"));a.display.input.setUneditable(k);e&&h.above?f.insertBefore(k,c.gutter||c.text):f.appendChild(k);V(h,\"redraw\")}}}function Xc(a){return q(a.line,a.ch)}\nfunction Tb(a,b){return 0>t(a,b)?b:a}function Ub(a,b){return 0>t(a,b)?a:b}function Xd(a){a.state.focused||(a.display.input.focus(),Fc(a))}function Vb(a,b,c,d,e){var f=a.doc;a.display.shift=!1;d||(d=f.sel);var g=a.state.pasteIncoming||\"paste\"==e,h=f.splitLines(b),k=null;if(g&&1<d.ranges.length)if(T&&T.text.join(\"\\n\")==b){if(0==d.ranges.length%T.text.length)for(var k=[],m=0;m<T.text.length;m++)k.push(f.splitLines(T.text[m]))}else h.length==d.ranges.length&&(k=Wb(h,function(a){return[a]}));for(m=d.ranges.length-\n1;0<=m;m--){var p=d.ranges[m],u=p.from(),n=p.to();p.empty()&&(c&&0<c?u=q(u.line,u.ch-c):a.state.overwrite&&!g?n=q(n.line,Math.min(w(f,n.line).text.length,n.ch+C(h).length)):T&&T.lineWise&&T.text.join(\"\\n\")==b&&(u=n=q(u.line,0)));p=a.curOp.updateInput;u={from:u,to:n,text:k?k[m%k.length]:h,origin:e||(g?\"paste\":a.state.cutIncoming?\"cut\":\"+input\")};Wa(a.doc,u);V(a,\"inputRead\",a,u)}b&&!g&&Yd(a,b);Xa(a);a.curOp.updateInput=p;a.curOp.typing=!0;a.state.pasteIncoming=a.state.cutIncoming=!1}function Zd(a,b){var c=\na.clipboardData&&a.clipboardData.getData(\"Text\");if(c)return a.preventDefault(),b.isReadOnly()||b.options.disableInput||X(b,function(){Vb(b,c,0,null,\"paste\")}),!0}function Yd(a,b){if(a.options.electricChars&&a.options.smartIndent)for(var c=a.doc.sel,d=c.ranges.length-1;0<=d;d--){var e=c.ranges[d];if(!(100<e.head.ch||d&&c.ranges[d-1].head.line==e.head.line)){var f=a.getModeAt(e.head),g=!1;if(f.electricChars)for(var h=0;h<f.electricChars.length;h++){if(-1<b.indexOf(f.electricChars.charAt(h))){g=ub(a,\ne.head.line,\"smart\");break}}else f.electricInput&&f.electricInput.test(w(a.doc,e.head.line).text.slice(0,e.head.ch))&&(g=ub(a,e.head.line,\"smart\"));g&&V(a,\"electricInput\",a,e.head.line)}}}function $d(a){for(var b=[],c=[],d=0;d<a.doc.sel.ranges.length;d++){var e=a.doc.sel.ranges[d].head.line,e={anchor:q(e,0),head:q(e+1,0)};c.push(e);b.push(a.getRange(e.anchor,e.head))}return{text:b,ranges:c}}function ae(a,b){a.setAttribute(\"autocorrect\",\"off\");a.setAttribute(\"autocapitalize\",\"off\");a.setAttribute(\"spellcheck\",\n!!b)}function Yc(a){this.cm=a;this.prevInput=\"\";this.pollingFast=!1;this.polling=new Ba;this.hasSelection=this.inaccurateSelection=!1;this.composing=null}function be(){var a=r(\"textarea\",null,null,\"position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; outline: none\"),b=r(\"div\",[a],null,\"overflow: hidden; position: relative; width: 3px; height: 0px;\");M?a.style.width=\"1000px\":a.setAttribute(\"wrap\",\"off\");vb&&(a.style.border=\"1px solid black\");ae(a);return b}function Zc(a){this.cm=\na;this.lastAnchorNode=this.lastAnchorOffset=this.lastFocusNode=this.lastFocusOffset=null;this.polling=new Ba;this.gracePeriod=!1}function ce(a,b){var c=$c(a,b.line);if(!c||c.hidden)return null;a=w(a.doc,b.line);c=de(c,a,b.line);a=fa(a);var d=\"left\";a&&(d=Xb(a,b.ch)%2?\"right\":\"left\");b=ee(c.map,b.ch,d);b.offset=\"right\"==b.collapse?b.end:b.start;return b}function Ya(a,b){b&&(a.bad=!0);return a}function Yb(a,b,c){var d;if(b==a.display.lineDiv){d=a.display.lineDiv.childNodes[c];if(!d)return Ya(a.clipPos(q(a.display.viewTo-\n1)),!0);b=null;c=0}else for(d=b;;d=d.parentNode){if(!d||d==a.display.lineDiv)return null;if(d.parentNode&&d.parentNode==a.display.lineDiv)break}for(var e=0;e<a.display.view.length;e++){var f=a.display.view[e];if(f.node==d)return Ff(f,b,c)}}function Ff(a,b,c){function d(b,c,d){for(var e=-1;e<(m?m.length:0);e++)for(var f=0>e?k.map:m[e],g=0;g<f.length;g+=3){var h=f[g+2];if(h==b||h==c){c=F(0>e?a.line:a.rest[e]);e=f[g]+d;if(0>d||h!=b)e=f[g+(d?1:0)];return q(c,e)}}}var e=a.text.firstChild,f=!1;if(!b||!ad(e,\nb))return Ya(q(F(a.line),0),!0);if(b==e&&(f=!0,b=e.childNodes[c],c=0,!b))return c=a.rest?C(a.rest):a.line,Ya(q(F(c),c.text.length),f);var g=3==b.nodeType?b:null,h=b;g||1!=b.childNodes.length||3!=b.firstChild.nodeType||(g=b.firstChild,c&&(c=g.nodeValue.length));for(;h.parentNode!=e;)h=h.parentNode;var k=a.measure,m=k.maps;if(b=d(g,h,c))return Ya(b,f);e=h.nextSibling;for(g=g?g.nodeValue.length-c:0;e;e=e.nextSibling){if(b=d(e,e.firstChild,0))return Ya(q(b.line,b.ch-g),f);g+=e.textContent.length}h=h.previousSibling;\nfor(g=c;h;h=h.previousSibling){if(b=d(h,h.firstChild,-1))return Ya(q(b.line,b.ch+g),f);g+=h.textContent.length}}function Gf(a,b,c,d,e){function f(a){return function(b){return b.id==a}}function g(b){if(1==b.nodeType){var c=b.getAttribute(\"cm-text\");if(null!=c)\"\"==c&&(c=b.textContent.replace(/\\u200b/g,\"\")),h+=c;else{var c=b.getAttribute(\"cm-marker\"),p;if(c)b=a.findMarks(q(d,0),q(e+1,0),f(+c)),b.length&&(p=b[0].find())&&(h+=Ia(a.doc,p.from,p.to).join(m));else if(\"false\"!=b.getAttribute(\"contenteditable\")){for(p=\n0;p<b.childNodes.length;p++)g(b.childNodes[p]);/^(pre|div|p)$/i.test(b.nodeName)&&(k=!0)}}}else 3==b.nodeType&&(b=b.nodeValue)&&(k&&(h+=m,k=!1),h+=b)}for(var h=\"\",k=!1,m=a.doc.lineSeparator();;){g(b);if(b==c)break;b=b.nextSibling}return h}function ra(a,b){this.ranges=a;this.primIndex=b}function G(a,b){this.anchor=a;this.head=b}function ga(a,b){b=a[b];a.sort(function(a,b){return t(a.from(),b.from())});b=N(a,b);for(var c=1;c<a.length;c++){var d=a[c],e=a[c-1];if(0<=t(e.to(),d.from())){var f=Ub(e.from(),\nd.from()),g=Tb(e.to(),d.to()),d=e.empty()?d.from()==d.head:e.from()==e.head;c<=b&&--b;a.splice(--c,2,new G(d?g:f,d?f:g))}}return new ra(a,b)}function na(a,b){return new ra([new G(a,b||a)],0)}function z(a,b){if(b.line<a.first)return q(a.first,0);var c=a.first+a.size-1;if(b.line>c)return q(c,w(a,c).text.length);a=w(a,b.line).text.length;c=b.ch;b=null==c||c>a?q(b.line,a):0>c?q(b.line,0):b;return b}function wb(a,b){return b>=a.first&&b<a.first+a.size}function fe(a,b){for(var c=[],d=0;d<b.length;d++)c[d]=\nz(a,b[d]);return c}function xb(a,b,c,d){return a.cm&&a.cm.display.shift||a.extend?(a=b.anchor,d&&(b=0>t(c,a),b!=0>t(d,a)?(a=c,c=d):b!=0>t(c,d)&&(c=d)),new G(a,c)):new G(d||c,c)}function Zb(a,b,c,d){E(a,new ra([xb(a,a.sel.primary(),b,c)],0),d)}function ge(a,b,c){for(var d=[],e=0;e<a.sel.ranges.length;e++)d[e]=xb(a,a.sel.ranges[e],b[e],null);b=ga(d,a.sel.primIndex);E(a,b,c)}function bd(a,b,c,d){var e=a.sel.ranges.slice(0);e[b]=c;E(a,ga(e,a.sel.primIndex),d)}function Hf(a,b,c){c={ranges:b.ranges,update:function(b){this.ranges=\n[];for(var c=0;c<b.length;c++)this.ranges[c]=new G(z(a,b[c].anchor),z(a,b[c].head))},origin:c&&c.origin};L(a,\"beforeSelectionChange\",a,c);a.cm&&L(a.cm,\"beforeSelectionChange\",a.cm,c);return c.ranges!=b.ranges?ga(c.ranges,c.ranges.length-1):b}function he(a,b,c){var d=a.history.done,e=C(d);e&&e.ranges?(d[d.length-1]=b,$b(a,b,c)):E(a,b,c)}function E(a,b,c){$b(a,b,c);b=a.sel;var d=a.cm?a.cm.curOp.id:NaN,e=a.history,f=c&&c.origin,g;if(!(g=d==e.lastSelOp)&&(g=f&&e.lastSelOrigin==f)&&!(g=e.lastModTime==\ne.lastSelTime&&e.lastOrigin==f)){g=C(e.done);var h=f.charAt(0);g=\"*\"==h||\"+\"==h&&g.ranges.length==b.ranges.length&&g.somethingSelected()==b.somethingSelected()&&new Date-a.history.lastSelTime<=(a.cm?a.cm.options.historyEventDelay:500)}g?e.done[e.done.length-1]=b:ac(b,e.done);e.lastSelTime=+new Date;e.lastSelOrigin=f;e.lastSelOp=d;c&&!1!==c.clearRedo&&ie(e.undone)}function $b(a,b,c){if(ca(a,\"beforeSelectionChange\")||a.cm&&ca(a.cm,\"beforeSelectionChange\"))b=Hf(a,b,c);var d=c&&c.bias||(0>t(b.primary().head,\na.sel.primary().head)?-1:1);je(a,ke(a,b,d,!0));c&&!1===c.scroll||!a.cm||Xa(a.cm)}function je(a,b){b.equals(a.sel)||(a.sel=b,a.cm&&(a.cm.curOp.updateInput=a.cm.curOp.selectionChanged=!0,le(a.cm)),V(a,\"cursorActivity\",a))}function me(a){je(a,ke(a,a.sel,null,!1),oa)}function ke(a,b,c,d){for(var e,f=0;f<b.ranges.length;f++){var g=b.ranges[f],h=b.ranges.length==a.sel.ranges.length&&a.sel.ranges[f],k=cd(a,g.anchor,h&&h.anchor,c,d),h=cd(a,g.head,h&&h.head,c,d);if(e||k!=g.anchor||h!=g.head)e||(e=b.ranges.slice(0,\nf)),e[f]=new G(k,h)}return e?ga(e,b.primIndex):b}function Za(a,b,c,d,e){var f=w(a,b.line);if(f.markedSpans)for(var g=0;g<f.markedSpans.length;++g){var h=f.markedSpans[g],k=h.marker;if((null==h.from||(k.inclusiveLeft?h.from<=b.ch:h.from<b.ch))&&(null==h.to||(k.inclusiveRight?h.to>=b.ch:h.to>b.ch))){if(e&&(L(k,\"beforeCursorEnter\"),k.explicitlyCleared))if(f.markedSpans){--g;continue}else break;if(k.atomic){if(c){var g=k.find(0>d?1:-1),m;if(0>d?k.inclusiveRight:k.inclusiveLeft)g=ne(a,g,-d,g&&g.line==\nb.line?f:null);if(g&&g.line==b.line&&(m=t(g,c))&&(0>d?0>m:0<m))return Za(a,g,b,d,e)}c=k.find(0>d?-1:1);if(0>d?k.inclusiveLeft:k.inclusiveRight)c=ne(a,c,d,c.line==b.line?f:null);return c?Za(a,c,b,d,e):null}}}return b}function cd(a,b,c,d,e){d=d||1;b=Za(a,b,c,d,e)||!e&&Za(a,b,c,d,!0)||Za(a,b,c,-d,e)||!e&&Za(a,b,c,-d,!0);return b?b:(a.cantEdit=!0,q(a.first,0))}function ne(a,b,c,d){return 0>c&&0==b.ch?b.line>a.first?z(a,q(b.line-1)):null:0<c&&b.ch==(d||w(a,b.line)).text.length?b.line<a.first+a.size-1?\nq(b.line+1,0):null:new q(b.line,b.ch+c)}function sb(a){a.display.input.showSelection(a.display.input.prepareSelection())}function oe(a,b){for(var c=a.doc,d={},e=d.cursors=document.createDocumentFragment(),f=d.selection=document.createDocumentFragment(),g=0;g<c.sel.ranges.length;g++)if(!1!==b||g!=c.sel.primIndex){var h=c.sel.ranges[g];if(!(h.from().line>=a.display.viewTo||h.to().line<a.display.viewFrom)){var k=h.empty();(k||a.options.showCursorWhenSelecting)&&pe(a,h.head,e);k||If(a,h,f)}}return d}\nfunction pe(a,b,c){b=sa(a,b,\"div\",null,null,!a.options.singleCursorHeightPerLine);var d=c.appendChild(r(\"div\",\"\\u00a0\",\"CodeMirror-cursor\"));d.style.left=b.left+\"px\";d.style.top=b.top+\"px\";d.style.height=Math.max(0,b.bottom-b.top)*a.options.cursorHeight+\"px\";b.other&&(a=c.appendChild(r(\"div\",\"\\u00a0\",\"CodeMirror-cursor CodeMirror-secondarycursor\")),a.style.display=\"\",a.style.left=b.other.left+\"px\",a.style.top=b.other.top+\"px\",a.style.height=.85*(b.other.bottom-b.other.top)+\"px\")}function If(a,b,c){function d(a,\nb,c,d){0>b&&(b=0);b=Math.round(b);d=Math.round(d);h.appendChild(r(\"div\",null,\"CodeMirror-selected\",\"position: absolute; left: \"+a+\"px; top: \"+b+\"px; width: \"+(null==c?p-a:c)+\"px; height: \"+(d-b)+\"px\"))}function e(b,c,e){var f=w(g,b),h=f.text.length,k,n;Jf(fa(f),c||0,null==e?h:e,function(g,u,l){var K=bc(a,q(b,g),\"div\",f,\"left\"),v,r;g==u?(v=K,l=r=K.left):(v=bc(a,q(b,u-1),\"div\",f,\"right\"),\"rtl\"==l&&(l=K,K=v,v=l),l=K.left,r=v.right);null==c&&0==g&&(l=m);3<v.top-K.top&&(d(l,K.top,null,K.bottom),l=m,K.bottom<\nv.top&&d(l,K.bottom,null,v.top));null==e&&u==h&&(r=p);if(!k||K.top<k.top||K.top==k.top&&K.left<k.left)k=K;if(!n||v.bottom>n.bottom||v.bottom==n.bottom&&v.right>n.right)n=v;l<m+1&&(l=m);d(l,v.top,r-l,v.bottom)});return{start:k,end:n}}var f=a.display,g=a.doc,h=document.createDocumentFragment(),k=qe(a.display),m=k.left,p=Math.max(f.sizerWidth,Ga(a)-f.sizer.offsetLeft)-k.right,f=b.from();b=b.to();if(f.line==b.line)e(f.line,f.ch,b.ch);else{var u=w(g,f.line),k=w(g,b.line),k=pa(u)==pa(k),f=e(f.line,f.ch,\nk?u.text.length+1:null).end;b=e(b.line,k?0:null,b.ch).start;k&&(f.top<b.top-2?(d(f.right,f.top,null,f.bottom),d(m,b.top,b.left,b.bottom)):d(f.right,f.top,b.left-f.right,f.bottom));f.bottom<b.top&&d(m,f.bottom,null,b.top)}c.appendChild(h)}function dd(a){if(a.state.focused){var b=a.display;clearInterval(b.blinker);var c=!0;b.cursorDiv.style.visibility=\"\";0<a.options.cursorBlinkRate?b.blinker=setInterval(function(){b.cursorDiv.style.visibility=(c=!c)?\"\":\"hidden\"},a.options.cursorBlinkRate):0>a.options.cursorBlinkRate&&\n(b.cursorDiv.style.visibility=\"hidden\")}}function kb(a,b){a.doc.mode.startState&&a.doc.frontier<a.display.viewTo&&a.state.highlight.set(b,Ec(Kf,a))}function Kf(a){var b=a.doc;b.frontier<b.first&&(b.frontier=b.first);if(!(b.frontier>=a.display.viewTo)){var c=+new Date+a.options.workTime,d=za(b.mode,yb(a,b.frontier)),e=[];b.iter(b.frontier,Math.min(b.first+b.size,a.display.viewTo+500),function(f){if(b.frontier>=a.display.viewFrom){var g=f.styles,h=f.text.length>a.options.maxHighlightLength,k=re(a,f,\nh?za(b.mode,d):d,!0);f.styles=k.styles;var m=f.styleClasses;(k=k.classes)?f.styleClasses=k:m&&(f.styleClasses=null);m=!g||g.length!=f.styles.length||m!=k&&(!m||!k||m.bgClass!=k.bgClass||m.textClass!=k.textClass);for(k=0;!m&&k<g.length;++k)m=g[k]!=f.styles[k];m&&e.push(b.frontier);f.stateAfter=h?d:za(b.mode,d)}else f.text.length<=a.options.maxHighlightLength&&ed(a,f.text,d),f.stateAfter=0==b.frontier%5?za(b.mode,d):null;++b.frontier;if(+new Date>c)return kb(a,a.options.workDelay),!0});e.length&&X(a,\nfunction(){for(var b=0;b<e.length;b++)ta(a,e[b],\"text\")})}}function Lf(a,b,c){for(var d,e,f=a.doc,g=c?-1:b-(a.doc.mode.innerMode?1E3:100);b>g;--b){if(b<=f.first)return f.first;var h=w(f,b-1);if(h.stateAfter&&(!c||b<=f.frontier))return b;h=ha(h.text,null,a.options.tabSize);if(null==e||d>h)e=b-1,d=h}return e}function yb(a,b,c){var d=a.doc,e=a.display;if(!d.mode.startState)return!0;var f=Lf(a,b,c),g=f>d.first&&w(d,f-1).stateAfter,g=g?za(d.mode,g):Mf(d.mode);d.iter(f,b,function(c){ed(a,c.text,g);c.stateAfter=\nf==b-1||0==f%5||f>=e.viewFrom&&f<e.viewTo?za(d.mode,g):null;++f});c&&(d.frontier=f);return g}function Kc(a){return a.mover.offsetHeight-a.lineSpace.offsetHeight}function qe(a){if(a.cachedPaddingH)return a.cachedPaddingH;var b=Y(a.measure,r(\"pre\",\"x\")),b=window.getComputedStyle?window.getComputedStyle(b):b.currentStyle,b={left:parseInt(b.paddingLeft),right:parseInt(b.paddingRight)};isNaN(b.left)||isNaN(b.right)||(a.cachedPaddingH=b);return b}function ka(a){return Ld-a.display.nativeBarWidth}function Ga(a){return a.display.scroller.clientWidth-\nka(a)-a.display.barWidth}function Tc(a){return a.display.scroller.clientHeight-ka(a)-a.display.barHeight}function de(a,b,c){if(a.line==b)return{map:a.measure.map,cache:a.measure.cache};for(var d=0;d<a.rest.length;d++)if(a.rest[d]==b)return{map:a.measure.maps[d],cache:a.measure.caches[d]};for(d=0;d<a.rest.length;d++)if(F(a.rest[d])>c)return{map:a.measure.maps[d],cache:a.measure.caches[d],before:!0}}function $c(a,b){if(b>=a.display.viewFrom&&b<a.display.viewTo)return a.display.view[Ha(a,b)];if((a=a.display.externalMeasured)&&\nb>=a.lineN&&b<a.lineN+a.size)return a}function cc(a,b){var c=F(b),d=$c(a,c);d&&!d.text?d=null:d&&d.changes&&(Rd(a,d,c,Qc(a)),a.curOp.forceUpdate=!0);if(!d){var e;e=pa(b);d=F(e);e=a.display.externalMeasured=new se(a.doc,e,d);e.lineN=d;d=e.built=Vd(a,e);e.text=d.pre;Y(a.display.lineMeasure,d.pre);d=e}a=de(d,b,c);return{line:b,view:d,rect:null,map:a.map,cache:a.cache,before:a.before,hasHeights:!1}}function dc(a,b,c,d,e){b.before&&(c=-1);var f=c+(d||\"\");if(b.cache.hasOwnProperty(f))a=b.cache[f];else{b.rect||\n(b.rect=b.view.text.getBoundingClientRect());if(!b.hasHeights){var g=b.view,h=b.rect,k=a.options.lineWrapping,m=k&&Ga(a);if(!g.measure.heights||k&&g.measure.width!=m){var p=g.measure.heights=[];if(k)for(g.measure.width=m,g=g.text.firstChild.getClientRects(),k=0;k<g.length-1;k++){var m=g[k],u=g[k+1];2<Math.abs(m.bottom-u.bottom)&&p.push((m.bottom+u.top)/2-h.top)}p.push(h.bottom-h.top)}b.hasHeights=!0}p=d;g=ee(b.map,c,p);d=g.node;h=g.start;k=g.end;c=g.collapse;var n;if(3==d.nodeType){for(var l=0;4>\nl;l++){for(;h&&zb(b.line.text.charAt(g.coverStart+h));)--h;for(;g.coverStart+k<g.coverEnd&&zb(b.line.text.charAt(g.coverStart+k));)++k;if(B&&9>A&&0==h&&k==g.coverEnd-g.coverStart)n=d.parentNode.getBoundingClientRect();else{n=$a(d,h,k).getClientRects();k=te;if(\"left\"==p)for(m=0;m<n.length&&(k=n[m]).left==k.right;m++);else for(m=n.length-1;0<=m&&(k=n[m]).left==k.right;m--);n=k}if(n.left||n.right||0==h)break;k=h;--h;c=\"right\"}B&&11>A&&((l=!window.screen||null==screen.logicalXDPI||screen.logicalXDPI==\nscreen.deviceXDPI)||(null!=fd?l=fd:(p=Y(a.display.measure,r(\"span\",\"x\")),l=p.getBoundingClientRect(),p=$a(p,0,1).getBoundingClientRect(),l=fd=1<Math.abs(l.left-p.left)),l=!l),l||(l=screen.logicalXDPI/screen.deviceXDPI,p=screen.logicalYDPI/screen.deviceYDPI,n={left:n.left*l,right:n.right*l,top:n.top*p,bottom:n.bottom*p}))}else 0<h&&(c=p=\"right\"),n=a.options.lineWrapping&&1<(l=d.getClientRects()).length?l[\"right\"==p?l.length-1:0]:d.getBoundingClientRect();!(B&&9>A)||h||n&&(n.left||n.right)||(n=(n=d.parentNode.getClientRects()[0])?\n{left:n.left,right:n.left+lb(a.display),top:n.top,bottom:n.bottom}:te);d=n.top-b.rect.top;h=n.bottom-b.rect.top;p=(d+h)/2;g=b.view.measure.heights;for(l=0;l<g.length-1&&!(p<g[l]);l++);c={left:(\"right\"==c?n.right:n.left)-b.rect.left,right:(\"left\"==c?n.left:n.right)-b.rect.left,top:l?g[l-1]:0,bottom:g[l]};n.left||n.right||(c.bogus=!0);a.options.singleCursorHeightPerLine||(c.rtop=d,c.rbottom=h);a=c;a.bogus||(b.cache[f]=a)}return{left:a.left,right:a.right,top:e?a.rtop:a.top,bottom:e?a.rbottom:a.bottom}}\nfunction ee(a,b,c){for(var d,e,f,g,h=0;h<a.length;h+=3){var k=a[h],m=a[h+1];if(b<k)e=0,f=1,g=\"left\";else if(b<m)e=b-k,f=e+1;else if(h==a.length-3||b==m&&a[h+3]>b)f=m-k,e=f-1,b>=m&&(g=\"right\");if(null!=e){d=a[h+2];k==m&&c==(d.insertLeft?\"left\":\"right\")&&(g=c);if(\"left\"==c&&0==e)for(;h&&a[h-2]==a[h-3]&&a[h-1].insertLeft;)d=a[(h-=3)+2],g=\"left\";if(\"right\"==c&&e==m-k)for(;h<a.length-3&&a[h+3]==a[h+4]&&!a[h+5].insertLeft;)d=a[(h+=3)+2],g=\"right\";break}}return{node:d,start:e,end:f,collapse:g,coverStart:k,\ncoverEnd:m}}function ue(a){if(a.measure&&(a.measure.cache={},a.measure.heights=null,a.rest))for(var b=0;b<a.rest.length;b++)a.measure.caches[b]={}}function ve(a){a.display.externalMeasure=null;wa(a.display.lineMeasure);for(var b=0;b<a.display.view.length;b++)ue(a.display.view[b])}function mb(a){ve(a);a.display.cachedCharWidth=a.display.cachedTextHeight=a.display.cachedPaddingH=null;a.options.lineWrapping||(a.display.maxLineChanged=!0);a.display.lineNumChars=null}function gd(a,b,c,d){if(b.widgets)for(var e=\n0;e<b.widgets.length;++e)if(b.widgets[e].above){var f=Ab(b.widgets[e]);c.top+=f;c.bottom+=f}if(\"line\"==d)return c;d||(d=\"local\");b=la(b);b=\"local\"==d?b+a.display.lineSpace.offsetTop:b-a.display.viewOffset;if(\"page\"==d||\"window\"==d)a=a.display.lineSpace.getBoundingClientRect(),b+=a.top+(\"window\"==d?0:window.pageYOffset||(document.documentElement||document.body).scrollTop),d=a.left+(\"window\"==d?0:window.pageXOffset||(document.documentElement||document.body).scrollLeft),c.left+=d,c.right+=d;c.top+=b;\nc.bottom+=b;return c}function we(a,b,c){if(\"div\"==c)return b;var d=b.left;b=b.top;\"page\"==c?(d-=window.pageXOffset||(document.documentElement||document.body).scrollLeft,b-=window.pageYOffset||(document.documentElement||document.body).scrollTop):\"local\"!=c&&c||(c=a.display.sizer.getBoundingClientRect(),d+=c.left,b+=c.top);a=a.display.lineSpace.getBoundingClientRect();return{left:d-a.left,top:b-a.top}}function bc(a,b,c,d,e){d||(d=w(a.doc,b.line));var f=d;b=b.ch;d=dc(a,cc(a,d),b,e);return gd(a,f,d,c)}\nfunction sa(a,b,c,d,e,f){function g(b,g){b=dc(a,e,b,g?\"right\":\"left\",f);g?b.left=b.right:b.right=b.left;return gd(a,d,b,c)}function h(a,b){var c=k[b],d=c.level%2;a==hd(c)&&b&&c.level<k[b-1].level?(c=k[--b],a=id(c)-(c.level%2?0:1),d=!0):a==id(c)&&b<k.length-1&&c.level<k[b+1].level&&(c=k[++b],a=hd(c)-c.level%2,d=!1);return d&&a==c.to&&a>c.from?g(a-1):g(a,d)}d=d||w(a.doc,b.line);e||(e=cc(a,d));var k=fa(d);b=b.ch;if(!k)return g(b);var m=Xb(k,b),m=h(b,m);null!=Bb&&(m.other=h(b,Bb));return m}function xe(a,\nb){var c=0;b=z(a.doc,b);a.options.lineWrapping||(c=lb(a.display)*b.ch);b=w(a.doc,b.line);a=la(b)+a.display.lineSpace.offsetTop;return{left:c,right:c,top:a,bottom:a+b.height}}function ec(a,b,c,d){a=q(a,b);a.xRel=d;c&&(a.outside=!0);return a}function jd(a,b,c){var d=a.doc;c+=a.display.viewOffset;if(0>c)return ec(d.first,0,!0,-1);var e=Fa(d,c),f=d.first+d.size-1;if(e>f)return ec(d.first+d.size-1,w(d,f).text.length,!0,1);0>b&&(b=0);for(d=w(d,e);;)if(e=Nf(a,d,e,b,c),f=(d=Ea(d,!1))&&d.find(0,!0),d&&(e.ch>\nf.from.ch||e.ch==f.from.ch&&0<e.xRel))e=F(d=f.to.line);else return e}function Nf(a,b,c,d,e){function f(d){d=sa(a,q(c,d),\"line\",b,m);h=!0;if(g>d.bottom)return d.left-k;if(g<d.top)return d.left+k;h=!1;return d.left}var g=e-la(b),h=!1,k=2*a.display.wrapper.clientWidth,m=cc(a,b);e=fa(b);var p=b.text.length,u=fc(b),n=gc(b),l=f(u),v=h,r=f(n),w=h;if(d>r)return ec(c,n,w,1);for(;;){if(e?n==u||n==kd(b,u,1):1>=n-u){p=d<l||d-l<=r-d?u:n;v=p==u?v:w;u=d-(p==u?l:r);w&&!e&&!/\\s/.test(b.text.charAt(p))&&0<u&&p<b.text.length&&\n1<m.view.measure.heights.length&&(e=dc(a,m,p,\"right\"),g<=e.bottom&&g>=e.top&&Math.abs(d-e.right)<u&&(v=!1,p++,u=d-e.right));for(;zb(b.text.charAt(p));)++p;return ec(c,p,v,-1>u?-1:1<u?1:0)}var y=Math.ceil(p/2),x=u+y;if(e)for(var x=u,t=0;t<y;++t)x=kd(b,x,1);t=f(x);if(t>d){n=x;r=t;if(w=h)r+=1E3;p=y}else u=x,l=t,v=h,p-=y}}function Ca(a){if(null!=a.cachedTextHeight)return a.cachedTextHeight;if(null==Ja){Ja=r(\"pre\");for(var b=0;49>b;++b)Ja.appendChild(document.createTextNode(\"x\")),Ja.appendChild(r(\"br\"));\nJa.appendChild(document.createTextNode(\"x\"))}Y(a.measure,Ja);b=Ja.offsetHeight/50;3<b&&(a.cachedTextHeight=b);wa(a.measure);return b||1}function lb(a){if(null!=a.cachedCharWidth)return a.cachedCharWidth;var b=r(\"span\",\"xxxxxxxxxx\"),c=r(\"pre\",[b]);Y(a.measure,c);b=b.getBoundingClientRect();b=(b.right-b.left)/10;2<b&&(a.cachedCharWidth=b);return b||10}function Ra(a){a.curOp={cm:a,viewChanged:!1,startHeight:a.doc.height,forceUpdate:!1,updateInput:null,typing:!1,changeObjs:null,cursorActivityHandlers:null,\ncursorActivityCalled:0,selectionChanged:!1,updateMaxLine:!1,scrollLeft:null,scrollTop:null,scrollToPos:null,focus:!1,id:++Of};ab?ab.ops.push(a.curOp):a.curOp.ownsGroup=ab={ops:[a.curOp],delayedCallbacks:[]}}function Ta(a){if(a=a.curOp.ownsGroup)try{var b=a.delayedCallbacks,c=0;do{for(;c<b.length;c++)b[c].call(null);for(var d=0;d<a.ops.length;d++){var e=a.ops[d];if(e.cursorActivityHandlers)for(;e.cursorActivityCalled<e.cursorActivityHandlers.length;)e.cursorActivityHandlers[e.cursorActivityCalled++].call(null,\ne.cm)}}while(c<b.length)}finally{ab=null;for(b=0;b<a.ops.length;b++)a.ops[b].cm.curOp=null;a=a.ops;for(b=0;b<a.length;b++){var e=a[b],c=e.cm,f=d=c.display;!f.scrollbarsClipped&&f.scroller.offsetWidth&&(f.nativeBarWidth=f.scroller.offsetWidth-f.scroller.clientWidth,f.heightForcer.style.height=ka(c)+\"px\",f.sizer.style.marginBottom=-f.nativeBarWidth+\"px\",f.sizer.style.borderRightWidth=ka(c)+\"px\",f.scrollbarsClipped=!0);e.updateMaxLine&&Jc(c);e.mustUpdate=e.viewChanged||e.forceUpdate||null!=e.scrollTop||\ne.scrollToPos&&(e.scrollToPos.from.line<d.viewFrom||e.scrollToPos.to.line>=d.viewTo)||d.maxLineChanged&&c.options.lineWrapping;e.update=e.mustUpdate&&new Rb(c,e.mustUpdate&&{top:e.scrollTop,ensure:e.scrollToPos},e.forceUpdate)}for(b=0;b<a.length;b++)e=a[b],e.updatedDisplay=e.mustUpdate&&Rc(e.cm,e.update);for(b=0;b<a.length;b++)if(e=a[b],c=e.cm,d=c.display,e.updatedDisplay&&Qb(c),e.barMeasure=ob(c),d.maxLineChanged&&!c.options.lineWrapping&&(f=d.maxLine.text.length,f=dc(c,cc(c,d.maxLine),f,void 0),\ne.adjustWidthTo=f.left+3,c.display.sizerWidth=e.adjustWidthTo,e.barMeasure.scrollWidth=Math.max(d.scroller.clientWidth,d.sizer.offsetLeft+e.adjustWidthTo+ka(c)+c.display.barWidth),e.maxScrollLeft=Math.max(0,d.sizer.offsetLeft+e.adjustWidthTo-Ga(c))),e.updatedDisplay||e.selectionChanged)e.preparedSelection=d.input.prepareSelection(e.focus);for(b=0;b<a.length;b++)e=a[b],c=e.cm,null!=e.adjustWidthTo&&(c.display.sizer.style.minWidth=e.adjustWidthTo+\"px\",e.maxScrollLeft<c.doc.scrollLeft&&Ua(c,Math.min(c.display.scroller.scrollLeft,\ne.maxScrollLeft),!0),c.display.maxLineChanged=!1),d=e.focus&&e.focus==ma()&&(!document.hasFocus||document.hasFocus()),e.preparedSelection&&c.display.input.showSelection(e.preparedSelection,d),(e.updatedDisplay||e.startHeight!=c.doc.height)&&Va(c,e.barMeasure),e.updatedDisplay&&Uc(c,e.barMeasure),e.selectionChanged&&dd(c),c.state.focused&&e.updateInput&&c.display.input.reset(e.typing),d&&Xd(e.cm);for(b=0;b<a.length;b++){e=a[b];c=e.cm;d=c.display;f=c.doc;e.updatedDisplay&&Pd(c,e.update);null==d.wheelStartX||\nnull==e.scrollTop&&null==e.scrollLeft&&!e.scrollToPos||(d.wheelStartX=d.wheelStartY=null);null==e.scrollTop||d.scroller.scrollTop==e.scrollTop&&!e.forceScroll||(f.scrollTop=Math.max(0,Math.min(d.scroller.scrollHeight-d.scroller.clientHeight,e.scrollTop)),d.scrollbars.setScrollTop(f.scrollTop),d.scroller.scrollTop=f.scrollTop);null==e.scrollLeft||d.scroller.scrollLeft==e.scrollLeft&&!e.forceScroll||(f.scrollLeft=Math.max(0,Math.min(d.scroller.scrollWidth-d.scroller.clientWidth,e.scrollLeft)),d.scrollbars.setScrollLeft(f.scrollLeft),\nd.scroller.scrollLeft=f.scrollLeft,Hc(c));if(e.scrollToPos){var g,h=z(f,e.scrollToPos.from);g=z(f,e.scrollToPos.to);var k=e.scrollToPos.margin;null==k&&(k=0);for(var m=0;5>m;m++){var p=!1,u=sa(c,h),n=g&&g!=h?sa(c,g):u,n=hc(c,Math.min(u.left,n.left),Math.min(u.top,n.top)-k,Math.max(u.left,n.left),Math.max(u.bottom,n.bottom)+k),l=c.doc.scrollTop,q=c.doc.scrollLeft;null!=n.scrollTop&&(qb(c,n.scrollTop),1<Math.abs(c.doc.scrollTop-l)&&(p=!0));null!=n.scrollLeft&&(Ua(c,n.scrollLeft),1<Math.abs(c.doc.scrollLeft-\nq)&&(p=!0));if(!p)break}g=u;e.scrollToPos.isCursor&&c.state.focused&&(D(c,\"scrollCursorIntoView\")||(k=c.display,m=k.sizer.getBoundingClientRect(),h=null,0>g.top+m.top?h=!0:g.bottom+m.top>(window.innerHeight||document.documentElement.clientHeight)&&(h=!1),null==h||Pf||(g=r(\"div\",\"\\u200b\",null,\"position: absolute; top: \"+(g.top-k.viewOffset-c.display.lineSpace.offsetTop)+\"px; height: \"+(g.bottom-g.top+ka(c)+k.barHeight)+\"px; left: \"+g.left+\"px; width: 2px;\"),c.display.lineSpace.appendChild(g),g.scrollIntoView(h),\nc.display.lineSpace.removeChild(g))))}h=e.maybeHiddenMarkers;g=e.maybeUnhiddenMarkers;if(h)for(k=0;k<h.length;++k)h[k].lines.length||L(h[k],\"hide\");if(g)for(k=0;k<g.length;++k)g[k].lines.length&&L(g[k],\"unhide\");d.wrapper.offsetHeight&&(f.scrollTop=c.display.scroller.scrollTop);e.changeObjs&&L(c,\"changes\",c,e.changeObjs);e.update&&e.update.finish()}}}function X(a,b){if(a.curOp)return b();Ra(a);try{return b()}finally{Ta(a)}}function H(a,b){return function(){if(a.curOp)return b.apply(a,arguments);Ra(a);\ntry{return b.apply(a,arguments)}finally{Ta(a)}}}function O(a){return function(){if(this.curOp)return a.apply(this,arguments);Ra(this);try{return a.apply(this,arguments)}finally{Ta(this)}}}function Q(a){return function(){var b=this.cm;if(!b||b.curOp)return a.apply(this,arguments);Ra(b);try{return a.apply(this,arguments)}finally{Ta(b)}}}function se(a,b,c){for(var d=this.line=b,e;d=Ea(d,!1);)d=d.find(1,!0).line,(e||(e=[])).push(d);this.size=(this.rest=e)?F(C(this.rest))-c+1:1;this.node=this.text=null;\nthis.hidden=Da(a,b)}function Sb(a,b,c){var d=[],e;for(e=b;e<c;)b=new se(a.doc,w(a.doc,e),e),e+=b.size,d.push(b);return d}function P(a,b,c,d){null==b&&(b=a.doc.first);null==c&&(c=a.doc.first+a.doc.size);d||(d=0);var e=a.display;d&&c<e.viewTo&&(null==e.updateLineNumbers||e.updateLineNumbers>b)&&(e.updateLineNumbers=b);a.curOp.viewChanged=!0;if(b>=e.viewTo)ya&&Sc(a.doc,b)<e.viewTo&&xa(a);else if(c<=e.viewFrom)ya&&Od(a.doc,c+d)>e.viewFrom?xa(a):(e.viewFrom+=d,e.viewTo+=d);else if(b<=e.viewFrom&&c>=e.viewTo)xa(a);\nelse if(b<=e.viewFrom){var f=ic(a,c,c+d,1);f?(e.view=e.view.slice(f.index),e.viewFrom=f.lineN,e.viewTo+=d):xa(a)}else if(c>=e.viewTo)(f=ic(a,b,b,-1))?(e.view=e.view.slice(0,f.index),e.viewTo=f.lineN):xa(a);else{var f=ic(a,b,b,-1),g=ic(a,c,c+d,1);f&&g?(e.view=e.view.slice(0,f.index).concat(Sb(a,f.lineN,g.lineN)).concat(e.view.slice(g.index)),e.viewTo+=d):xa(a)}if(a=e.externalMeasured)c<a.lineN?a.lineN+=d:b<a.lineN+a.size&&(e.externalMeasured=null)}function ta(a,b,c){a.curOp.viewChanged=!0;var d=a.display,\ne=a.display.externalMeasured;e&&b>=e.lineN&&b<e.lineN+e.size&&(d.externalMeasured=null);b<d.viewFrom||b>=d.viewTo||(a=d.view[Ha(a,b)],null!=a.node&&(a=a.changes||(a.changes=[]),-1==N(a,c)&&a.push(c)))}function xa(a){a.display.viewFrom=a.display.viewTo=a.doc.first;a.display.view=[];a.display.viewOffset=0}function Ha(a,b){if(b>=a.display.viewTo)return null;b-=a.display.viewFrom;if(0>b)return null;a=a.display.view;for(var c=0;c<a.length;c++)if(b-=a[c].size,0>b)return c}function ic(a,b,c,d){var e=Ha(a,\nb),f=a.display.view;if(!ya||c==a.doc.first+a.doc.size)return{index:e,lineN:c};for(var g=0,h=a.display.viewFrom;g<e;g++)h+=f[g].size;if(h!=b){if(0<d){if(e==f.length-1)return null;b=h+f[e].size-b;e++}else b=h-b;c+=b}for(;Sc(a.doc,c)!=c;){if(e==(0>d?0:f.length-1))return null;c+=d*f[e-(0>d?1:0)].size;e+=d}return{index:e,lineN:c}}function Nd(a){a=a.display.view;for(var b=0,c=0;c<a.length;c++){var d=a[c];d.hidden||d.node&&!d.changes||++b}return b}function Bf(a){function b(){d.activeTouch&&(e=setTimeout(function(){d.activeTouch=\nnull},1E3),f=d.activeTouch,f.end=+new Date)}function c(a,b){if(null==b.left)return!0;var c=b.left-a.left;a=b.top-a.top;return 400<c*c+a*a}var d=a.display;y(d.scroller,\"mousedown\",H(a,Qf));B&&11>A?y(d.scroller,\"dblclick\",H(a,function(b){if(!D(a,b)){var c=Ka(a,b);!c||ld(a,b,\"gutterClick\",!0)||ua(a.display,b)||(R(b),b=a.findWordAt(c),Zb(a.doc,b.anchor,b.head))}})):y(d.scroller,\"dblclick\",function(b){D(a,b)||R(b)});md||y(d.scroller,\"contextmenu\",function(b){ye(a,b)});var e,f={end:0};y(d.scroller,\"touchstart\",\nfunction(b){var c;if(c=!D(a,b))1!=b.touches.length?c=!1:(c=b.touches[0],c=1>=c.radiusX&&1>=c.radiusY),c=!c;c&&(clearTimeout(e),c=+new Date,d.activeTouch={start:c,moved:!1,prev:300>=c-f.end?f:null},1==b.touches.length&&(d.activeTouch.left=b.touches[0].pageX,d.activeTouch.top=b.touches[0].pageY))});y(d.scroller,\"touchmove\",function(){d.activeTouch&&(d.activeTouch.moved=!0)});y(d.scroller,\"touchend\",function(e){var f=d.activeTouch;if(f&&!ua(d,e)&&null!=f.left&&!f.moved&&300>new Date-f.start){var g=a.coordsChar(d.activeTouch,\n\"page\"),f=!f.prev||c(f,f.prev)?new G(g,g):!f.prev.prev||c(f,f.prev.prev)?a.findWordAt(g):new G(q(g.line,0),z(a.doc,q(g.line+1,0)));a.setSelection(f.anchor,f.head);a.focus();R(e)}b()});y(d.scroller,\"touchcancel\",b);y(d.scroller,\"scroll\",function(){d.scroller.clientHeight&&(qb(a,d.scroller.scrollTop),Ua(a,d.scroller.scrollLeft,!0),L(a,\"scroll\",a))});y(d.scroller,\"mousewheel\",function(b){ze(a,b)});y(d.scroller,\"DOMMouseScroll\",function(b){ze(a,b)});y(d.wrapper,\"scroll\",function(){d.wrapper.scrollTop=\nd.wrapper.scrollLeft=0});d.dragFunctions={enter:function(b){D(a,b)||jc(b)},over:function(b){if(!D(a,b)){var c=Ka(a,b);if(c){var d=document.createDocumentFragment();pe(a,c,d);a.display.dragCursor||(a.display.dragCursor=r(\"div\",null,\"CodeMirror-cursors CodeMirror-dragcursors\"),a.display.lineSpace.insertBefore(a.display.dragCursor,a.display.cursorDiv));Y(a.display.dragCursor,d)}jc(b)}},start:function(b){if(B&&(!a.state.draggingText||100>+new Date-Ae))jc(b);else if(!D(a,b)&&!ua(a.display,b)&&(b.dataTransfer.setData(\"Text\",\na.getSelection()),b.dataTransfer.effectAllowed=\"copyMove\",b.dataTransfer.setDragImage&&!Be)){var c=r(\"img\",null,null,\"position: fixed; left: 0; top: 0;\");c.src=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\";ia&&(c.width=c.height=1,a.display.wrapper.appendChild(c),c._top=c.offsetTop);b.dataTransfer.setDragImage(c,0,0);ia&&c.parentNode.removeChild(c)}},drop:H(a,Rf),leave:function(b){D(a,b)||Ce(a)}};var g=d.input.getField();y(g,\"keyup\",function(b){De.call(a,b)});y(g,\"keydown\",\nH(a,Ee));y(g,\"keypress\",H(a,Fe));y(g,\"focus\",function(b){Fc(a,b)});y(g,\"blur\",function(b){jb(a,b)})}function Sf(a){var b=a.display;if(b.lastWrapHeight!=b.wrapper.clientHeight||b.lastWrapWidth!=b.wrapper.clientWidth)b.cachedCharWidth=b.cachedTextHeight=b.cachedPaddingH=null,b.scrollbarsClipped=!1,a.setSize()}function ua(a,b){for(b=b.target||b.srcElement;b!=a.wrapper;b=b.parentNode)if(!b||1==b.nodeType&&\"true\"==b.getAttribute(\"cm-ignore-events\")||b.parentNode==a.sizer&&b!=a.mover)return!0}function Ka(a,\nb,c,d){var e=a.display;if(!c&&\"true\"==(b.target||b.srcElement).getAttribute(\"cm-not-content\"))return null;var f,g;c=e.lineSpace.getBoundingClientRect();try{f=b.clientX-c.left,g=b.clientY-c.top}catch(k){return null}b=jd(a,f,g);var h;d&&1==b.xRel&&(h=w(a.doc,b.line).text).length==b.ch&&(d=ha(h,h.length,a.options.tabSize)-h.length,b=q(b.line,Math.max(0,Math.round((f-qe(a.display).left)/lb(a.display))-d)));return b}function Qf(a){var b=this.display;if(!(D(this,a)||b.activeTouch&&b.input.supportsTouch()))if(b.shift=\na.shiftKey,ua(b,a))M||(b.scroller.draggable=!1,setTimeout(function(){b.scroller.draggable=!0},100));else if(!ld(this,a,\"gutterClick\",!0)){var c=Ka(this,a);window.focus();switch(Ge(a)){case 1:this.state.selectingText?this.state.selectingText(a):c?Tf(this,a,c):(a.target||a.srcElement)==b.scroller&&R(a);break;case 2:M&&(this.state.lastMiddleDown=+new Date);c&&Zb(this.doc,c);setTimeout(function(){b.input.focus()},20);R(a);break;case 3:md?ye(this,a):Uf(this)}}}function Tf(a,b,c){B?setTimeout(Ec(Xd,a),\n0):a.curOp.focus=ma();var d=+new Date,e;kc&&kc.time>d-400&&0==t(kc.pos,c)?e=\"triple\":lc&&lc.time>d-400&&0==t(lc.pos,c)?(e=\"double\",kc={time:d,pos:c}):(e=\"single\",lc={time:d,pos:c});var d=a.doc.sel,f=ea?b.metaKey:b.ctrlKey,g;a.options.dragDrop&&Vf&&!a.isReadOnly()&&\"single\"==e&&-1<(g=d.contains(c))&&(0>t((g=d.ranges[g]).from(),c)||0<c.xRel)&&(0<t(g.to(),c)||0>c.xRel)?Wf(a,b,c,f):Xf(a,b,c,e,f)}function Wf(a,b,c,d){var e=a.display,f=+new Date,g=H(a,function(h){M&&(e.scroller.draggable=!1);a.state.draggingText=\n!1;qa(document,\"mouseup\",g);qa(e.scroller,\"drop\",g);10>Math.abs(b.clientX-h.clientX)+Math.abs(b.clientY-h.clientY)&&(R(h),!d&&+new Date-200<f&&Zb(a.doc,c),M||B&&9==A?setTimeout(function(){document.body.focus();e.input.focus()},20):e.input.focus())});M&&(e.scroller.draggable=!0);a.state.draggingText=g;g.copy=ea?b.altKey:b.ctrlKey;e.scroller.dragDrop&&e.scroller.dragDrop();y(document,\"mouseup\",g);y(e.scroller,\"drop\",g)}function Xf(a,b,c,d,e){function f(b){if(0!=t(r,b))if(r=b,\"rect\"==d){for(var e=[],\nf=a.options.tabSize,g=ha(w(m,c.line).text,c.ch,f),h=ha(w(m,b.line).text,b.ch,f),k=Math.min(g,h),g=Math.max(g,h),h=Math.min(c.line,b.line),l=Math.min(a.lastLine(),Math.max(c.line,b.line));h<=l;h++){var v=w(m,h).text,K=He(v,k,f);k==g?e.push(new G(q(h,K),q(h,K))):v.length>K&&e.push(new G(q(h,K),q(h,He(v,g,f))))}e.length||e.push(new G(c,c));E(m,ga(n.ranges.slice(0,u).concat(e),u),{origin:\"*mouse\",scroll:!1});a.scrollIntoView(b)}else e=p,f=e.anchor,k=b,\"single\"!=d&&(b=\"double\"==d?a.findWordAt(b):new G(q(b.line,\n0),z(m,q(b.line+1,0))),0<t(b.anchor,f)?(k=b.head,f=Ub(e.from(),b.anchor)):(k=b.anchor,f=Tb(e.to(),b.head))),e=n.ranges.slice(0),e[u]=new G(z(m,f),k),E(m,ga(e,u),nd)}function g(b){var c=++B,e=Ka(a,b,!0,\"rect\"==d);if(e)if(0!=t(e,r)){a.curOp.focus=ma();f(e);var h=Nc(k,m);(e.line>=h.to||e.line<h.from)&&setTimeout(H(a,function(){B==c&&g(b)}),150)}else{var p=b.clientY<x.top?-20:b.clientY>x.bottom?20:0;p&&setTimeout(H(a,function(){B==c&&(k.scroller.scrollTop+=p,g(b))}),50)}}function h(b){a.state.selectingText=\n!1;B=Infinity;R(b);k.input.focus();qa(document,\"mousemove\",C);qa(document,\"mouseup\",F);m.history.lastSelOrigin=null}var k=a.display,m=a.doc;R(b);var p,u,n=m.sel,l=n.ranges;e&&!b.shiftKey?(u=m.sel.contains(c),p=-1<u?l[u]:new G(c,c)):(p=m.sel.primary(),u=m.sel.primIndex);if(Yf?b.shiftKey&&b.metaKey:b.altKey)d=\"rect\",e||(p=new G(c,c)),c=Ka(a,b,!0,!0),u=-1;else if(\"double\"==d){var v=a.findWordAt(c);p=a.display.shift||m.extend?xb(m,p,v.anchor,v.head):v}else\"triple\"==d?(v=new G(q(c.line,0),z(m,q(c.line+\n1,0))),p=a.display.shift||m.extend?xb(m,p,v.anchor,v.head):v):p=xb(m,p,c);e?-1==u?(u=l.length,E(m,ga(l.concat([p]),u),{scroll:!1,origin:\"*mouse\"})):1<l.length&&l[u].empty()&&\"single\"==d&&!b.shiftKey?(E(m,ga(l.slice(0,u).concat(l.slice(u+1)),0),{scroll:!1,origin:\"*mouse\"}),n=m.sel):bd(m,u,p,nd):(u=0,E(m,new ra([p],0),nd),n=m.sel);var r=c,x=k.wrapper.getBoundingClientRect(),B=0,C=H(a,function(a){Ge(a)?g(a):h(a)}),F=H(a,h);a.state.selectingText=F;y(document,\"mousemove\",C);y(document,\"mouseup\",F)}function ld(a,\nb,c,d){try{var e=b.clientX,f=b.clientY}catch(k){return!1}if(e>=Math.floor(a.display.gutters.getBoundingClientRect().right))return!1;d&&R(b);d=a.display;var g=d.lineDiv.getBoundingClientRect();if(f>g.bottom||!ca(a,c))return od(b);f-=g.top-d.viewOffset;for(g=0;g<a.options.gutters.length;++g){var h=d.gutters.childNodes[g];if(h&&h.getBoundingClientRect().right>=e)return e=Fa(a.doc,f),L(a,c,a,e,a.options.gutters[g],b),od(b)}}function Rf(a){var b=this;Ce(b);if(!D(b,a)&&!ua(b.display,a)){R(a);B&&(Ae=+new Date);\nvar c=Ka(b,a,!0),d=a.dataTransfer.files;if(c&&!b.isReadOnly())if(d&&d.length&&window.FileReader&&window.File){var e=d.length,f=Array(e),g=0;a=function(a,d){if(!b.options.allowDropFileTypes||-1!=N(b.options.allowDropFileTypes,a.type)){var h=new FileReader;h.onload=H(b,function(){var a=h.result;/[\\x00-\\x08\\x0e-\\x1f]{2}/.test(a)&&(a=\"\");f[d]=a;++g==e&&(c=z(b.doc,c),a={from:c,to:c,text:b.doc.splitLines(f.join(b.doc.lineSeparator())),origin:\"paste\"},Wa(b.doc,a),he(b.doc,na(c,La(a))))});h.readAsText(a)}};\nfor(var h=0;h<e;++h)a(d[h],h)}else if(b.state.draggingText&&-1<b.doc.sel.contains(c))b.state.draggingText(a),setTimeout(function(){b.display.input.focus()},20);else try{if(f=a.dataTransfer.getData(\"Text\")){if(b.state.draggingText&&!b.state.draggingText.copy)var k=b.listSelections();$b(b.doc,na(c,c));if(k)for(h=0;h<k.length;++h)bb(b.doc,\"\",k[h].anchor,k[h].head,\"drag\");b.replaceSelection(f,\"around\",\"paste\");b.display.input.focus()}}catch(m){}}}function Ce(a){a.display.dragCursor&&(a.display.lineSpace.removeChild(a.display.dragCursor),\na.display.dragCursor=null)}function qb(a,b){2>Math.abs(a.doc.scrollTop-b)||(a.doc.scrollTop=b,va||Vc(a,{top:b}),a.display.scroller.scrollTop!=b&&(a.display.scroller.scrollTop=b),a.display.scrollbars.setScrollTop(b),va&&Vc(a),kb(a,100))}function Ua(a,b,c){(c?b==a.doc.scrollLeft:2>Math.abs(a.doc.scrollLeft-b))||(b=Math.min(b,a.display.scroller.scrollWidth-a.display.scroller.clientWidth),a.doc.scrollLeft=b,Hc(a),a.display.scroller.scrollLeft!=b&&(a.display.scroller.scrollLeft=b),a.display.scrollbars.setScrollLeft(b))}\nfunction ze(a,b){var c=Ie(b),d=c.x,c=c.y,e=a.display,f=e.scroller,g=f.scrollWidth>f.clientWidth,h=f.scrollHeight>f.clientHeight;if(d&&g||c&&h){if(c&&ea&&M){var g=b.target,k=e.view;a:for(;g!=f;g=g.parentNode)for(var m=0;m<k.length;m++)if(k[m].node==g){a.display.currentWheelTarget=g;break a}}!d||va||ia||null==Z?(c&&null!=Z&&(b=c*Z,h=a.doc.scrollTop,g=h+e.wrapper.clientHeight,0>b?h=Math.max(0,h+b-50):g=Math.min(a.doc.height,g+b+50),Vc(a,{top:h,bottom:g})),20>mc&&(null==e.wheelStartX?(e.wheelStartX=f.scrollLeft,\ne.wheelStartY=f.scrollTop,e.wheelDX=d,e.wheelDY=c,setTimeout(function(){if(null!=e.wheelStartX){var a=f.scrollLeft-e.wheelStartX,b=f.scrollTop-e.wheelStartY,a=b&&e.wheelDY&&b/e.wheelDY||a&&e.wheelDX&&a/e.wheelDX;e.wheelStartX=e.wheelStartY=null;a&&(Z=(Z*mc+a)/(mc+1),++mc)}},200)):(e.wheelDX+=d,e.wheelDY+=c))):(c&&h&&qb(a,Math.max(0,Math.min(f.scrollTop+c*Z,f.scrollHeight-f.clientHeight))),Ua(a,Math.max(0,Math.min(f.scrollLeft+d*Z,f.scrollWidth-f.clientWidth))),(!c||c&&h)&&R(b),e.wheelStartX=null)}}\nfunction nc(a,b,c){if(\"string\"==typeof b&&(b=oc[b],!b))return!1;a.display.input.ensurePolled();var d=a.display.shift,e=!1;try{a.isReadOnly()&&(a.state.suppressEdits=!0),c&&(a.display.shift=!1),e=b(a)!=Je}finally{a.display.shift=d,a.state.suppressEdits=!1}return e}function Zf(a,b,c){for(var d=0;d<a.state.keyMaps.length;d++){var e=Cb(b,a.state.keyMaps[d],c,a);if(e)return e}return a.options.extraKeys&&Cb(b,a.options.extraKeys,c,a)||Cb(b,a.options.keyMap,c,a)}function pc(a,b,c,d){var e=a.state.keySeq;\nif(e){if($f(b))return\"handled\";ag.set(50,function(){a.state.keySeq==e&&(a.state.keySeq=null,a.display.input.reset())});b=e+\" \"+b}d=Zf(a,b,d);\"multi\"==d&&(a.state.keySeq=b);\"handled\"==d&&V(a,\"keyHandled\",a,b,c);if(\"handled\"==d||\"multi\"==d)R(c),dd(a);return e&&!d&&/\\'$/.test(b)?(R(c),!0):!!d}function Ke(a,b){var c=bg(b,!0);return c?b.shiftKey&&!a.state.keySeq?pc(a,\"Shift-\"+c,b,function(b){return nc(a,b,!0)})||pc(a,c,b,function(b){if(\"string\"==typeof b?/^go[A-Z]/.test(b):b.motion)return nc(a,b)}):pc(a,\nc,b,function(b){return nc(a,b)}):!1}function cg(a,b,c){return pc(a,\"'\"+c+\"'\",b,function(b){return nc(a,b,!0)})}function Ee(a){this.curOp.focus=ma();if(!D(this,a)){B&&11>A&&27==a.keyCode&&(a.returnValue=!1);var b=a.keyCode;this.display.shift=16==b||a.shiftKey;var c=Ke(this,a);ia&&(pd=c?b:null,!c&&88==b&&!Le&&(ea?a.metaKey:a.ctrlKey)&&this.replaceSelection(\"\",null,\"cut\"));18!=b||/\\bCodeMirror-crosshair\\b/.test(this.display.lineDiv.className)||dg(this)}}function dg(a){function b(a){18!=a.keyCode&&a.altKey||\n(pb(c,\"CodeMirror-crosshair\"),qa(document,\"keyup\",b),qa(document,\"mouseover\",b))}var c=a.display.lineDiv;rb(c,\"CodeMirror-crosshair\");y(document,\"keyup\",b);y(document,\"mouseover\",b)}function De(a){16==a.keyCode&&(this.doc.sel.shift=!1);D(this,a)}function Fe(a){if(!(ua(this.display,a)||D(this,a)||a.ctrlKey&&!a.altKey||ea&&a.metaKey)){var b=a.keyCode,c=a.charCode;if(ia&&b==pd)pd=null,R(a);else if(!ia||a.which&&!(10>a.which)||!Ke(this,a))if(b=String.fromCharCode(null==c?b:c),!cg(this,a,b))this.display.input.onKeyPress(a)}}\nfunction Uf(a){a.state.delayingBlurEvent=!0;setTimeout(function(){a.state.delayingBlurEvent&&(a.state.delayingBlurEvent=!1,jb(a))},100)}function Fc(a,b){a.state.delayingBlurEvent&&(a.state.delayingBlurEvent=!1);\"nocursor\"!=a.options.readOnly&&(a.state.focused||(L(a,\"focus\",a,b),a.state.focused=!0,rb(a.display.wrapper,\"CodeMirror-focused\"),a.curOp||a.display.selForContextMenu==a.doc.sel||(a.display.input.reset(),M&&setTimeout(function(){a.display.input.reset(!0)},20)),a.display.input.receivedFocus()),\ndd(a))}function jb(a,b){a.state.delayingBlurEvent||(a.state.focused&&(L(a,\"blur\",a,b),a.state.focused=!1,pb(a.display.wrapper,\"CodeMirror-focused\")),clearInterval(a.display.blinker),setTimeout(function(){a.state.focused||(a.display.shift=!1)},150))}function ye(a,b){var c;(c=ua(a.display,b))||(c=ca(a,\"gutterContextMenu\")?ld(a,b,\"gutterContextMenu\",!1):!1);if(!c&&!D(a,b,\"contextmenu\"))a.display.input.onContextMenu(b)}function Me(a,b){if(0>t(a,b.from))return a;if(0>=t(a,b.to))return La(b);var c=a.line+\nb.text.length-(b.to.line-b.from.line)-1,d=a.ch;a.line==b.to.line&&(d+=La(b).ch-b.to.ch);return q(c,d)}function qd(a,b){for(var c=[],d=0;d<a.sel.ranges.length;d++){var e=a.sel.ranges[d];c.push(new G(Me(e.anchor,b),Me(e.head,b)))}return ga(c,a.sel.primIndex)}function Ne(a,b,c){return a.line==b.line?q(c.line,a.ch-b.ch+c.ch):q(c.line+(a.line-b.line),a.ch)}function Oe(a,b,c){b={canceled:!1,from:b.from,to:b.to,text:b.text,origin:b.origin,cancel:function(){this.canceled=!0}};c&&(b.update=function(b,c,f,\ng){b&&(this.from=z(a,b));c&&(this.to=z(a,c));f&&(this.text=f);void 0!==g&&(this.origin=g)});L(a,\"beforeChange\",a,b);a.cm&&L(a.cm,\"beforeChange\",a.cm,b);return b.canceled?null:{from:b.from,to:b.to,text:b.text,origin:b.origin}}function Wa(a,b,c){if(a.cm){if(!a.cm.curOp)return H(a.cm,Wa)(a,b,c);if(a.cm.state.suppressEdits)return}if(ca(a,\"beforeChange\")||a.cm&&ca(a.cm,\"beforeChange\"))if(b=Oe(a,b,!0),!b)return;if(c=Pe&&!c&&eg(a,b.from,b.to))for(var d=c.length-1;0<=d;--d)Qe(a,{from:c[d].from,to:c[d].to,\ntext:d?[\"\"]:b.text});else Qe(a,b)}function Qe(a,b){if(1!=b.text.length||\"\"!=b.text[0]||0!=t(b.from,b.to)){var c=qd(a,b);Re(a,b,c,a.cm?a.cm.curOp.id:NaN);Db(a,b,c,rd(a,b));var d=[];Ma(a,function(a,c){c||-1!=N(d,a.history)||(Se(a.history,b),d.push(a.history));Db(a,b,null,rd(a,b))})}}function qc(a,b,c){if(!a.cm||!a.cm.state.suppressEdits||c){for(var d=a.history,e,f=a.sel,g=\"undo\"==b?d.done:d.undone,h=\"undo\"==b?d.undone:d.done,k=0;k<g.length&&(e=g[k],c?!e.ranges||e.equals(a.sel):e.ranges);k++);if(k!=\ng.length){for(d.lastOrigin=d.lastSelOrigin=null;;)if(e=g.pop(),e.ranges){ac(e,h);if(c&&!e.equals(a.sel)){E(a,e,{clearRedo:!1});return}f=e}else break;c=[];ac(f,h);h.push({changes:c,generation:d.generation});d.generation=e.generation||++d.maxGeneration;d=ca(a,\"beforeChange\")||a.cm&&ca(a.cm,\"beforeChange\");for(k=e.changes.length-1;0<=k;--k){var m=e.changes[k];m.origin=b;if(d&&!Oe(a,m,!1)){g.length=0;break}c.push(sd(a,m));f=k?qd(a,m):C(g);Db(a,m,f,Te(a,m));!k&&a.cm&&a.cm.scrollIntoView({from:m.from,to:La(m)});\nvar p=[];Ma(a,function(a,b){b||-1!=N(p,a.history)||(Se(a.history,m),p.push(a.history));Db(a,m,null,Te(a,m))})}}}}function Ue(a,b){if(0!=b&&(a.first+=b,a.sel=new ra(Wb(a.sel.ranges,function(a){return new G(q(a.anchor.line+b,a.anchor.ch),q(a.head.line+b,a.head.ch))}),a.sel.primIndex),a.cm)){P(a.cm,a.first,a.first-b,b);for(var c=a.cm.display,d=c.viewFrom;d<c.viewTo;d++)ta(a.cm,d,\"gutter\")}}function Db(a,b,c,d){if(a.cm&&!a.cm.curOp)return H(a.cm,Db)(a,b,c,d);if(b.to.line<a.first)Ue(a,b.text.length-1-\n(b.to.line-b.from.line));else if(!(b.from.line>a.lastLine())){if(b.from.line<a.first){var e=b.text.length-1-(a.first-b.from.line);Ue(a,e);b={from:q(a.first,0),to:q(b.to.line+e,b.to.ch),text:[C(b.text)],origin:b.origin}}e=a.lastLine();b.to.line>e&&(b={from:b.from,to:q(e,w(a,e).text.length),text:[b.text[0]],origin:b.origin});b.removed=Ia(a,b.from,b.to);c||(c=qd(a,b));a.cm?fg(a.cm,b,d):td(a,b,d);$b(a,c,oa)}}function fg(a,b,c){var d=a.doc,e=a.display,f=b.from,g=b.to,h=!1,k=f.line;a.options.lineWrapping||\n(k=F(pa(w(d,f.line))),d.iter(k,g.line+1,function(a){if(a==e.maxLine)return h=!0}));-1<d.sel.contains(b.from,b.to)&&le(a);td(d,b,c,ba(a));a.options.lineWrapping||(d.iter(k,f.line+b.text.length,function(a){var b=Pb(a);b>e.maxLineLength&&(e.maxLine=a,e.maxLineLength=b,e.maxLineChanged=!0,h=!1)}),h&&(a.curOp.updateMaxLine=!0));d.frontier=Math.min(d.frontier,f.line);kb(a,400);c=b.text.length-(g.line-f.line)-1;b.full?P(a):f.line!=g.line||1!=b.text.length||Ve(a.doc,b)?P(a,f.line,g.line+1,c):ta(a,f.line,\n\"text\");c=ca(a,\"changes\");if((d=ca(a,\"change\"))||c)b={from:f,to:g,text:b.text,removed:b.removed,origin:b.origin},d&&V(a,\"change\",a,b),c&&(a.curOp.changeObjs||(a.curOp.changeObjs=[])).push(b);a.display.selForContextMenu=null}function bb(a,b,c,d,e){d||(d=c);if(0>t(d,c)){var f=d;d=c;c=f}\"string\"==typeof b&&(b=a.splitLines(b));Wa(a,{from:c,to:d,text:b,origin:e})}function hc(a,b,c,d,e){var f=a.display,g=Ca(a.display);0>c&&(c=0);var h=a.curOp&&null!=a.curOp.scrollTop?a.curOp.scrollTop:f.scroller.scrollTop,\nk=Tc(a),m={};e-c>k&&(e=c+k);var p=a.doc.height+Kc(f),u=c<g,g=e>p-g;c<h?m.scrollTop=u?0:c:e>h+k&&(c=Math.min(c,(g?p:e)-k),c!=h&&(m.scrollTop=c));h=a.curOp&&null!=a.curOp.scrollLeft?a.curOp.scrollLeft:f.scroller.scrollLeft;a=Ga(a)-(a.options.fixedGutter?f.gutters.offsetWidth:0);(f=d-b>a)&&(d=b+a);10>b?m.scrollLeft=0:b<h?m.scrollLeft=Math.max(0,b-(f?0:10)):d>a+h-3&&(m.scrollLeft=d+(f?0:10)-a);return m}function rc(a,b,c){null==b&&null==c||sc(a);null!=b&&(a.curOp.scrollLeft=(null==a.curOp.scrollLeft?a.doc.scrollLeft:\na.curOp.scrollLeft)+b);null!=c&&(a.curOp.scrollTop=(null==a.curOp.scrollTop?a.doc.scrollTop:a.curOp.scrollTop)+c)}function Xa(a){sc(a);var b=a.getCursor(),c=b,d=b;a.options.lineWrapping||(c=b.ch?q(b.line,b.ch-1):b,d=q(b.line,b.ch+1));a.curOp.scrollToPos={from:c,to:d,margin:a.options.cursorScrollMargin,isCursor:!0}}function sc(a){var b=a.curOp.scrollToPos;if(b){a.curOp.scrollToPos=null;var c=xe(a,b.from),d=xe(a,b.to),b=hc(a,Math.min(c.left,d.left),Math.min(c.top,d.top)-b.margin,Math.max(c.right,d.right),\nMath.max(c.bottom,d.bottom)+b.margin);a.scrollTo(b.scrollLeft,b.scrollTop)}}function ub(a,b,c,d){var e=a.doc,f;null==c&&(c=\"add\");\"smart\"==c&&(e.mode.indent?f=yb(a,b):c=\"prev\");var g=a.options.tabSize,h=w(e,b),k=ha(h.text,null,g);h.stateAfter&&(h.stateAfter=null);var m=h.text.match(/^\\s*/)[0],p;if(!d&&!/\\S/.test(h.text))p=0,c=\"not\";else if(\"smart\"==c&&(p=e.mode.indent(f,h.text.slice(m.length),h.text),p==Je||150<p)){if(!d)return;c=\"prev\"}\"prev\"==c?p=b>e.first?ha(w(e,b-1).text,null,g):0:\"add\"==c?p=\nk+a.options.indentUnit:\"subtract\"==c?p=k-a.options.indentUnit:\"number\"==typeof c&&(p=k+c);p=Math.max(0,p);c=\"\";d=0;if(a.options.indentWithTabs)for(a=Math.floor(p/g);a;--a)d+=g,c+=\"\\t\";d<p&&(c+=ud(p-d));if(c!=m)return bb(e,c,q(b,0),q(b,m.length),\"+input\"),h.stateAfter=null,!0;for(a=0;a<e.sel.ranges.length;a++)if(g=e.sel.ranges[a],g.head.line==b&&g.head.ch<m.length){d=q(b,m.length);bd(e,a,new G(d,d));break}}function tc(a,b,c,d){var e=b,f=b;\"number\"==typeof b?f=w(a,Math.max(a.first,Math.min(b,a.first+\na.size-1))):e=F(b);if(null==e)return null;d(f,e)&&a.cm&&ta(a.cm,e,c);return f}function cb(a,b){for(var c=a.doc.sel.ranges,d=[],e=0;e<c.length;e++){for(var f=b(c[e]);d.length&&0>=t(f.from,C(d).to);){var g=d.pop();if(0>t(g.from,f.from)){f.from=g.from;break}}d.push(f)}X(a,function(){for(var b=d.length-1;0<=b;b--)bb(a.doc,\"\",d[b].from,d[b].to,\"+delete\");Xa(a)})}function vd(a,b,c,d,e){function f(b){var d=(e?kd:We)(m,h,c,!0);if(null==d){if(b=!b)b=g+c,b<a.first||b>=a.first+a.size?b=!1:(g=b,b=m=w(a,b));if(b)h=\ne?(0>c?gc:fc)(m):0>c?m.text.length:0;else return!1}else h=d;return!0}var g=b.line,h=b.ch,k=c,m=w(a,g);if(\"char\"==d)f();else if(\"column\"==d)f(!0);else if(\"word\"==d||\"group\"==d){var p=null;d=\"group\"==d;for(var u=a.cm&&a.cm.getHelper(b,\"wordChars\"),n=!0;!(0>c)||f(!n);n=!1){var l=m.text.charAt(h)||\"\\n\",l=uc(l,u)?\"w\":d&&\"\\n\"==l?\"n\":!d||/\\s/.test(l)?null:\"p\";!d||n||l||(l=\"s\");if(p&&p!=l){0>c&&(c=1,f());break}l&&(p=l);if(0<c&&!f(!n))break}}k=cd(a,q(g,h),b,k,!0);t(b,k)||(k.hitSide=!0);return k}function Xe(a,\nb,c,d){var e=a.doc,f=b.left,g;\"page\"==d?(g=Math.max(Math.min(a.display.wrapper.clientHeight,window.innerHeight||document.documentElement.clientHeight)-.5*Ca(a.display),3),g=(0<c?b.bottom:b.top)+c*g):\"line\"==d&&(g=0<c?b.bottom+3:b.top-3);for(;;){b=jd(a,f,g);if(!b.outside)break;if(0>c?0>=g:g>=e.height){b.hitSide=!0;break}g+=5*c}return b}function x(a,b,c,d){l.defaults[a]=b;c&&(Sa[a]=d?function(a,b,d){d!=Jd&&c(a,b,d)}:c)}function gg(a){var b=a.split(/-(?!$)/);a=b[b.length-1];for(var c,d,e,f,g=0;g<b.length-\n1;g++){var h=b[g];if(/^(cmd|meta|m)$/i.test(h))f=!0;else if(/^a(lt)?$/i.test(h))c=!0;else if(/^(c|ctrl|control)$/i.test(h))d=!0;else if(/^s(hift)$/i.test(h))e=!0;else throw Error(\"Unrecognized modifier name: \"+h);}c&&(a=\"Alt-\"+a);d&&(a=\"Ctrl-\"+a);f&&(a=\"Cmd-\"+a);e&&(a=\"Shift-\"+a);return a}function vc(a){return\"string\"==typeof a?Aa[a]:a}function db(a,b,c,d,e){if(d&&d.shared)return hg(a,b,c,d,e);if(a.cm&&!a.cm.curOp)return H(a.cm,db)(a,b,c,d,e);var f=new Na(a,e);e=t(b,c);d&&da(d,f,!1);if(0<e||0==e&&\n!1!==f.clearWhenEmpty)return f;f.replacedWith&&(f.collapsed=!0,f.widgetNode=r(\"span\",[f.replacedWith],\"CodeMirror-widget\"),d.handleMouseEvents||f.widgetNode.setAttribute(\"cm-ignore-events\",\"true\"),d.insertLeft&&(f.widgetNode.insertLeft=!0));if(f.collapsed){if(Ye(a,b.line,b,c,f)||b.line!=c.line&&Ye(a,c.line,b,c,f))throw Error(\"Inserting collapsed marker partially overlapping an existing one\");ya=!0}f.addToHistory&&Re(a,{from:b,to:c,origin:\"markText\"},a.sel,NaN);var g=b.line,h=a.cm,k;a.iter(g,c.line+\n1,function(a){h&&f.collapsed&&!h.options.lineWrapping&&pa(a)==h.display.maxLine&&(k=!0);f.collapsed&&g!=b.line&&ja(a,0);var d=new wc(f,g==b.line?b.ch:null,g==c.line?c.ch:null);a.markedSpans=a.markedSpans?a.markedSpans.concat([d]):[d];d.marker.attachLine(a);++g});f.collapsed&&a.iter(b.line,c.line+1,function(b){Da(a,b)&&ja(b,0)});f.clearOnEnter&&y(f,\"beforeCursorEnter\",function(){f.clear()});f.readOnly&&(Pe=!0,(a.history.done.length||a.history.undone.length)&&a.clearHistory());f.collapsed&&(f.id=++wd,\nf.atomic=!0);if(h){k&&(h.curOp.updateMaxLine=!0);if(f.collapsed)P(h,b.line,c.line+1);else if(f.className||f.title||f.startStyle||f.endStyle||f.css)for(d=b.line;d<=c.line;d++)ta(h,d,\"text\");f.atomic&&me(h.doc);V(h,\"markerAdded\",h,f)}return f}function hg(a,b,c,d,e){d=da(d);d.shared=!1;var f=[db(a,b,c,d,e)],g=f[0],h=d.widgetNode;Ma(a,function(a){h&&(d.widgetNode=h.cloneNode(!0));f.push(db(a,z(a,b),z(a,c),d,e));for(var k=0;k<a.linked.length;++k)if(a.linked[k].isParent)return;g=C(f)});return new xc(f,\ng)}function Ze(a){return a.findMarks(q(a.first,0),a.clipPos(q(a.lastLine())),function(a){return a.parent})}function ig(a){for(var b=0;b<a.length;b++){var c=a[b],d=[c.primary.doc];Ma(c.primary.doc,function(a){d.push(a)});for(var e=0;e<c.markers.length;e++){var f=c.markers[e];-1==N(d,f.doc)&&(f.parent=null,c.markers.splice(e--,1))}}}function wc(a,b,c){this.marker=a;this.from=b;this.to=c}function Eb(a,b){if(a)for(var c=0;c<a.length;++c){var d=a[c];if(d.marker==b)return d}}function rd(a,b){if(b.full)return null;\nvar c=wb(a,b.from.line)&&w(a,b.from.line).markedSpans,d=wb(a,b.to.line)&&w(a,b.to.line).markedSpans;if(!c&&!d)return null;a=b.from.ch;var e=b.to.ch,f=0==t(b.from,b.to);if(c)for(var g=0,h;g<c.length;++g){var k=c[g],m=k.marker;if(null==k.from||(m.inclusiveLeft?k.from<=a:k.from<a)||!(k.from!=a||\"bookmark\"!=m.type||f&&k.marker.insertLeft)){var p=null==k.to||(m.inclusiveRight?k.to>=a:k.to>a);(h||(h=[])).push(new wc(m,k.from,p?null:k.to))}}var c=h,l;if(d)for(h=0;h<d.length;++h)if(g=d[h],k=g.marker,null==\ng.to||(k.inclusiveRight?g.to>=e:g.to>e)||g.from==e&&\"bookmark\"==k.type&&(!f||g.marker.insertLeft))m=null==g.from||(k.inclusiveLeft?g.from<=e:g.from<e),(l||(l=[])).push(new wc(k,m?null:g.from-e,null==g.to?null:g.to-e));e=1==b.text.length;f=C(b.text).length+(e?a:0);if(c)for(d=0;d<c.length;++d)if(h=c[d],null==h.to)(g=Eb(l,h.marker),g)?e&&(h.to=null==g.to?null:g.to+f):h.to=a;if(l)for(d=0;d<l.length;++d)h=l[d],null!=h.to&&(h.to+=f),null==h.from?(g=Eb(c,h.marker),g||(h.from=f,e&&(c||(c=[])).push(h))):(h.from+=\nf,e&&(c||(c=[])).push(h));c&&(c=$e(c));l&&l!=c&&(l=$e(l));a=[c];if(!e){b=b.text.length-2;var n;if(0<b&&c)for(d=0;d<c.length;++d)null==c[d].to&&(n||(n=[])).push(new wc(c[d].marker,null,null));for(d=0;d<b;++d)a.push(n);a.push(l)}return a}function $e(a){for(var b=0;b<a.length;++b){var c=a[b];null!=c.from&&c.from==c.to&&!1!==c.marker.clearWhenEmpty&&a.splice(b--,1)}return a.length?a:null}function Te(a,b){var c;if(c=b[\"spans_\"+a.id]){for(var d=0,e=[];d<b.text.length;++d)e.push(jg(c[d]));c=e}else c=null;\na=rd(a,b);if(!c)return a;if(!a)return c;for(b=0;b<c.length;++b)if(d=c[b],e=a[b],d&&e){var f=0;a:for(;f<e.length;++f){for(var g=e[f],h=0;h<d.length;++h)if(d[h].marker==g.marker)continue a;d.push(g)}}else e&&(c[b]=e);return c}function eg(a,b,c){var d=null;a.iter(b.line,c.line+1,function(a){if(a.markedSpans)for(var b=0;b<a.markedSpans.length;++b){var c=a.markedSpans[b].marker;!c.readOnly||d&&-1!=N(d,c)||(d||(d=[])).push(c)}});if(!d)return null;a=[{from:b,to:c}];for(b=0;b<d.length;++b){c=d[b];for(var e=\nc.find(0),f=0;f<a.length;++f){var g=a[f];if(!(0>t(g.to,e.from)||0<t(g.from,e.to))){var h=[f,1],k=t(g.from,e.from),m=t(g.to,e.to);(0>k||!c.inclusiveLeft&&!k)&&h.push({from:g.from,to:e.from});(0<m||!c.inclusiveRight&&!m)&&h.push({from:e.to,to:g.to});a.splice.apply(a,h);f+=h.length-1}}}return a}function af(a){var b=a.markedSpans;if(b){for(var c=0;c<b.length;++c)b[c].marker.detachLine(a);a.markedSpans=null}}function bf(a,b){if(b){for(var c=0;c<b.length;++c)b[c].marker.attachLine(a);a.markedSpans=b}}function cf(a,\nb){var c=a.lines.length-b.lines.length;if(0!=c)return c;var c=a.find(),d=b.find(),e=t(c.from,d.from)||(a.inclusiveLeft?-1:0)-(b.inclusiveLeft?-1:0);return e?-e:(c=t(c.to,d.to)||(a.inclusiveRight?1:0)-(b.inclusiveRight?1:0))?c:b.id-a.id}function Ea(a,b){a=ya&&a.markedSpans;var c;if(a)for(var d,e=0;e<a.length;++e)d=a[e],d.marker.collapsed&&null==(b?d.from:d.to)&&(!c||0>cf(c,d.marker))&&(c=d.marker);return c}function Ye(a,b,c,d,e){a=w(a,b);if(a=ya&&a.markedSpans)for(b=0;b<a.length;++b){var f=a[b];if(f.marker.collapsed){var g=\nf.marker.find(0),h=t(g.from,c)||(f.marker.inclusiveLeft?-1:0)-(e.inclusiveLeft?-1:0),k=t(g.to,d)||(f.marker.inclusiveRight?1:0)-(e.inclusiveRight?1:0);if(!(0<=h&&0>=k||0>=h&&0<=k)&&(0>=h&&(f.marker.inclusiveRight&&e.inclusiveLeft?0<=t(g.to,c):0<t(g.to,c))||0<=h&&(f.marker.inclusiveRight&&e.inclusiveLeft?0>=t(g.from,d):0>t(g.from,d))))return!0}}}function pa(a){for(var b;b=Ea(a,!0);)a=b.find(-1,!0).line;return a}function Sc(a,b){a=w(a,b);var c=pa(a);return a==c?b:F(c)}function Od(a,b){if(b>a.lastLine())return b;\nvar c=w(a,b);if(!Da(a,c))return b;for(;a=Ea(c,!1);)c=a.find(1,!0).line;return F(c)+1}function Da(a,b){var c=ya&&b.markedSpans;if(c)for(var d,e=0;e<c.length;++e)if(d=c[e],d.marker.collapsed&&(null==d.from||!d.marker.widgetNode&&0==d.from&&d.marker.inclusiveLeft&&xd(a,b,d)))return!0}function xd(a,b,c){if(null==c.to)return b=c.marker.find(1,!0),xd(a,b.line,Eb(b.line.markedSpans,c.marker));if(c.marker.inclusiveRight&&c.to==b.text.length)return!0;for(var d,e=0;e<b.markedSpans.length;++e)if(d=b.markedSpans[e],\nd.marker.collapsed&&!d.marker.widgetNode&&d.from==c.to&&(null==d.to||d.to!=c.from)&&(d.marker.inclusiveLeft||c.marker.inclusiveRight)&&xd(a,b,d))return!0}function Ab(a){if(null!=a.height)return a.height;var b=a.doc.cm;if(!b)return 0;if(!ad(document.body,a.node)){var c=\"position: relative;\";a.coverGutter&&(c+=\"margin-left: -\"+b.display.gutters.offsetWidth+\"px;\");a.noHScroll&&(c+=\"width: \"+b.display.wrapper.clientWidth+\"px;\");Y(b.display.measure,r(\"div\",[a.node],null,c))}return a.height=a.node.parentNode.offsetHeight}\nfunction kg(a,b,c,d){var e=new yc(a,c,d),f=a.cm;f&&e.noHScroll&&(f.display.alignWidgets=!0);tc(a,b,\"widget\",function(b){var c=b.widgets||(b.widgets=[]);null==e.insertAt?c.push(e):c.splice(Math.min(c.length-1,Math.max(0,e.insertAt)),0,e);e.line=b;f&&!Da(a,b)&&(c=la(b)<a.scrollTop,ja(b,b.height+Ab(e)),c&&rc(f,null,e.height),f.curOp.forceUpdate=!0);return!0});return e}function df(a,b){if(a)for(;;){var c=a.match(/(?:^|\\s+)line-(background-)?(\\S+)/);if(!c)break;a=a.slice(0,c.index)+a.slice(c.index+c[0].length);\nvar d=c[1]?\"bgClass\":\"textClass\";null==b[d]?b[d]=c[2]:(new RegExp(\"(?:^|s)\"+c[2]+\"(?:$|s)\")).test(b[d])||(b[d]+=\" \"+c[2])}return a}function ef(a,b){if(a.blankLine)return a.blankLine(b);if(a.innerMode&&(a=l.innerMode(a,b),a.mode.blankLine))return a.mode.blankLine(a.state)}function yd(a,b,c,d){for(var e=0;10>e;e++){d&&(d[0]=l.innerMode(a,c).mode);var f=a.token(b,c);if(b.pos>b.start)return f}throw Error(\"Mode \"+a.name+\" failed to advance stream.\");}function ff(a,b,c,d){function e(a){return{start:p.start,\nend:p.pos,string:p.current(),type:h||null,state:a?za(f.mode,m):m}}var f=a.doc,g=f.mode,h;b=z(f,b);var k=w(f,b.line),m=yb(a,b.line,c),p=new zc(k.text,a.options.tabSize),l;for(d&&(l=[]);(d||p.pos<b.ch)&&!p.eol();)p.start=p.pos,h=yd(g,p,m),d&&l.push(e(!0));return d?l:e()}function gf(a,b,c,d,e,f,g){var h=c.flattenSpans;null==h&&(h=a.options.flattenSpans);var k=0,m=null,p=new zc(b,a.options.tabSize),l,n=a.options.addModeClass&&[null];for(\"\"==b&&df(ef(c,d),f);!p.eol();){p.pos>a.options.maxHighlightLength?\n(h=!1,g&&ed(a,b,d,p.pos),p.pos=b.length,l=null):l=df(yd(c,p,d,n),f);if(n){var q=n[0].name;q&&(l=\"m-\"+(l?q+\" \"+l:q))}if(!h||m!=l){for(;k<p.start;)k=Math.min(p.start,k+5E3),e(k,m);m=l}p.start=p.pos}for(;k<p.pos;)a=Math.min(p.pos,k+5E3),e(a,m),k=a}function re(a,b,c,d){var e=[a.state.modeGen],f={};gf(a,b.text,a.doc.mode,c,function(a,b){e.push(a,b)},f,d);for(c=0;c<a.state.overlays.length;++c){var g=a.state.overlays[c],h=1,k=0;gf(a,b.text,g.mode,!0,function(a,b){for(var c=h;k<a;){var d=e[h];d>a&&e.splice(h,\n1,a,e[h+1],d);h+=2;k=Math.min(a,d)}if(b)if(g.opaque)e.splice(c,h-c,a,\"cm-overlay \"+b),h=c+2;else for(;c<h;c+=2)a=e[c+1],e[c+1]=(a?a+\" \":\"\")+\"cm-overlay \"+b},f)}return{styles:e,classes:f.bgClass||f.textClass?f:null}}function hf(a,b,c){if(!b.styles||b.styles[0]!=a.state.modeGen){var d=yb(a,F(b)),e=re(a,b,b.text.length>a.options.maxHighlightLength?za(a.doc.mode,d):d);b.stateAfter=d;b.styles=e.styles;e.classes?b.styleClasses=e.classes:b.styleClasses&&(b.styleClasses=null);c===a.doc.frontier&&a.doc.frontier++}return b.styles}\nfunction ed(a,b,c,d){var e=a.doc.mode;a=new zc(b,a.options.tabSize);a.start=a.pos=d||0;for(\"\"==b&&ef(e,c);!a.eol();)yd(e,a,c),a.start=a.pos}function jf(a,b){if(!a||/^\\s*$/.test(a))return null;b=b.addModeClass?lg:mg;return b[a]||(b[a]=a.replace(/\\S+/g,\"cm-$&\"))}function Vd(a,b){var c=r(\"span\",null,null,M?\"padding-right: .1px\":null),c={pre:r(\"pre\",[c],\"CodeMirror-line\"),content:c,col:0,pos:0,cm:a,trailingSpace:!1,splitSpaces:(B||M)&&a.getOption(\"lineWrapping\")};b.measure={};for(var d=0;d<=(b.rest?b.rest.length:\n0);d++){var e=d?b.rest[d-1]:b.line,f;c.pos=0;c.addToken=ng;var g;g=a.display.measure;if(null!=zd)g=zd;else{var h=Y(g,document.createTextNode(\"A\\u062eA\")),k=$a(h,0,1).getBoundingClientRect(),h=$a(h,1,2).getBoundingClientRect();wa(g);g=k&&k.left!=k.right?zd=3>h.right-k.right:!1}g&&(f=fa(e))&&(c.addToken=og(c.addToken,f));c.map=[];k=b!=a.display.externalMeasured&&F(e);a:{g=c;var k=hf(a,e,k),h=e.markedSpans,m=e.text,p=0;if(h)for(var l=m.length,n=0,q=1,v=\"\",w=void 0,x=void 0,t=0,y=void 0,z=void 0,C=void 0,\nG=void 0,A=void 0;;){if(t==n){for(var y=z=C=G=x=\"\",A=null,t=Infinity,H=[],I,D=0;D<h.length;++D){var J=h[D],E=J.marker;\"bookmark\"==E.type&&J.from==n&&E.widgetNode?H.push(E):J.from<=n&&(null==J.to||J.to>n||E.collapsed&&J.to==n&&J.from==n)?(null!=J.to&&J.to!=n&&t>J.to&&(t=J.to,z=\"\"),E.className&&(y+=\" \"+E.className),E.css&&(x=(x?x+\";\":\"\")+E.css),E.startStyle&&J.from==n&&(C+=\" \"+E.startStyle),E.endStyle&&J.to==t&&(I||(I=[])).push(E.endStyle,J.to),E.title&&!G&&(G=E.title),E.collapsed&&(!A||0>cf(A.marker,\nE))&&(A=J)):J.from>n&&t>J.from&&(t=J.from)}if(I)for(D=0;D<I.length;D+=2)I[D+1]==t&&(z+=\" \"+I[D]);if(!A||A.from==n)for(D=0;D<H.length;++D)kf(g,0,H[D]);if(A&&(A.from||0)==n){kf(g,(null==A.to?l+1:A.to)-n,A.marker,null==A.from);if(null==A.to)break a;A.to==n&&(A=!1)}}if(n>=l)break;for(H=Math.min(l,t);;){if(v){D=n+v.length;A||(J=D>H?v.slice(0,H-n):v,g.addToken(g,J,w?w+y:y,C,n+J.length==t?z:\"\",G,x));if(D>=H){v=v.slice(H-n);n=H;break}n=D;C=\"\"}v=m.slice(p,p=k[q++]);w=jf(k[q++],g.cm.options)}}else for(var q=\n1;q<k.length;q+=2)g.addToken(g,m.slice(p,p=k[q]),jf(k[q+1],g.cm.options))}e.styleClasses&&(e.styleClasses.bgClass&&(c.bgClass=Ad(e.styleClasses.bgClass,c.bgClass||\"\")),e.styleClasses.textClass&&(c.textClass=Ad(e.styleClasses.textClass,c.textClass||\"\")));0==c.map.length&&c.map.push(0,0,c.content.appendChild(pg(a.display.measure)));0==d?(b.measure.map=c.map,b.measure.cache={}):((b.measure.maps||(b.measure.maps=[])).push(c.map),(b.measure.caches||(b.measure.caches=[])).push({}))}M&&(f=c.content.lastChild,\n/\\bcm-tab\\b/.test(f.className)||f.querySelector&&f.querySelector(\".cm-tab\"))&&(c.content.className=\"cm-tab-wrap-hack\");L(a,\"renderLine\",a,b.line,c.pre);c.pre.className&&(c.textClass=Ad(c.pre.className,c.textClass||\"\"));return c}function ng(a,b,c,d,e,f,g){if(b){var h;if(a.splitSpaces)if(h=a.trailingSpace,1<b.length&&!/  /.test(b))h=b;else{for(var k=\"\",m=0;m<b.length;m++){var p=b.charAt(m);\" \"!=p||!h||m!=b.length-1&&32!=b.charCodeAt(m+1)||(p=\"\\u00a0\");k+=p;h=\" \"==p}h=k}else h=b;k=h;m=a.cm.state.specialChars;\np=!1;if(m.test(b)){h=document.createDocumentFragment();for(var l=0;;){m.lastIndex=l;var n=m.exec(b),q=n?n.index-l:b.length-l;if(q){var v=document.createTextNode(k.slice(l,l+q));B&&9>A?h.appendChild(r(\"span\",[v])):h.appendChild(v);a.map.push(a.pos,a.pos+q,v);a.col+=q;a.pos+=q}if(!n)break;l+=q+1;\"\\t\"==n[0]?(v=a.cm.options.tabSize,n=v-a.col%v,v=h.appendChild(r(\"span\",ud(n),\"cm-tab\")),v.setAttribute(\"role\",\"presentation\"),v.setAttribute(\"cm-text\",\"\\t\"),a.col+=n):(\"\\r\"==n[0]||\"\\n\"==n[0]?(v=h.appendChild(r(\"span\",\n\"\\r\"==n[0]?\"\\u240d\":\"\\u2424\",\"cm-invalidchar\")),v.setAttribute(\"cm-text\",n[0])):(v=a.cm.options.specialCharPlaceholder(n[0]),v.setAttribute(\"cm-text\",n[0]),B&&9>A?h.appendChild(r(\"span\",[v])):h.appendChild(v)),a.col+=1);a.map.push(a.pos,a.pos+1,v);a.pos++}}else a.col+=b.length,h=document.createTextNode(k),a.map.push(a.pos,a.pos+b.length,h),B&&9>A&&(p=!0),a.pos+=b.length;a.trailingSpace=32==k.charCodeAt(b.length-1);if(c||d||e||p||g)return b=c||\"\",d&&(b+=d),e&&(b+=e),d=r(\"span\",[h],b,g),f&&(d.title=\nf),a.content.appendChild(d);a.content.appendChild(h)}}function og(a,b){return function(c,d,e,f,g,h,k){e=e?e+\" cm-force-border\":\"cm-force-border\";for(var m=c.pos,p=m+d.length;;){for(var l=0;l<b.length;l++){var n=b[l];if(n.to>m&&n.from<=m)break}if(n.to>=p)return a(c,d,e,f,g,h,k);a(c,d.slice(0,n.to-m),e,f,null,h,k);f=null;d=d.slice(n.to-m);m=n.to}}}function kf(a,b,c,d){var e=!d&&c.widgetNode;e&&a.map.push(a.pos,a.pos+b,e);!d&&a.cm.display.input.needsContentAttribute&&(e||(e=a.content.appendChild(document.createElement(\"span\"))),\ne.setAttribute(\"cm-marker\",c.id));e&&(a.cm.display.input.setUneditable(e),a.content.appendChild(e));a.pos+=b;a.trailingSpace=!1}function Ve(a,b){return 0==b.from.ch&&0==b.to.ch&&\"\"==C(b.text)&&(!a.cm||a.cm.options.wholeLineUpdateBefore)}function td(a,b,c,d){function e(a,c,e){a.text=c;a.stateAfter&&(a.stateAfter=null);a.styles&&(a.styles=null);null!=a.order&&(a.order=null);af(a);bf(a,e);c=d?d(a):1;c!=a.height&&ja(a,c);V(a,\"change\",a,b)}function f(a,b){for(var e=[];a<b;++a)e.push(new Fb(k[a],c?c[a]:\nnull,d));return e}var g=b.from,h=b.to,k=b.text,m=w(a,g.line),p=w(a,h.line),l=C(k),n=c?c[k.length-1]:null,q=h.line-g.line;if(b.full)a.insert(0,f(0,k.length)),a.remove(k.length,a.size-k.length);else if(Ve(a,b)){var v=f(0,k.length-1);e(p,p.text,n);q&&a.remove(g.line,q);v.length&&a.insert(g.line,v)}else m==p?1==k.length?e(m,m.text.slice(0,g.ch)+l+m.text.slice(h.ch),n):(v=f(1,k.length-1),v.push(new Fb(l+m.text.slice(h.ch),n,d)),e(m,m.text.slice(0,g.ch)+k[0],c?c[0]:null),a.insert(g.line+1,v)):1==k.length?\n(e(m,m.text.slice(0,g.ch)+k[0]+p.text.slice(h.ch),c?c[0]:null),a.remove(g.line+1,q)):(e(m,m.text.slice(0,g.ch)+k[0],c?c[0]:null),e(p,l+p.text.slice(h.ch),n),v=f(1,k.length-1),1<q&&a.remove(g.line+1,q-1),a.insert(g.line+1,v));V(a,\"change\",a,b)}function Gb(a){this.lines=a;this.parent=null;for(var b=0,c=0;b<a.length;++b)a[b].parent=this,c+=a[b].height;this.height=c}function Hb(a){this.children=a;for(var b=0,c=0,d=0;d<a.length;++d){var e=a[d],b=b+e.chunkSize(),c=c+e.height;e.parent=this}this.size=b;this.height=\nc;this.parent=null}function Ma(a,b,c){function d(a,f,g){if(a.linked)for(var e=0;e<a.linked.length;++e){var k=a.linked[e];if(k.doc!=f){var m=g&&k.sharedHist;if(!c||m)b(k.doc,m),d(k.doc,a,m)}}}d(a,null,!0)}function Id(a,b){if(b.cm)throw Error(\"This document is already in use.\");a.doc=b;b.cm=a;Qa(a);I(a);a.options.lineWrapping||Jc(a);a.options.mode=b.modeOption;P(a)}function w(a,b){b-=a.first;if(0>b||b>=a.size)throw Error(\"There is no line \"+(b+a.first)+\" in the document.\");for(;!a.lines;)for(var c=\n0;;++c){var d=a.children[c],e=d.chunkSize();if(b<e){a=d;break}b-=e}return a.lines[b]}function Ia(a,b,c){var d=[],e=b.line;a.iter(b.line,c.line+1,function(a){a=a.text;e==c.line&&(a=a.slice(0,c.ch));e==b.line&&(a=a.slice(b.ch));d.push(a);++e});return d}function Bd(a,b,c){var d=[];a.iter(b,c,function(a){d.push(a.text)});return d}function ja(a,b){if(b-=a.height)for(;a;a=a.parent)a.height+=b}function F(a){if(null==a.parent)return null;var b=a.parent;a=N(b.lines,a);for(var c=b.parent;c;b=c,c=c.parent)for(var d=\n0;c.children[d]!=b;++d)a+=c.children[d].chunkSize();return a+b.first}function Fa(a,b){var c=a.first;a:do{for(var d=0;d<a.children.length;++d){var e=a.children[d],f=e.height;if(b<f){a=e;continue a}b-=f;c+=e.chunkSize()}return c}while(!a.lines);for(d=0;d<a.lines.length;++d){e=a.lines[d].height;if(b<e)break;b-=e}return c+d}function la(a){a=pa(a);for(var b=0,c=a.parent,d=0;d<c.lines.length;++d){var e=c.lines[d];if(e==a)break;else b+=e.height}for(a=c.parent;a;c=a,a=c.parent)for(d=0;d<a.children.length&&\n(e=a.children[d],e!=c);++d)b+=e.height;return b}function fa(a){var b=a.order;null==b&&(b=a.order=qg(a.text));return b}function Ac(a){this.done=[];this.undone=[];this.undoDepth=Infinity;this.lastModTime=this.lastSelTime=0;this.lastOrigin=this.lastSelOrigin=this.lastOp=this.lastSelOp=null;this.generation=this.maxGeneration=a||1}function sd(a,b){var c={from:Xc(b.from),to:La(b),text:Ia(a,b.from,b.to)};lf(a,c,b.from.line,b.to.line+1);Ma(a,function(a){lf(a,c,b.from.line,b.to.line+1)},!0);return c}function ie(a){for(;a.length;)if(C(a).ranges)a.pop();\nelse break}function Re(a,b,c,d){var e=a.history;e.undone.length=0;var f=+new Date,g,h;if(h=e.lastOp==d||e.lastOrigin==b.origin&&b.origin&&(\"+\"==b.origin.charAt(0)&&a.cm&&e.lastModTime>f-a.cm.options.historyEventDelay||\"*\"==b.origin.charAt(0)))e.lastOp==d?(ie(e.done),g=C(e.done)):e.done.length&&!C(e.done).ranges?g=C(e.done):1<e.done.length&&!e.done[e.done.length-2].ranges?(e.done.pop(),g=C(e.done)):g=void 0,h=g;if(h){var k=C(g.changes);0==t(b.from,b.to)&&0==t(b.from,k.to)?k.to=La(b):g.changes.push(sd(a,\nb))}else for((g=C(e.done))&&g.ranges||ac(a.sel,e.done),g={changes:[sd(a,b)],generation:e.generation},e.done.push(g);e.done.length>e.undoDepth;)e.done.shift(),e.done[0].ranges||e.done.shift();e.done.push(c);e.generation=++e.maxGeneration;e.lastModTime=e.lastSelTime=f;e.lastOp=e.lastSelOp=d;e.lastOrigin=e.lastSelOrigin=b.origin;k||L(a,\"historyAdded\")}function ac(a,b){var c=C(b);c&&c.ranges&&c.equals(a)||b.push(a)}function lf(a,b,c,d){var e=b[\"spans_\"+a.id],f=0;a.iter(Math.max(a.first,c),Math.min(a.first+\na.size,d),function(c){c.markedSpans&&((e||(e=b[\"spans_\"+a.id]={}))[f]=c.markedSpans);++f})}function jg(a){if(!a)return null;for(var b=0,c;b<a.length;++b)a[b].marker.explicitlyCleared?c||(c=a.slice(0,b)):c&&c.push(a[b]);return c?c.length?c:null:a}function eb(a,b,c){for(var d=0,e=[];d<a.length;++d){var f=a[d];if(f.ranges)e.push(c?ra.prototype.deepCopy.call(f):f);else{var f=f.changes,g=[];e.push({changes:g});for(var h=0;h<f.length;++h){var k=f[h],m;g.push({from:k.from,to:k.to,text:k.text});if(b)for(var p in k)(m=\np.match(/^spans_(\\d+)$/))&&-1<N(b,Number(m[1]))&&(C(g)[p]=k[p],delete k[p])}}}return e}function mf(a,b,c,d){c<a.line?a.line+=d:b<a.line&&(a.line=b,a.ch=0)}function nf(a,b,c,d){for(var e=0;e<a.length;++e){var f=a[e],g=!0;if(f.ranges){f.copied||(f=a[e]=f.deepCopy(),f.copied=!0);for(var h=0;h<f.ranges.length;h++)mf(f.ranges[h].anchor,b,c,d),mf(f.ranges[h].head,b,c,d)}else{for(h=0;h<f.changes.length;++h){var k=f.changes[h];if(c<k.from.line)k.from=q(k.from.line+d,k.from.ch),k.to=q(k.to.line+d,k.to.ch);\nelse if(b<=k.to.line){g=!1;break}}g||(a.splice(0,e+1),e=0)}}}function Se(a,b){var c=b.from.line,d=b.to.line;b=b.text.length-(d-c)-1;nf(a.done,c,d,b);nf(a.undone,c,d,b)}function od(a){return null!=a.defaultPrevented?a.defaultPrevented:0==a.returnValue}function Ge(a){var b=a.which;null==b&&(a.button&1?b=1:a.button&2?b=3:a.button&4&&(b=2));ea&&a.ctrlKey&&1==b&&(b=3);return b}function Bc(a,b,c){a=a._handlers&&a._handlers[b];return c?a&&0<a.length?a.slice():of:a||of}function V(a,b){function c(a){return function(){a.apply(null,\ne)}}var d=Bc(a,b,!1);if(d.length){var e=Array.prototype.slice.call(arguments,2),f;ab?f=ab.delayedCallbacks:Ib?f=Ib:(f=Ib=[],setTimeout(rg,0));for(var g=0;g<d.length;++g)f.push(c(d[g]))}}function rg(){var a=Ib;Ib=null;for(var b=0;b<a.length;++b)a[b]()}function D(a,b,c){\"string\"==typeof b&&(b={type:b,preventDefault:function(){this.defaultPrevented=!0}});L(a,c||b.type,a,b);return od(b)||b.codemirrorIgnore}function le(a){var b=a._handlers&&a._handlers.cursorActivity;if(b){a=a.curOp.cursorActivityHandlers||\n(a.curOp.cursorActivityHandlers=[]);for(var c=0;c<b.length;++c)-1==N(a,b[c])&&a.push(b[c])}}function ca(a,b){return 0<Bc(a,b).length}function fb(a){a.prototype.on=function(a,c){y(this,a,c)};a.prototype.off=function(a,c){qa(this,a,c)}}function Ba(){this.id=null}function ud(a){for(;Cc.length<=a;)Cc.push(C(Cc)+\" \");return Cc[a]}function C(a){return a[a.length-1]}function N(a,b){for(var c=0;c<a.length;++c)if(a[c]==b)return c;return-1}function Wb(a,b){for(var c=[],d=0;d<a.length;d++)c[d]=b(a[d],d);return c}\nfunction sg(a,b,c){for(var d=0,e=c(b);d<a.length&&c(a[d])<=e;)d++;a.splice(d,0,b)}function Jb(){}function pf(a,b){Object.create?a=Object.create(a):(Jb.prototype=a,a=new Jb);b&&da(b,a);return a}function da(a,b,c){b||(b={});for(var d in a)!a.hasOwnProperty(d)||!1===c&&b.hasOwnProperty(d)||(b[d]=a[d]);return b}function Ec(a){var b=Array.prototype.slice.call(arguments,1);return function(){return a.apply(null,b)}}function uc(a,b){return b?-1<b.source.indexOf(\"\\\\w\")&&qf(a)?!0:b.test(a):qf(a)}function rf(a){for(var b in a)if(a.hasOwnProperty(b)&&\na[b])return!1;return!0}function zb(a){return 768<=a.charCodeAt(0)&&tg.test(a)}function r(a,b,c,d){a=document.createElement(a);c&&(a.className=c);d&&(a.style.cssText=d);if(\"string\"==typeof b)a.appendChild(document.createTextNode(b));else if(b)for(c=0;c<b.length;++c)a.appendChild(b[c]);return a}function wa(a){for(var b=a.childNodes.length;0<b;--b)a.removeChild(a.firstChild);return a}function Y(a,b){return wa(a).appendChild(b)}function ma(){for(var a=document.activeElement;a&&a.root&&a.root.activeElement;)a=\na.root.activeElement;return a}function Kb(a){return new RegExp(\"(^|\\\\s)\"+a+\"(?:$|\\\\s)\\\\s*\")}function Ad(a,b){a=a.split(\" \");for(var c=0;c<a.length;c++)a[c]&&!Kb(a[c]).test(b)&&(b+=\" \"+a[c]);return b}function sf(a){if(document.body.getElementsByClassName)for(var b=document.body.getElementsByClassName(\"CodeMirror\"),c=0;c<b.length;c++){var d=b[c].CodeMirror;d&&a(d)}}function Cf(){var a;y(window,\"resize\",function(){null==a&&(a=setTimeout(function(){a=null;sf(Sf)},100))});y(window,\"blur\",function(){sf(jb)})}\nfunction pg(a){if(null==Cd){var b=r(\"span\",\"\\u200b\");Y(a,r(\"span\",[b,document.createTextNode(\"x\")]));0!=a.firstChild.offsetHeight&&(Cd=1>=b.offsetWidth&&2<b.offsetHeight&&!(B&&8>A))}a=Cd?r(\"span\",\"\\u200b\"):r(\"span\",\"\\u00a0\",null,\"display: inline-block; width: 1px; margin-right: -1px\");a.setAttribute(\"cm-text\",\"\");return a}function Jf(a,b,c,d){if(!a)return d(b,c,\"ltr\");for(var e=!1,f=0;f<a.length;++f){var g=a[f];if(g.from<c&&g.to>b||b==c&&g.to==b)d(Math.max(g.from,b),Math.min(g.to,c),1==g.level?\"rtl\":\n\"ltr\"),e=!0}e||d(b,c,\"ltr\")}function hd(a){return a.level%2?a.to:a.from}function id(a){return a.level%2?a.from:a.to}function fc(a){return(a=fa(a))?hd(a[0]):0}function gc(a){var b=fa(a);return b?id(C(b)):a.text.length}function tf(a,b){var c=w(a.doc,b);a=pa(c);a!=c&&(b=F(a));a=(c=fa(a))?c[0].level%2?gc(a):fc(a):0;return q(b,a)}function uf(a,b){var c=tf(a,b.line);a=w(a.doc,c.line);var d=fa(a);return d&&0!=d[0].level?c:(a=Math.max(0,a.text.search(/\\S/)),q(c.line,b.line==c.line&&b.ch<=a&&b.ch?0:a))}function Xb(a,\nb){Bb=null;for(var c=0,d;c<a.length;++c){var e=a[c];if(e.from<b&&e.to>b)return c;if(e.from==b||e.to==b)if(null==d)d=c;else{b=e.level;var f=a[d].level;a=a[0].level;a=b==a?!0:f==a?!1:b<f;if(a)return e.from!=e.to&&(Bb=d),c;e.from!=e.to&&(Bb=c);break}}return d}function Dd(a,b,c,d){if(!d)return b+c;do b+=c;while(0<b&&zb(a.text.charAt(b)));return b}function kd(a,b,c,d){var e=fa(a);if(!e)return We(a,b,c,d);var f=Xb(e,b),g=e[f];for(b=Dd(a,b,g.level%2?-c:c,d);;){if(b>g.from&&b<g.to)return b;if(b==g.from||\nb==g.to){if(Xb(e,b)==f)return b;g=e[f+c];return 0<c==g.level%2?g.to:g.from}g=e[f+=c];if(!g)return null;b=0<c==g.level%2?Dd(a,g.to,-1,d):Dd(a,g.from,1,d)}}function We(a,b,c,d){b+=c;if(d)for(;0<b&&zb(a.text.charAt(b));)b+=c;return 0>b||b>a.text.length?null:b}var W=navigator.userAgent,vf=navigator.platform,va=/gecko\\/\\d/i.test(W),wf=/MSIE \\d/.test(W),xf=/Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(W),B=wf||xf,A=B&&(wf?document.documentMode||6:xf[1]),M=/WebKit\\//.test(W),ug=M&&/Qt\\/\\d+\\.\\d+/.test(W),\nvg=/Chrome\\//.test(W),ia=/Opera\\//.test(W),Be=/Apple Computer/.test(navigator.vendor),wg=/Mac OS X 1\\d\\D([8-9]|\\d\\d)\\D/.test(W),Pf=/PhantomJS/.test(W),vb=/AppleWebKit/.test(W)&&/Mobile\\/\\w+/.test(W),ib=vb||/Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(W),ea=vb||/Mac/.test(vf),Yf=/\\bCrOS\\b/.test(W),xg=/win/i.test(vf),Oa=ia&&W.match(/Version\\/(\\d*\\.\\d*)/);Oa&&(Oa=Number(Oa[1]));Oa&&15<=Oa&&(ia=!1,M=!0);var yf=ea&&(ug||ia&&(null==Oa||12.11>Oa)),md=va||B&&9<=A,Pe=!1,ya=!1;Lc.prototype=\nda({update:function(a){var b=a.scrollWidth>a.clientWidth+1,c=a.scrollHeight>a.clientHeight+1,d=a.nativeBarWidth;c?(this.vert.style.display=\"block\",this.vert.style.bottom=b?d+\"px\":\"0\",this.vert.firstChild.style.height=Math.max(0,a.scrollHeight-a.clientHeight+(a.viewHeight-(b?d:0)))+\"px\"):(this.vert.style.display=\"\",this.vert.firstChild.style.height=\"0\");b?(this.horiz.style.display=\"block\",this.horiz.style.right=c?d+\"px\":\"0\",this.horiz.style.left=a.barLeft+\"px\",this.horiz.firstChild.style.width=a.scrollWidth-\na.clientWidth+(a.viewWidth-a.barLeft-(c?d:0))+\"px\"):(this.horiz.style.display=\"\",this.horiz.firstChild.style.width=\"0\");!this.checkedZeroWidth&&0<a.clientHeight&&(0==d&&this.zeroWidthHack(),this.checkedZeroWidth=!0);return{right:c?d:0,bottom:b?d:0}},setScrollLeft:function(a){this.horiz.scrollLeft!=a&&(this.horiz.scrollLeft=a);this.disableHoriz&&this.enableZeroWidthBar(this.horiz,this.disableHoriz)},setScrollTop:function(a){this.vert.scrollTop!=a&&(this.vert.scrollTop=a);this.disableVert&&this.enableZeroWidthBar(this.vert,\nthis.disableVert)},zeroWidthHack:function(){this.horiz.style.height=this.vert.style.width=ea&&!wg?\"12px\":\"18px\";this.horiz.style.pointerEvents=this.vert.style.pointerEvents=\"none\";this.disableHoriz=new Ba;this.disableVert=new Ba},enableZeroWidthBar:function(a,b){function c(){var d=a.getBoundingClientRect();document.elementFromPoint(d.left+1,d.bottom-1)!=a?a.style.pointerEvents=\"none\":b.set(1E3,c)}a.style.pointerEvents=\"auto\";b.set(1E3,c)},clear:function(){var a=this.horiz.parentNode;a.removeChild(this.horiz);\na.removeChild(this.vert)}},Lc.prototype);Mc.prototype=da({update:function(){return{bottom:0,right:0}},setScrollLeft:function(){},setScrollTop:function(){},clear:function(){}},Mc.prototype);l.scrollbarModel={\"native\":Lc,\"null\":Mc};Rb.prototype.signal=function(a,b){ca(a,b)&&this.events.push(arguments)};Rb.prototype.finish=function(){for(var a=0;a<this.events.length;a++)L.apply(null,this.events[a])};var q=l.Pos=function(a,b){if(!(this instanceof q))return new q(a,b);this.line=a;this.ch=b},t=l.cmpPos=\nfunction(a,b){return a.line-b.line||a.ch-b.ch},T=null;Yc.prototype=da({init:function(a){function b(a){if(!D(d,a)){if(d.somethingSelected())T={lineWise:!1,text:d.getSelections()},c.inaccurateSelection&&(c.prevInput=\"\",c.inaccurateSelection=!1,f.value=T.text.join(\"\\n\"),gb(f));else if(d.options.lineWiseCopyCut){var b=$d(d);T={lineWise:!0,text:b.text};\"cut\"==a.type?d.setSelections(b.ranges,null,oa):(c.prevInput=\"\",f.value=b.text.join(\"\\n\"),gb(f))}else return;\"cut\"==a.type&&(d.state.cutIncoming=!0)}}var c=\nthis,d=this.cm,e=this.wrapper=be(),f=this.textarea=e.firstChild;a.wrapper.insertBefore(e,a.wrapper.firstChild);vb&&(f.style.width=\"0px\");y(f,\"input\",function(){B&&9<=A&&c.hasSelection&&(c.hasSelection=null);c.poll()});y(f,\"paste\",function(a){D(d,a)||Zd(a,d)||(d.state.pasteIncoming=!0,c.fastPoll())});y(f,\"cut\",b);y(f,\"copy\",b);y(a.scroller,\"paste\",function(b){ua(a,b)||D(d,b)||(d.state.pasteIncoming=!0,c.focus())});y(a.lineSpace,\"selectstart\",function(b){ua(a,b)||R(b)});y(f,\"compositionstart\",function(){var a=\nd.getCursor(\"from\");c.composing&&c.composing.range.clear();c.composing={start:a,range:d.markText(a,d.getCursor(\"to\"),{className:\"CodeMirror-composing\"})}});y(f,\"compositionend\",function(){c.composing&&(c.poll(),c.composing.range.clear(),c.composing=null)})},prepareSelection:function(){var a=this.cm,b=a.display,c=a.doc,d=oe(a);if(a.options.moveInputWithCursor){var a=sa(a,c.sel.primary().head,\"div\"),c=b.wrapper.getBoundingClientRect(),e=b.lineDiv.getBoundingClientRect();d.teTop=Math.max(0,Math.min(b.wrapper.clientHeight-\n10,a.top+e.top-c.top));d.teLeft=Math.max(0,Math.min(b.wrapper.clientWidth-10,a.left+e.left-c.left))}return d},showSelection:function(a){var b=this.cm.display;Y(b.cursorDiv,a.cursors);Y(b.selectionDiv,a.selection);null!=a.teTop&&(this.wrapper.style.top=a.teTop+\"px\",this.wrapper.style.left=a.teLeft+\"px\")},reset:function(a){if(!this.contextMenuPending){var b,c,d=this.cm,e=d.doc;d.somethingSelected()?(this.prevInput=\"\",b=e.sel.primary(),c=(b=Le&&(100<b.to().line-b.from().line||1E3<(c=d.getSelection()).length))?\n\"-\":c||d.getSelection(),this.textarea.value=c,d.state.focused&&gb(this.textarea),B&&9<=A&&(this.hasSelection=c)):a||(this.prevInput=this.textarea.value=\"\",B&&9<=A&&(this.hasSelection=null));this.inaccurateSelection=b}},getField:function(){return this.textarea},supportsTouch:function(){return!1},focus:function(){if(\"nocursor\"!=this.cm.options.readOnly&&(!ib||ma()!=this.textarea))try{this.textarea.focus()}catch(a){}},blur:function(){this.textarea.blur()},resetPosition:function(){this.wrapper.style.top=\nthis.wrapper.style.left=0},receivedFocus:function(){this.slowPoll()},slowPoll:function(){var a=this;a.pollingFast||a.polling.set(this.cm.options.pollInterval,function(){a.poll();a.cm.state.focused&&a.slowPoll()})},fastPoll:function(){function a(){c.poll()||b?(c.pollingFast=!1,c.slowPoll()):(b=!0,c.polling.set(60,a))}var b=!1,c=this;c.pollingFast=!0;c.polling.set(20,a)},poll:function(){var a=this.cm,b=this.textarea,c=this.prevInput;if(this.contextMenuPending||!a.state.focused||yg(b)&&!c&&!this.composing||\na.isReadOnly()||a.options.disableInput||a.state.keySeq)return!1;var d=b.value;if(d==c&&!a.somethingSelected())return!1;if(B&&9<=A&&this.hasSelection===d||ea&&/[\\uf700-\\uf7ff]/.test(d))return a.display.input.reset(),!1;if(a.doc.sel==a.display.selForContextMenu){var e=d.charCodeAt(0);8203!=e||c||(c=\"\\u200b\");if(8666==e)return this.reset(),this.cm.execCommand(\"undo\")}for(var f=0,e=Math.min(c.length,d.length);f<e&&c.charCodeAt(f)==d.charCodeAt(f);)++f;var g=this;X(a,function(){Vb(a,d.slice(f),c.length-\nf,null,g.composing?\"*compose\":null);1E3<d.length||-1<d.indexOf(\"\\n\")?b.value=g.prevInput=\"\":g.prevInput=d;g.composing&&(g.composing.range.clear(),g.composing.range=a.markText(g.composing.start,a.getCursor(\"to\"),{className:\"CodeMirror-composing\"}))});return!0},ensurePolled:function(){this.pollingFast&&this.poll()&&(this.pollingFast=!1)},onKeyPress:function(){B&&9<=A&&(this.hasSelection=null);this.fastPoll()},onContextMenu:function(a){function b(){if(null!=g.selectionStart){var a=e.somethingSelected(),\nb=\"\\u200b\"+(a?g.value:\"\");g.value=\"\\u21da\";g.value=b;d.prevInput=a?\"\":\"\\u200b\";g.selectionStart=1;g.selectionEnd=b.length;f.selForContextMenu=e.doc.sel}}function c(){d.contextMenuPending=!1;d.wrapper.style.cssText=p;g.style.cssText=m;B&&9>A&&f.scrollbars.setScrollTop(f.scroller.scrollTop=k);if(null!=g.selectionStart){(!B||B&&9>A)&&b();var a=0,c=function(){f.selForContextMenu==e.doc.sel&&0==g.selectionStart&&0<g.selectionEnd&&\"\\u200b\"==d.prevInput?H(e,oc.selectAll)(e):10>a++?f.detectingSelectAll=setTimeout(c,\n500):f.input.reset()};f.detectingSelectAll=setTimeout(c,200)}}var d=this,e=d.cm,f=e.display,g=d.textarea,h=Ka(e,a),k=f.scroller.scrollTop;if(h&&!ia){e.options.resetSelectionOnContextMenu&&-1==e.doc.sel.contains(h)&&H(e,E)(e.doc,na(h),oa);var m=g.style.cssText,p=d.wrapper.style.cssText;d.wrapper.style.cssText=\"position: absolute\";h=d.wrapper.getBoundingClientRect();g.style.cssText=\"position: absolute; width: 30px; height: 30px; top: \"+(a.clientY-h.top-5)+\"px; left: \"+(a.clientX-h.left-5)+\"px; z-index: 1000; background: \"+\n(B?\"rgba(255, 255, 255, .05)\":\"transparent\")+\"; outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);\";if(M)var l=window.scrollY;f.input.focus();M&&window.scrollTo(null,l);f.input.reset();e.somethingSelected()||(g.value=d.prevInput=\" \");d.contextMenuPending=!0;f.selForContextMenu=e.doc.sel;clearTimeout(f.detectingSelectAll);B&&9<=A&&b();if(md){jc(a);var n=function(){qa(window,\"mouseup\",n);setTimeout(c,20)};y(window,\"mouseup\",n)}else setTimeout(c,\n50)}},readOnlyChanged:function(a){a||this.reset()},setUneditable:Jb,needsContentAttribute:!1},Yc.prototype);Zc.prototype=da({init:function(a){function b(a){if(!D(d,a)){if(d.somethingSelected())T={lineWise:!1,text:d.getSelections()},\"cut\"==a.type&&d.replaceSelection(\"\",null,\"cut\");else if(d.options.lineWiseCopyCut){var b=$d(d);T={lineWise:!0,text:b.text};\"cut\"==a.type&&d.operation(function(){d.setSelections(b.ranges,0,oa);d.replaceSelection(\"\",null,\"cut\")})}else return;if(a.clipboardData){a.clipboardData.clearData();\nvar f=T.text.join(\"\\n\");a.clipboardData.setData(\"Text\",f);if(a.clipboardData.getData(\"Text\")==f){a.preventDefault();return}}var k=be();a=k.firstChild;d.display.lineSpace.insertBefore(k,d.display.lineSpace.firstChild);a.value=T.text.join(\"\\n\");var m=document.activeElement;gb(a);setTimeout(function(){d.display.lineSpace.removeChild(k);m.focus();m==e&&c.showPrimarySelection()},50)}}var c=this,d=c.cm,e=c.div=a.lineDiv;ae(e,d.options.spellcheck);y(e,\"paste\",function(a){D(d,a)||Zd(a,d)||11>=A&&setTimeout(H(d,\nfunction(){c.pollContent()||P(d)}),20)});y(e,\"compositionstart\",function(a){a=a.data;c.composing={sel:d.doc.sel,data:a,startData:a};if(a){var b=d.doc.sel.primary(),e=d.getLine(b.head.line).indexOf(a,Math.max(0,b.head.ch-a.length));-1<e&&e<=b.head.ch&&(c.composing.sel=na(q(b.head.line,e),q(b.head.line,e+a.length)))}});y(e,\"compositionupdate\",function(a){c.composing.data=a.data});y(e,\"compositionend\",function(a){var b=c.composing;b&&(a.data==b.startData||/\\u200b/.test(a.data)||(b.data=a.data),setTimeout(function(){b.handled||\nc.applyComposition(b);c.composing==b&&(c.composing=null)},50))});y(e,\"touchstart\",function(){c.forceCompositionEnd()});y(e,\"input\",function(){c.composing||!d.isReadOnly()&&c.pollContent()||X(c.cm,function(){P(d)})});y(e,\"copy\",b);y(e,\"cut\",b)},prepareSelection:function(){var a=oe(this.cm,!1);a.focus=this.cm.state.focused;return a},showSelection:function(a,b){a&&this.cm.display.view.length&&((a.focus||b)&&this.showPrimarySelection(),this.showMultipleSelections(a))},showPrimarySelection:function(){var a=\nwindow.getSelection(),b=this.cm.doc.sel.primary(),c=Yb(this.cm,a.anchorNode,a.anchorOffset),d=Yb(this.cm,a.focusNode,a.focusOffset);if(!c||c.bad||!d||d.bad||0!=t(Ub(c,d),b.from())||0!=t(Tb(c,d),b.to()))if(c=ce(this.cm,b.from()),d=ce(this.cm,b.to()),c||d){var e=this.cm.display.view,b=a.rangeCount&&a.getRangeAt(0);c?d||(d=e[e.length-1].measure,d=d.maps?d.maps[d.maps.length-1]:d.map,d={node:d[d.length-1],offset:d[d.length-2]-d[d.length-3]}):c={node:e[0].measure.map[2],offset:0};try{var f=$a(c.node,c.offset,\nd.offset,d.node)}catch(g){}f&&(!va&&this.cm.state.focused?(a.collapse(c.node,c.offset),f.collapsed||a.addRange(f)):(a.removeAllRanges(),a.addRange(f)),b&&null==a.anchorNode?a.addRange(b):va&&this.startGracePeriod());this.rememberSelection()}},startGracePeriod:function(){var a=this;clearTimeout(this.gracePeriod);this.gracePeriod=setTimeout(function(){a.gracePeriod=!1;a.selectionChanged()&&a.cm.operation(function(){a.cm.curOp.selectionChanged=!0})},20)},showMultipleSelections:function(a){Y(this.cm.display.cursorDiv,\na.cursors);Y(this.cm.display.selectionDiv,a.selection)},rememberSelection:function(){var a=window.getSelection();this.lastAnchorNode=a.anchorNode;this.lastAnchorOffset=a.anchorOffset;this.lastFocusNode=a.focusNode;this.lastFocusOffset=a.focusOffset},selectionInEditor:function(){var a=window.getSelection();if(!a.rangeCount)return!1;a=a.getRangeAt(0).commonAncestorContainer;return ad(this.div,a)},focus:function(){\"nocursor\"!=this.cm.options.readOnly&&this.div.focus()},blur:function(){this.div.blur()},\ngetField:function(){return this.div},supportsTouch:function(){return!0},receivedFocus:function(){function a(){b.cm.state.focused&&(b.pollSelection(),b.polling.set(b.cm.options.pollInterval,a))}var b=this;this.selectionInEditor()?this.pollSelection():X(this.cm,function(){b.cm.curOp.selectionChanged=!0});this.polling.set(this.cm.options.pollInterval,a)},selectionChanged:function(){var a=window.getSelection();return a.anchorNode!=this.lastAnchorNode||a.anchorOffset!=this.lastAnchorOffset||a.focusNode!=\nthis.lastFocusNode||a.focusOffset!=this.lastFocusOffset},pollSelection:function(){if(!this.composing&&!this.gracePeriod&&this.selectionChanged()){var a=window.getSelection(),b=this.cm;this.rememberSelection();var c=Yb(b,a.anchorNode,a.anchorOffset),d=Yb(b,a.focusNode,a.focusOffset);c&&d&&X(b,function(){E(b.doc,na(c,d),oa);if(c.bad||d.bad)b.curOp.selectionChanged=!0})}},pollContent:function(){var a=this.cm,b=a.display,c=a.doc.sel.primary(),d=c.from(),c=c.to();if(d.line<b.viewFrom||c.line>b.viewTo-\n1)return!1;var e;d.line==b.viewFrom||0==(e=Ha(a,d.line))?(d=F(b.view[0].line),e=b.view[0].node):(d=F(b.view[e].line),e=b.view[e-1].node.nextSibling);var f=Ha(a,c.line);f==b.view.length-1?(c=b.viewTo-1,b=b.lineDiv.lastChild):(c=F(b.view[f+1].line)-1,b=b.view[f+1].node.previousSibling);b=a.doc.splitLines(Gf(a,e,b,d,c));for(e=Ia(a.doc,q(d,0),q(c,w(a.doc,c).text.length));1<b.length&&1<e.length;)if(C(b)==C(e))b.pop(),e.pop(),c--;else if(b[0]==e[0])b.shift(),e.shift(),d++;else break;for(var g=0,f=0,h=b[0],\nk=e[0],m=Math.min(h.length,k.length);g<m&&h.charCodeAt(g)==k.charCodeAt(g);)++g;h=C(b);k=C(e);for(m=Math.min(h.length-(1==b.length?g:0),k.length-(1==e.length?g:0));f<m&&h.charCodeAt(h.length-f-1)==k.charCodeAt(k.length-f-1);)++f;b[b.length-1]=h.slice(0,h.length-f);b[0]=b[0].slice(g);d=q(d,g);c=q(c,e.length?C(e).length-f:0);if(1<b.length||b[0]||t(d,c))return bb(a.doc,b,d,c,\"+input\"),!0},ensurePolled:function(){this.forceCompositionEnd()},reset:function(){this.forceCompositionEnd()},forceCompositionEnd:function(){this.composing&&\n!this.composing.handled&&(this.applyComposition(this.composing),this.composing.handled=!0,this.div.blur(),this.div.focus())},applyComposition:function(a){this.cm.isReadOnly()?H(this.cm,P)(this.cm):a.data&&a.data!=a.startData&&H(this.cm,Vb)(this.cm,a.data,0,a.sel)},setUneditable:function(a){a.contentEditable=\"false\"},onKeyPress:function(a){a.preventDefault();this.cm.isReadOnly()||H(this.cm,Vb)(this.cm,String.fromCharCode(null==a.charCode?a.keyCode:a.charCode),0)},readOnlyChanged:function(a){this.div.contentEditable=\nString(\"nocursor\"!=a)},onContextMenu:Jb,resetPosition:Jb,needsContentAttribute:!0},Zc.prototype);l.inputStyles={textarea:Yc,contenteditable:Zc};ra.prototype={primary:function(){return this.ranges[this.primIndex]},equals:function(a){if(a==this)return!0;if(a.primIndex!=this.primIndex||a.ranges.length!=this.ranges.length)return!1;for(var b=0;b<this.ranges.length;b++){var c=this.ranges[b],d=a.ranges[b];if(0!=t(c.anchor,d.anchor)||0!=t(c.head,d.head))return!1}return!0},deepCopy:function(){for(var a=[],\nb=0;b<this.ranges.length;b++)a[b]=new G(Xc(this.ranges[b].anchor),Xc(this.ranges[b].head));return new ra(a,this.primIndex)},somethingSelected:function(){for(var a=0;a<this.ranges.length;a++)if(!this.ranges[a].empty())return!0;return!1},contains:function(a,b){b||(b=a);for(var c=0;c<this.ranges.length;c++){var d=this.ranges[c];if(0<=t(b,d.from())&&0>=t(a,d.to()))return c}return-1}};G.prototype={from:function(){return Ub(this.anchor,this.head)},to:function(){return Tb(this.anchor,this.head)},empty:function(){return this.head.line==\nthis.anchor.line&&this.head.ch==this.anchor.ch}};var te={left:0,right:0,top:0,bottom:0},Ja,ab=null,Of=0,lc,kc,Ae=0,mc=0,Z=null;B?Z=-.53:va?Z=15:vg?Z=-.7:Be&&(Z=-1/3);var Ie=function(a){var b=a.wheelDeltaX,c=a.wheelDeltaY;null==b&&a.detail&&a.axis==a.HORIZONTAL_AXIS&&(b=a.detail);null==c&&a.detail&&a.axis==a.VERTICAL_AXIS?c=a.detail:null==c&&(c=a.wheelDelta);return{x:b,y:c}};l.wheelEventPixels=function(a){a=Ie(a);a.x*=Z;a.y*=Z;return a};var ag=new Ba,pd=null,La=l.changeEnd=function(a){return a.text?\nq(a.from.line+a.text.length-1,C(a.text).length+(1==a.text.length?a.from.ch:0)):a.to};l.prototype={constructor:l,focus:function(){window.focus();this.display.input.focus()},setOption:function(a,b){var c=this.options,d=c[a];if(c[a]!=b||\"mode\"==a)c[a]=b,Sa.hasOwnProperty(a)&&H(this,Sa[a])(this,b,d)},getOption:function(a){return this.options[a]},getDoc:function(){return this.doc},addKeyMap:function(a,b){this.state.keyMaps[b?\"push\":\"unshift\"](vc(a))},removeKeyMap:function(a){for(var b=this.state.keyMaps,\nc=0;c<b.length;++c)if(b[c]==a||b[c].name==a)return b.splice(c,1),!0},addOverlay:O(function(a,b){var c=a.token?a:l.getMode(this.options,a);if(c.startState)throw Error(\"Overlays may not be stateful.\");sg(this.state.overlays,{mode:c,modeSpec:a,opaque:b&&b.opaque,priority:b&&b.priority||0},function(a){return a.priority});this.state.modeGen++;P(this)}),removeOverlay:O(function(a){for(var b=this.state.overlays,c=0;c<b.length;++c){var d=b[c].modeSpec;if(d==a||\"string\"==typeof a&&d.name==a){b.splice(c,1);\nthis.state.modeGen++;P(this);break}}}),indentLine:O(function(a,b,c){\"string\"!=typeof b&&\"number\"!=typeof b&&(b=null==b?this.options.smartIndent?\"smart\":\"prev\":b?\"add\":\"subtract\");wb(this.doc,a)&&ub(this,a,b,c)}),indentSelection:O(function(a){for(var b=this.doc.sel.ranges,c=-1,d=0;d<b.length;d++){var e=b[d];if(e.empty())e.head.line>c&&(ub(this,e.head.line,a,!0),c=e.head.line,d==this.doc.sel.primIndex&&Xa(this));else{for(var f=e.from(),e=e.to(),g=Math.max(c,f.line),c=Math.min(this.lastLine(),e.line-\n(e.ch?0:1))+1,e=g;e<c;++e)ub(this,e,a);e=this.doc.sel.ranges;0==f.ch&&b.length==e.length&&0<e[d].from().ch&&bd(this.doc,d,new G(f,e[d].to()),oa)}}}),getTokenAt:function(a,b){return ff(this,a,b)},getLineTokens:function(a,b){return ff(this,q(a),b,!0)},getTokenTypeAt:function(a){a=z(this.doc,a);var b=hf(this,w(this.doc,a.line)),c=0,d=(b.length-1)/2;a=a.ch;if(0==a)b=b[2];else for(;;){var e=c+d>>1;if((e?b[2*e-1]:0)>=a)d=e;else if(b[2*e+1]<a)c=e+1;else{b=b[2*e+2];break}}c=b?b.indexOf(\"cm-overlay \"):-1;\nreturn 0>c?b:0==c?null:b.slice(0,c-1)},getModeAt:function(a){var b=this.doc.mode;return b.innerMode?l.innerMode(b,this.getTokenAt(a).state).mode:b},getHelper:function(a,b){return this.getHelpers(a,b)[0]},getHelpers:function(a,b){var c=[];if(!hb.hasOwnProperty(b))return c;var d=hb[b];a=this.getModeAt(a);if(\"string\"==typeof a[b])d[a[b]]&&c.push(d[a[b]]);else if(a[b])for(var e=0;e<a[b].length;e++){var f=d[a[b][e]];f&&c.push(f)}else a.helperType&&d[a.helperType]?c.push(d[a.helperType]):d[a.name]&&c.push(d[a.name]);\nfor(e=0;e<d._global.length;e++)b=d._global[e],b.pred(a,this)&&-1==N(c,b.val)&&c.push(b.val);return c},getStateAfter:function(a,b){var c=this.doc;a=Math.max(c.first,Math.min(null==a?c.first+c.size-1:a,c.first+c.size-1));return yb(this,a+1,b)},cursorCoords:function(a,b){var c=this.doc.sel.primary();a=null==a?c.head:\"object\"==typeof a?z(this.doc,a):a?c.from():c.to();return sa(this,a,b||\"page\")},charCoords:function(a,b){return bc(this,z(this.doc,a),b||\"page\")},coordsChar:function(a,b){a=we(this,a,b||\n\"page\");return jd(this,a.left,a.top)},lineAtHeight:function(a,b){a=we(this,{top:a,left:0},b||\"page\").top;return Fa(this.doc,a+this.display.viewOffset)},heightAtLine:function(a,b){var c=!1;if(\"number\"==typeof a){var d=this.doc.first+this.doc.size-1;a<this.doc.first?a=this.doc.first:a>d&&(a=d,c=!0);a=w(this.doc,a)}return gd(this,a,{top:0,left:0},b||\"page\").top+(c?this.doc.height-la(a):0)},defaultTextHeight:function(){return Ca(this.display)},defaultCharWidth:function(){return lb(this.display)},setGutterMarker:O(function(a,\nb,c){return tc(this.doc,a,\"gutter\",function(a){var d=a.gutterMarkers||(a.gutterMarkers={});d[b]=c;!c&&rf(d)&&(a.gutterMarkers=null);return!0})}),clearGutter:O(function(a){var b=this,c=b.doc,d=c.first;c.iter(function(c){c.gutterMarkers&&c.gutterMarkers[a]&&(c.gutterMarkers[a]=null,ta(b,d,\"gutter\"),rf(c.gutterMarkers)&&(c.gutterMarkers=null));++d})}),lineInfo:function(a){if(\"number\"==typeof a){if(!wb(this.doc,a))return null;var b=a;a=w(this.doc,a);if(!a)return null}else if(b=F(a),null==b)return null;\nreturn{line:b,handle:a,text:a.text,gutterMarkers:a.gutterMarkers,textClass:a.textClass,bgClass:a.bgClass,wrapClass:a.wrapClass,widgets:a.widgets}},getViewport:function(){return{from:this.display.viewFrom,to:this.display.viewTo}},addWidget:function(a,b,c,d,e){var f=this.display;a=sa(this,z(this.doc,a));var g=a.bottom,h=a.left;b.style.position=\"absolute\";b.setAttribute(\"cm-ignore-events\",\"true\");this.display.input.setUneditable(b);f.sizer.appendChild(b);if(\"over\"==d)g=a.top;else if(\"above\"==d||\"near\"==\nd){var k=Math.max(f.wrapper.clientHeight,this.doc.height),m=Math.max(f.sizer.clientWidth,f.lineSpace.clientWidth);(\"above\"==d||a.bottom+b.offsetHeight>k)&&a.top>b.offsetHeight?g=a.top-b.offsetHeight:a.bottom+b.offsetHeight<=k&&(g=a.bottom);h+b.offsetWidth>m&&(h=m-b.offsetWidth)}b.style.top=g+\"px\";b.style.left=b.style.right=\"\";\"right\"==e?(h=f.sizer.clientWidth-b.offsetWidth,b.style.right=\"0px\"):(\"left\"==e?h=0:\"middle\"==e&&(h=(f.sizer.clientWidth-b.offsetWidth)/2),b.style.left=h+\"px\");c&&(a=hc(this,\nh,g,h+b.offsetWidth,g+b.offsetHeight),null!=a.scrollTop&&qb(this,a.scrollTop),null!=a.scrollLeft&&Ua(this,a.scrollLeft))},triggerOnKeyDown:O(Ee),triggerOnKeyPress:O(Fe),triggerOnKeyUp:De,execCommand:function(a){if(oc.hasOwnProperty(a))return oc[a].call(null,this)},triggerElectric:O(function(a){Yd(this,a)}),findPosH:function(a,b,c,d){var e=1;0>b&&(e=-1,b=-b);var f=0;for(a=z(this.doc,a);f<b&&(a=vd(this.doc,a,e,c,d),!a.hitSide);++f);return a},moveH:O(function(a,b){var c=this;c.extendSelectionsBy(function(d){return c.display.shift||\nc.doc.extend||d.empty()?vd(c.doc,d.head,a,b,c.options.rtlMoveVisually):0>a?d.from():d.to()},Lb)}),deleteH:O(function(a,b){var c=this.doc;this.doc.sel.somethingSelected()?c.replaceSelection(\"\",null,\"+delete\"):cb(this,function(d){var e=vd(c,d.head,a,b,!1);return 0>a?{from:e,to:d.head}:{from:d.head,to:e}})}),findPosV:function(a,b,c,d){var e=1;0>b&&(e=-1,b=-b);var f=0;for(a=z(this.doc,a);f<b&&(a=sa(this,a,\"div\"),null==d?d=a.left:a.left=d,a=Xe(this,a,e,c),!a.hitSide);++f);return a},moveV:O(function(a,\nb){var c=this,d=this.doc,e=[],f=!c.display.shift&&!d.extend&&d.sel.somethingSelected();d.extendSelectionsBy(function(g){if(f)return 0>a?g.from():g.to();var h=sa(c,g.head,\"div\");null!=g.goalColumn&&(h.left=g.goalColumn);e.push(h.left);var m=Xe(c,h,a,b);\"page\"==b&&g==d.sel.primary()&&rc(c,null,bc(c,m,\"div\").top-h.top);return m},Lb);if(e.length)for(var g=0;g<d.sel.ranges.length;g++)d.sel.ranges[g].goalColumn=e[g]}),findWordAt:function(a){var b=w(this.doc,a.line).text,c=a.ch,d=a.ch;if(b){var e=this.getHelper(a,\n\"wordChars\");(0>a.xRel||d==b.length)&&c?--c:++d;for(var f=b.charAt(c),f=uc(f,e)?function(a){return uc(a,e)}:/\\s/.test(f)?function(a){return/\\s/.test(a)}:function(a){return!/\\s/.test(a)&&!uc(a)};0<c&&f(b.charAt(c-1));)--c;for(;d<b.length&&f(b.charAt(d));)++d}return new G(q(a.line,c),q(a.line,d))},toggleOverwrite:function(a){if(null==a||a!=this.state.overwrite)(this.state.overwrite=!this.state.overwrite)?rb(this.display.cursorDiv,\"CodeMirror-overwrite\"):pb(this.display.cursorDiv,\"CodeMirror-overwrite\"),\nL(this,\"overwriteToggle\",this,this.state.overwrite)},hasFocus:function(){return this.display.input.getField()==ma()},isReadOnly:function(){return!(!this.options.readOnly&&!this.doc.cantEdit)},scrollTo:O(function(a,b){null==a&&null==b||sc(this);null!=a&&(this.curOp.scrollLeft=a);null!=b&&(this.curOp.scrollTop=b)}),getScrollInfo:function(){var a=this.display.scroller;return{left:a.scrollLeft,top:a.scrollTop,height:a.scrollHeight-ka(this)-this.display.barHeight,width:a.scrollWidth-ka(this)-this.display.barWidth,\nclientHeight:Tc(this),clientWidth:Ga(this)}},scrollIntoView:O(function(a,b){null==a?(a={from:this.doc.sel.primary().head,to:null},null==b&&(b=this.options.cursorScrollMargin)):\"number\"==typeof a?a={from:q(a,0),to:null}:null==a.from&&(a={from:a,to:null});a.to||(a.to=a.from);a.margin=b||0;null!=a.from.line?(sc(this),this.curOp.scrollToPos=a):(a=hc(this,Math.min(a.from.left,a.to.left),Math.min(a.from.top,a.to.top)-a.margin,Math.max(a.from.right,a.to.right),Math.max(a.from.bottom,a.to.bottom)+a.margin),\nthis.scrollTo(a.scrollLeft,a.scrollTop))}),setSize:O(function(a,b){function c(a){return\"number\"==typeof a||/^\\d+$/.test(String(a))?a+\"px\":a}var d=this;null!=a&&(d.display.wrapper.style.width=c(a));null!=b&&(d.display.wrapper.style.height=c(b));d.options.lineWrapping&&ve(this);var e=d.display.viewFrom;d.doc.iter(e,d.display.viewTo,function(a){if(a.widgets)for(var b=0;b<a.widgets.length;b++)if(a.widgets[b].noHScroll){ta(d,e,\"widget\");break}++e});d.curOp.forceUpdate=!0;L(d,\"refresh\",this)}),operation:function(a){return X(this,\na)},refresh:O(function(){var a=this.display.cachedTextHeight;P(this);this.curOp.forceUpdate=!0;mb(this);this.scrollTo(this.doc.scrollLeft,this.doc.scrollTop);Ic(this);(null==a||.5<Math.abs(a-Ca(this.display)))&&Qa(this);L(this,\"refresh\",this)}),swapDoc:O(function(a){var b=this.doc;b.cm=null;Id(this,a);mb(this);this.display.input.reset();this.scrollTo(a.scrollLeft,a.scrollTop);this.curOp.forceScroll=!0;V(this,\"swapDoc\",this,b);return b}),getInputField:function(){return this.display.input.getField()},\ngetWrapperElement:function(){return this.display.wrapper},getScrollerElement:function(){return this.display.scroller},getGutterElement:function(){return this.display.gutters}};fb(l);var Af=l.defaults={},Sa=l.optionHandlers={},Jd=l.Init={toString:function(){return\"CodeMirror.Init\"}};x(\"value\",\"\",function(a,b){a.setValue(b)},!0);x(\"mode\",null,function(a,b){a.doc.modeOption=b;I(a)},!0);x(\"indentUnit\",2,I,!0);x(\"indentWithTabs\",!1);x(\"smartIndent\",!0);x(\"tabSize\",4,function(a){S(a);mb(a);P(a)},!0);x(\"lineSeparator\",\nnull,function(a,b){if(a.doc.lineSep=b){var c=[],d=a.doc.first;a.doc.iter(function(a){for(var e=0;;){var f=a.text.indexOf(b,e);if(-1==f)break;e=f+b.length;c.push(q(d,f))}d++});for(var e=c.length-1;0<=e;e--)bb(a.doc,b,c[e],q(c[e].line,c[e].ch+b.length))}});x(\"specialChars\",/[\\u0000-\\u001f\\u007f\\u00ad\\u200b-\\u200f\\u2028\\u2029\\ufeff]/g,function(a,b,c){a.state.specialChars=new RegExp(b.source+(b.test(\"\\t\")?\"\":\"|\\t\"),\"g\");c!=l.Init&&a.refresh()});x(\"specialCharPlaceholder\",function(a){var b=r(\"span\",\"\\u2022\",\n\"cm-invalidchar\");b.title=\"\\\\u\"+a.charCodeAt(0).toString(16);b.setAttribute(\"aria-label\",b.title);return b},function(a){a.refresh()},!0);x(\"electricChars\",!0);x(\"inputStyle\",ib?\"contenteditable\":\"textarea\",function(){throw Error(\"inputStyle can not (yet) be changed in a running editor\");},!0);x(\"spellcheck\",!1,function(a,b){a.getInputField().spellcheck=b},!0);x(\"rtlMoveVisually\",!xg);x(\"wholeLineUpdateBefore\",!0);x(\"theme\",\"default\",function(a){Fd(a);nb(a)},!0);x(\"keyMap\",\"default\",function(a,b,c){b=\nvc(b);(c=c!=l.Init&&vc(c))&&c.detach&&c.detach(a,b);b.attach&&b.attach(a,c||null)});x(\"extraKeys\",null);x(\"lineWrapping\",!1,function(a){a.options.lineWrapping?(rb(a.display.wrapper,\"CodeMirror-wrap\"),a.display.sizer.style.minWidth=\"\",a.display.sizerWidth=null):(pb(a.display.wrapper,\"CodeMirror-wrap\"),Jc(a));Qa(a);P(a);mb(a);setTimeout(function(){Va(a)},100)},!0);x(\"gutters\",[],function(a){Dc(a.options);nb(a)},!0);x(\"fixedGutter\",!0,function(a,b){a.display.gutters.style.left=b?Oc(a.display)+\"px\":\"0\";\na.refresh()},!0);x(\"coverGutterNextToScrollbar\",!1,function(a){Va(a)},!0);x(\"scrollbarStyle\",\"native\",function(a){Gd(a);Va(a);a.display.scrollbars.setScrollTop(a.doc.scrollTop);a.display.scrollbars.setScrollLeft(a.doc.scrollLeft)},!0);x(\"lineNumbers\",!1,function(a){Dc(a.options);nb(a)},!0);x(\"firstLineNumber\",1,nb,!0);x(\"lineNumberFormatter\",function(a){return a},nb,!0);x(\"showCursorWhenSelecting\",!1,sb,!0);x(\"resetSelectionOnContextMenu\",!0);x(\"lineWiseCopyCut\",!0);x(\"readOnly\",!1,function(a,b){\"nocursor\"==\nb?(jb(a),a.display.input.blur(),a.display.disabled=!0):a.display.disabled=!1;a.display.input.readOnlyChanged(b)});x(\"disableInput\",!1,function(a,b){b||a.display.input.reset()},!0);x(\"dragDrop\",!0,function(a,b,c){!b!=!(c&&c!=l.Init)&&(c=a.display.dragFunctions,b=b?y:qa,b(a.display.scroller,\"dragstart\",c.start),b(a.display.scroller,\"dragenter\",c.enter),b(a.display.scroller,\"dragover\",c.over),b(a.display.scroller,\"dragleave\",c.leave),b(a.display.scroller,\"drop\",c.drop))});x(\"allowDropFileTypes\",null);\nx(\"cursorBlinkRate\",530);x(\"cursorScrollMargin\",0);x(\"cursorHeight\",1,sb,!0);x(\"singleCursorHeightPerLine\",!0,sb,!0);x(\"workTime\",100);x(\"workDelay\",100);x(\"flattenSpans\",!0,S,!0);x(\"addModeClass\",!1,S,!0);x(\"pollInterval\",100);x(\"undoDepth\",200,function(a,b){a.doc.history.undoDepth=b});x(\"historyEventDelay\",1250);x(\"viewportMargin\",10,function(a){a.refresh()},!0);x(\"maxHighlightLength\",1E4,S,!0);x(\"moveInputWithCursor\",!0,function(a,b){b||a.display.input.resetPosition()});x(\"tabindex\",null,function(a,\nb){a.display.input.getField().tabIndex=b||\"\"});x(\"autofocus\",null);var zf=l.modes={},Mb=l.mimeModes={};l.defineMode=function(a,b){l.defaults.mode||\"null\"==a||(l.defaults.mode=a);2<arguments.length&&(b.dependencies=Array.prototype.slice.call(arguments,2));zf[a]=b};l.defineMIME=function(a,b){Mb[a]=b};l.resolveMode=function(a){if(\"string\"==typeof a&&Mb.hasOwnProperty(a))a=Mb[a];else if(a&&\"string\"==typeof a.name&&Mb.hasOwnProperty(a.name)){var b=Mb[a.name];\"string\"==typeof b&&(b={name:b});a=pf(b,a);\na.name=b.name}else{if(\"string\"==typeof a&&/^[\\w\\-]+\\/[\\w\\-]+\\+xml$/.test(a))return l.resolveMode(\"application/xml\");if(\"string\"==typeof a&&/^[\\w\\-]+\\/[\\w\\-]+\\+json$/.test(a))return l.resolveMode(\"application/json\")}return\"string\"==typeof a?{name:a}:a||{name:\"null\"}};l.getMode=function(a,b){b=l.resolveMode(b);var c=zf[b.name];if(!c)return l.getMode(a,\"text/plain\");a=c(a,b);if(Nb.hasOwnProperty(b.name)){var c=Nb[b.name],d;for(d in c)c.hasOwnProperty(d)&&(a.hasOwnProperty(d)&&(a[\"_\"+d]=a[d]),a[d]=c[d])}a.name=\nb.name;b.helperType&&(a.helperType=b.helperType);if(b.modeProps)for(d in b.modeProps)a[d]=b.modeProps[d];return a};l.defineMode(\"null\",function(){return{token:function(a){a.skipToEnd()}}});l.defineMIME(\"text/plain\",\"null\");var Nb=l.modeExtensions={};l.extendMode=function(a,b){a=Nb.hasOwnProperty(a)?Nb[a]:Nb[a]={};da(b,a)};l.defineExtension=function(a,b){l.prototype[a]=b};l.defineDocExtension=function(a,b){U.prototype[a]=b};l.defineOption=x;var Gc=[];l.defineInitHook=function(a){Gc.push(a)};var hb=\nl.helpers={};l.registerHelper=function(a,b,c){hb.hasOwnProperty(a)||(hb[a]=l[a]={_global:[]});hb[a][b]=c};l.registerGlobalHelper=function(a,b,c,d){l.registerHelper(a,b,d);hb[a]._global.push({pred:c,val:d})};var za=l.copyState=function(a,b){if(!0===b)return b;if(a.copyState)return a.copyState(b);a={};for(var c in b){var d=b[c];d instanceof Array&&(d=d.concat([]));a[c]=d}return a},Mf=l.startState=function(a,b,c){return a.startState?a.startState(b,c):!0};l.innerMode=function(a,b){for(;a.innerMode;){var c=\na.innerMode(b);if(!c||c.mode==a)break;b=c.state;a=c.mode}return c||{mode:a,state:b}};var oc=l.commands={selectAll:function(a){a.setSelection(q(a.firstLine(),0),q(a.lastLine()),oa)},singleSelection:function(a){a.setSelection(a.getCursor(\"anchor\"),a.getCursor(\"head\"),oa)},killLine:function(a){cb(a,function(b){if(b.empty()){var c=w(a.doc,b.head.line).text.length;return b.head.ch==c&&b.head.line<a.lastLine()?{from:b.head,to:q(b.head.line+1,0)}:{from:b.head,to:q(b.head.line,c)}}return{from:b.from(),to:b.to()}})},\ndeleteLine:function(a){cb(a,function(b){return{from:q(b.from().line,0),to:z(a.doc,q(b.to().line+1,0))}})},delLineLeft:function(a){cb(a,function(a){return{from:q(a.from().line,0),to:a.from()}})},delWrappedLineLeft:function(a){cb(a,function(b){var c=a.charCoords(b.head,\"div\").top+5;return{from:a.coordsChar({left:0,top:c},\"div\"),to:b.from()}})},delWrappedLineRight:function(a){cb(a,function(b){var c=a.charCoords(b.head,\"div\").top+5,c=a.coordsChar({left:a.display.lineDiv.offsetWidth+100,top:c},\"div\");\nreturn{from:b.from(),to:c}})},undo:function(a){a.undo()},redo:function(a){a.redo()},undoSelection:function(a){a.undoSelection()},redoSelection:function(a){a.redoSelection()},goDocStart:function(a){a.extendSelection(q(a.firstLine(),0))},goDocEnd:function(a){a.extendSelection(q(a.lastLine()))},goLineStart:function(a){a.extendSelectionsBy(function(b){return tf(a,b.head.line)},{origin:\"+move\",bias:1})},goLineStartSmart:function(a){a.extendSelectionsBy(function(b){return uf(a,b.head)},{origin:\"+move\",\nbias:1})},goLineEnd:function(a){a.extendSelectionsBy(function(b){b=b.head.line;for(var c,d=w(a.doc,b);c=Ea(d,!1);)d=c.find(1,!0).line,b=null;c=(c=fa(d))?c[0].level%2?fc(d):gc(d):d.text.length;return q(null==b?F(d):b,c)},{origin:\"+move\",bias:-1})},goLineRight:function(a){a.extendSelectionsBy(function(b){b=a.charCoords(b.head,\"div\").top+5;return a.coordsChar({left:a.display.lineDiv.offsetWidth+100,top:b},\"div\")},Lb)},goLineLeft:function(a){a.extendSelectionsBy(function(b){b=a.charCoords(b.head,\"div\").top+\n5;return a.coordsChar({left:0,top:b},\"div\")},Lb)},goLineLeftSmart:function(a){a.extendSelectionsBy(function(b){var c=a.charCoords(b.head,\"div\").top+5,c=a.coordsChar({left:0,top:c},\"div\");return c.ch<a.getLine(c.line).search(/\\S/)?uf(a,b.head):c},Lb)},goLineUp:function(a){a.moveV(-1,\"line\")},goLineDown:function(a){a.moveV(1,\"line\")},goPageUp:function(a){a.moveV(-1,\"page\")},goPageDown:function(a){a.moveV(1,\"page\")},goCharLeft:function(a){a.moveH(-1,\"char\")},goCharRight:function(a){a.moveH(1,\"char\")},\ngoColumnLeft:function(a){a.moveH(-1,\"column\")},goColumnRight:function(a){a.moveH(1,\"column\")},goWordLeft:function(a){a.moveH(-1,\"word\")},goGroupRight:function(a){a.moveH(1,\"group\")},goGroupLeft:function(a){a.moveH(-1,\"group\")},goWordRight:function(a){a.moveH(1,\"word\")},delCharBefore:function(a){a.deleteH(-1,\"char\")},delCharAfter:function(a){a.deleteH(1,\"char\")},delWordBefore:function(a){a.deleteH(-1,\"word\")},delWordAfter:function(a){a.deleteH(1,\"word\")},delGroupBefore:function(a){a.deleteH(-1,\"group\")},\ndelGroupAfter:function(a){a.deleteH(1,\"group\")},indentAuto:function(a){a.indentSelection(\"smart\")},indentMore:function(a){a.indentSelection(\"add\")},indentLess:function(a){a.indentSelection(\"subtract\")},insertTab:function(a){a.replaceSelection(\"\\t\")},insertSoftTab:function(a){for(var b=[],c=a.listSelections(),d=a.options.tabSize,e=0;e<c.length;e++){var f=c[e].from(),f=ha(a.getLine(f.line),f.ch,d);b.push(ud(d-f%d))}a.replaceSelections(b)},defaultTab:function(a){a.somethingSelected()?a.indentSelection(\"add\"):\na.execCommand(\"insertTab\")},transposeChars:function(a){X(a,function(){for(var b=a.listSelections(),c=[],d=0;d<b.length;d++){var e=b[d].head,f=w(a.doc,e.line).text;if(f)if(e.ch==f.length&&(e=new q(e.line,e.ch-1)),0<e.ch)e=new q(e.line,e.ch+1),a.replaceRange(f.charAt(e.ch-1)+f.charAt(e.ch-2),q(e.line,e.ch-2),e,\"+transpose\");else if(e.line>a.doc.first){var g=w(a.doc,e.line-1).text;g&&a.replaceRange(f.charAt(0)+a.doc.lineSeparator()+g.charAt(g.length-1),q(e.line-1,g.length-1),q(e.line,1),\"+transpose\")}c.push(new G(e,\ne))}a.setSelections(c)})},newlineAndIndent:function(a){X(a,function(){for(var b=a.listSelections().length,c=0;c<b;c++){var d=a.listSelections()[c];a.replaceRange(a.doc.lineSeparator(),d.anchor,d.head,\"+input\");a.indentLine(d.from().line+1,null,!0)}Xa(a)})},openLine:function(a){a.replaceSelection(\"\\n\",\"start\")},toggleOverwrite:function(a){a.toggleOverwrite()}},Aa=l.keyMap={};Aa.basic={Left:\"goCharLeft\",Right:\"goCharRight\",Up:\"goLineUp\",Down:\"goLineDown\",End:\"goLineEnd\",Home:\"goLineStartSmart\",PageUp:\"goPageUp\",\nPageDown:\"goPageDown\",Delete:\"delCharAfter\",Backspace:\"delCharBefore\",\"Shift-Backspace\":\"delCharBefore\",Tab:\"defaultTab\",\"Shift-Tab\":\"indentAuto\",Enter:\"newlineAndIndent\",Insert:\"toggleOverwrite\",Esc:\"singleSelection\"};Aa.pcDefault={\"Ctrl-A\":\"selectAll\",\"Ctrl-D\":\"deleteLine\",\"Ctrl-Z\":\"undo\",\"Shift-Ctrl-Z\":\"redo\",\"Ctrl-Y\":\"redo\",\"Ctrl-Home\":\"goDocStart\",\"Ctrl-End\":\"goDocEnd\",\"Ctrl-Up\":\"goLineUp\",\"Ctrl-Down\":\"goLineDown\",\"Ctrl-Left\":\"goGroupLeft\",\"Ctrl-Right\":\"goGroupRight\",\"Alt-Left\":\"goLineStart\",\n\"Alt-Right\":\"goLineEnd\",\"Ctrl-Backspace\":\"delGroupBefore\",\"Ctrl-Delete\":\"delGroupAfter\",\"Ctrl-S\":\"save\",\"Ctrl-F\":\"find\",\"Ctrl-G\":\"findNext\",\"Shift-Ctrl-G\":\"findPrev\",\"Shift-Ctrl-F\":\"replace\",\"Shift-Ctrl-R\":\"replaceAll\",\"Ctrl-[\":\"indentLess\",\"Ctrl-]\":\"indentMore\",\"Ctrl-U\":\"undoSelection\",\"Shift-Ctrl-U\":\"redoSelection\",\"Alt-U\":\"redoSelection\",fallthrough:\"basic\"};Aa.emacsy={\"Ctrl-F\":\"goCharRight\",\"Ctrl-B\":\"goCharLeft\",\"Ctrl-P\":\"goLineUp\",\"Ctrl-N\":\"goLineDown\",\"Alt-F\":\"goWordRight\",\"Alt-B\":\"goWordLeft\",\n\"Ctrl-A\":\"goLineStart\",\"Ctrl-E\":\"goLineEnd\",\"Ctrl-V\":\"goPageDown\",\"Shift-Ctrl-V\":\"goPageUp\",\"Ctrl-D\":\"delCharAfter\",\"Ctrl-H\":\"delCharBefore\",\"Alt-D\":\"delWordAfter\",\"Alt-Backspace\":\"delWordBefore\",\"Ctrl-K\":\"killLine\",\"Ctrl-T\":\"transposeChars\",\"Ctrl-O\":\"openLine\"};Aa.macDefault={\"Cmd-A\":\"selectAll\",\"Cmd-D\":\"deleteLine\",\"Cmd-Z\":\"undo\",\"Shift-Cmd-Z\":\"redo\",\"Cmd-Y\":\"redo\",\"Cmd-Home\":\"goDocStart\",\"Cmd-Up\":\"goDocStart\",\"Cmd-End\":\"goDocEnd\",\"Cmd-Down\":\"goDocEnd\",\"Alt-Left\":\"goGroupLeft\",\"Alt-Right\":\"goGroupRight\",\n\"Cmd-Left\":\"goLineLeft\",\"Cmd-Right\":\"goLineRight\",\"Alt-Backspace\":\"delGroupBefore\",\"Ctrl-Alt-Backspace\":\"delGroupAfter\",\"Alt-Delete\":\"delGroupAfter\",\"Cmd-S\":\"save\",\"Cmd-F\":\"find\",\"Cmd-G\":\"findNext\",\"Shift-Cmd-G\":\"findPrev\",\"Cmd-Alt-F\":\"replace\",\"Shift-Cmd-Alt-F\":\"replaceAll\",\"Cmd-[\":\"indentLess\",\"Cmd-]\":\"indentMore\",\"Cmd-Backspace\":\"delWrappedLineLeft\",\"Cmd-Delete\":\"delWrappedLineRight\",\"Cmd-U\":\"undoSelection\",\"Shift-Cmd-U\":\"redoSelection\",\"Ctrl-Up\":\"goDocStart\",\"Ctrl-Down\":\"goDocEnd\",fallthrough:[\"basic\",\n\"emacsy\"]};Aa[\"default\"]=ea?Aa.macDefault:Aa.pcDefault;l.normalizeKeyMap=function(a){var b={},c;for(c in a)if(a.hasOwnProperty(c)){var d=a[c];if(!/^(name|fallthrough|(de|at)tach)$/.test(c)){if(\"...\"!=d)for(var e=Wb(c.split(\" \"),gg),f=0;f<e.length;f++){var g,h;f==e.length-1?(h=e.join(\" \"),g=d):(h=e.slice(0,f+1).join(\" \"),g=\"...\");var k=b[h];if(!k)b[h]=g;else if(k!=g)throw Error(\"Inconsistent bindings for \"+h);}delete a[c]}}for(var m in b)a[m]=b[m];return a};var Cb=l.lookupKey=function(a,b,c,d){b=vc(b);\nvar e=b.call?b.call(a,d):b[a];if(!1===e)return\"nothing\";if(\"...\"===e)return\"multi\";if(null!=e&&c(e))return\"handled\";if(b.fallthrough){if(\"[object Array]\"!=Object.prototype.toString.call(b.fallthrough))return Cb(a,b.fallthrough,c,d);for(e=0;e<b.fallthrough.length;e++){var f=Cb(a,b.fallthrough[e],c,d);if(f)return f}}},$f=l.isModifierKey=function(a){a=\"string\"==typeof a?a:Pa[a.keyCode];return\"Ctrl\"==a||\"Alt\"==a||\"Shift\"==a||\"Mod\"==a},bg=l.keyName=function(a,b){if(ia&&34==a.keyCode&&a[\"char\"])return!1;\nvar c=Pa[a.keyCode],d=c;if(null==d||a.altGraphKey)return!1;a.altKey&&\"Alt\"!=c&&(d=\"Alt-\"+d);(yf?a.metaKey:a.ctrlKey)&&\"Ctrl\"!=c&&(d=\"Ctrl-\"+d);(yf?a.ctrlKey:a.metaKey)&&\"Cmd\"!=c&&(d=\"Cmd-\"+d);!b&&a.shiftKey&&\"Shift\"!=c&&(d=\"Shift-\"+d);return d};l.fromTextArea=function(a,b){function c(){a.value=h.getValue()}b=b?da(b):{};b.value=a.value;!b.tabindex&&a.tabIndex&&(b.tabindex=a.tabIndex);!b.placeholder&&a.placeholder&&(b.placeholder=a.placeholder);if(null==b.autofocus){var d=ma();b.autofocus=d==a||null!=\na.getAttribute(\"autofocus\")&&d==document.body}if(a.form&&(y(a.form,\"submit\",c),!b.leaveSubmitMethodAlone)){var e=a.form,f=e.submit;try{var g=e.submit=function(){c();e.submit=f;e.submit();e.submit=g}}catch(k){}}b.finishInit=function(b){b.save=c;b.getTextArea=function(){return a};b.toTextArea=function(){b.toTextArea=isNaN;c();a.parentNode.removeChild(b.getWrapperElement());a.style.display=\"\";a.form&&(qa(a.form,\"submit\",c),\"function\"==typeof a.form.submit&&(a.form.submit=f))}};a.style.display=\"none\";\nvar h=l(function(b){a.parentNode.insertBefore(b,a.nextSibling)},b);return h};var zc=l.StringStream=function(a,b){this.pos=this.start=0;this.string=a;this.tabSize=b||8;this.lineStart=this.lastColumnPos=this.lastColumnValue=0};zc.prototype={eol:function(){return this.pos>=this.string.length},sol:function(){return this.pos==this.lineStart},peek:function(){return this.string.charAt(this.pos)||void 0},next:function(){if(this.pos<this.string.length)return this.string.charAt(this.pos++)},eat:function(a){var b=\nthis.string.charAt(this.pos);if(\"string\"==typeof a?b==a:b&&(a.test?a.test(b):a(b)))return++this.pos,b},eatWhile:function(a){for(var b=this.pos;this.eat(a););return this.pos>b},eatSpace:function(){for(var a=this.pos;/[\\s\\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;return this.pos>a},skipToEnd:function(){this.pos=this.string.length},skipTo:function(a){a=this.string.indexOf(a,this.pos);if(-1<a)return this.pos=a,!0},backUp:function(a){this.pos-=a},column:function(){this.lastColumnPos<this.start&&\n(this.lastColumnValue=ha(this.string,this.start,this.tabSize,this.lastColumnPos,this.lastColumnValue),this.lastColumnPos=this.start);return this.lastColumnValue-(this.lineStart?ha(this.string,this.lineStart,this.tabSize):0)},indentation:function(){return ha(this.string,null,this.tabSize)-(this.lineStart?ha(this.string,this.lineStart,this.tabSize):0)},match:function(a,b,c){if(\"string\"==typeof a){var d=function(a){return c?a.toLowerCase():a},e=this.string.substr(this.pos,a.length);if(d(e)==d(a))return!1!==\nb&&(this.pos+=a.length),!0}else{if((a=this.string.slice(this.pos).match(a))&&0<a.index)return null;a&&!1!==b&&(this.pos+=a[0].length);return a}},current:function(){return this.string.slice(this.start,this.pos)},hideFirstChars:function(a,b){this.lineStart+=a;try{return b()}finally{this.lineStart-=a}}};var wd=0,Na=l.TextMarker=function(a,b){this.lines=[];this.type=b;this.doc=a;this.id=++wd};fb(Na);Na.prototype.clear=function(){if(!this.explicitlyCleared){var a=this.doc.cm,b=a&&!a.curOp;b&&Ra(a);if(ca(this,\n\"clear\")){var c=this.find();c&&V(this,\"clear\",c.from,c.to)}for(var d=c=null,e=0;e<this.lines.length;++e){var f=this.lines[e],g=Eb(f.markedSpans,this);a&&!this.collapsed?ta(a,F(f),\"text\"):a&&(null!=g.to&&(d=F(f)),null!=g.from&&(c=F(f)));for(var h=f,k=f.markedSpans,m=g,p=void 0,l=0;l<k.length;++l)k[l]!=m&&(p||(p=[])).push(k[l]);h.markedSpans=p;null==g.from&&this.collapsed&&!Da(this.doc,f)&&a&&ja(f,Ca(a.display))}if(a&&this.collapsed&&!a.options.lineWrapping)for(e=0;e<this.lines.length;++e)f=pa(this.lines[e]),\ng=Pb(f),g>a.display.maxLineLength&&(a.display.maxLine=f,a.display.maxLineLength=g,a.display.maxLineChanged=!0);null!=c&&a&&this.collapsed&&P(a,c,d+1);this.lines.length=0;this.explicitlyCleared=!0;this.atomic&&this.doc.cantEdit&&(this.doc.cantEdit=!1,a&&me(a.doc));a&&V(a,\"markerCleared\",a,this);b&&Ta(a);this.parent&&this.parent.clear()}};Na.prototype.find=function(a,b){null==a&&\"bookmark\"==this.type&&(a=1);for(var c,d,e=0;e<this.lines.length;++e){var f=this.lines[e],g=Eb(f.markedSpans,this);if(null!=\ng.from&&(c=q(b?f:F(f),g.from),-1==a))return c;if(null!=g.to&&(d=q(b?f:F(f),g.to),1==a))return d}return c&&{from:c,to:d}};Na.prototype.changed=function(){var a=this.find(-1,!0),b=this,c=this.doc.cm;a&&c&&X(c,function(){var d=a.line,e=F(a.line);if(e=$c(c,e))ue(e),c.curOp.selectionChanged=c.curOp.forceUpdate=!0;c.curOp.updateMaxLine=!0;Da(b.doc,d)||null==b.height||(e=b.height,b.height=null,(e=Ab(b)-e)&&ja(d,d.height+e))})};Na.prototype.attachLine=function(a){if(!this.lines.length&&this.doc.cm){var b=\nthis.doc.cm.curOp;b.maybeHiddenMarkers&&-1!=N(b.maybeHiddenMarkers,this)||(b.maybeUnhiddenMarkers||(b.maybeUnhiddenMarkers=[])).push(this)}this.lines.push(a)};Na.prototype.detachLine=function(a){this.lines.splice(N(this.lines,a),1);!this.lines.length&&this.doc.cm&&(a=this.doc.cm.curOp,(a.maybeHiddenMarkers||(a.maybeHiddenMarkers=[])).push(this))};var wd=0,xc=l.SharedTextMarker=function(a,b){this.markers=a;this.primary=b;for(b=0;b<a.length;++b)a[b].parent=this};fb(xc);xc.prototype.clear=function(){if(!this.explicitlyCleared){this.explicitlyCleared=\n!0;for(var a=0;a<this.markers.length;++a)this.markers[a].clear();V(this,\"clear\")}};xc.prototype.find=function(a,b){return this.primary.find(a,b)};var yc=l.LineWidget=function(a,b,c){if(c)for(var d in c)c.hasOwnProperty(d)&&(this[d]=c[d]);this.doc=a;this.node=b};fb(yc);yc.prototype.clear=function(){var a=this.doc.cm,b=this.line.widgets,c=this.line,d=F(c);if(null!=d&&b){for(var e=0;e<b.length;++e)b[e]==this&&b.splice(e--,1);b.length||(c.widgets=null);var f=Ab(this);ja(c,Math.max(0,c.height-f));a&&X(a,\nfunction(){var b=-f;la(c)<(a.curOp&&a.curOp.scrollTop||a.doc.scrollTop)&&rc(a,null,b);ta(a,d,\"widget\")})}};yc.prototype.changed=function(){var a=this.height,b=this.doc.cm,c=this.line;this.height=null;var d=Ab(this)-a;d&&(ja(c,c.height+d),b&&X(b,function(){b.curOp.forceUpdate=!0;la(c)<(b.curOp&&b.curOp.scrollTop||b.doc.scrollTop)&&rc(b,null,d)}))};var Fb=l.Line=function(a,b,c){this.text=a;bf(this,b);this.height=c?c(this):1};fb(Fb);Fb.prototype.lineNo=function(){return F(this)};var mg={},lg={};Gb.prototype=\n{chunkSize:function(){return this.lines.length},removeInner:function(a,b){for(var c=a,d=a+b;c<d;++c){var e=this.lines[c];this.height-=e.height;var f=e;f.parent=null;af(f);V(e,\"delete\")}this.lines.splice(a,b)},collapse:function(a){a.push.apply(a,this.lines)},insertInner:function(a,b,c){this.height+=c;this.lines=this.lines.slice(0,a).concat(b).concat(this.lines.slice(a));for(a=0;a<b.length;++a)b[a].parent=this},iterN:function(a,b,c){for(b=a+b;a<b;++a)if(c(this.lines[a]))return!0}};Hb.prototype={chunkSize:function(){return this.size},\nremoveInner:function(a,b){this.size-=b;for(var c=0;c<this.children.length;++c){var d=this.children[c],e=d.chunkSize();if(a<e){var f=Math.min(b,e-a),g=d.height;d.removeInner(a,f);this.height-=g-d.height;e==f&&(this.children.splice(c--,1),d.parent=null);if(0==(b-=f))break;a=0}else a-=e}25>this.size-b&&(1<this.children.length||!(this.children[0]instanceof Gb))&&(a=[],this.collapse(a),this.children=[new Gb(a)],this.children[0].parent=this)},collapse:function(a){for(var b=0;b<this.children.length;++b)this.children[b].collapse(a)},\ninsertInner:function(a,b,c){this.size+=b.length;this.height+=c;for(var d=0;d<this.children.length;++d){var e=this.children[d],f=e.chunkSize();if(a<=f){e.insertInner(a,b,c);if(e.lines&&50<e.lines.length){for(b=a=e.lines.length%25+25;b<e.lines.length;)c=new Gb(e.lines.slice(b,b+=25)),e.height-=c.height,this.children.splice(++d,0,c),c.parent=this;e.lines=e.lines.slice(0,a);this.maybeSpill()}break}a-=f}},maybeSpill:function(){if(!(10>=this.children.length)){var a=this;do{var b=a.children.splice(a.children.length-\n5,5),b=new Hb(b);if(a.parent){a.size-=b.size;a.height-=b.height;var c=N(a.parent.children,a);a.parent.children.splice(c+1,0,b)}else c=new Hb(a.children),c.parent=a,a.children=[c,b],a=c;b.parent=a.parent}while(10<a.children.length);a.parent.maybeSpill()}},iterN:function(a,b,c){for(var d=0;d<this.children.length;++d){var e=this.children[d],f=e.chunkSize();if(a<f){f=Math.min(b,f-a);if(e.iterN(a,f,c))return!0;if(0==(b-=f))break;a=0}else a-=f}}};var zg=0,U=l.Doc=function(a,b,c,d){if(!(this instanceof U))return new U(a,\nb,c,d);null==c&&(c=0);Hb.call(this,[new Gb([new Fb(\"\",null)])]);this.first=c;this.scrollTop=this.scrollLeft=0;this.cantEdit=!1;this.cleanGeneration=1;this.frontier=c;c=q(c,0);this.sel=na(c);this.history=new Ac(null);this.id=++zg;this.modeOption=b;this.lineSep=d;this.extend=!1;\"string\"==typeof a&&(a=this.splitLines(a));td(this,{from:c,to:c,text:a});E(this,na(c),oa)};U.prototype=pf(Hb.prototype,{constructor:U,iter:function(a,b,c){c?this.iterN(a-this.first,b-a,c):this.iterN(this.first,this.first+this.size,\na)},insert:function(a,b){for(var c=0,d=0;d<b.length;++d)c+=b[d].height;this.insertInner(a-this.first,b,c)},remove:function(a,b){this.removeInner(a-this.first,b)},getValue:function(a){var b=Bd(this,this.first,this.first+this.size);return!1===a?b:b.join(a||this.lineSeparator())},setValue:Q(function(a){var b=q(this.first,0),c=this.first+this.size-1;Wa(this,{from:b,to:q(c,w(this,c).text.length),text:this.splitLines(a),origin:\"setValue\",full:!0},!0);E(this,na(b))}),replaceRange:function(a,b,c,d){b=z(this,\nb);c=c?z(this,c):b;bb(this,a,b,c,d)},getRange:function(a,b,c){a=Ia(this,z(this,a),z(this,b));return!1===c?a:a.join(c||this.lineSeparator())},getLine:function(a){return(a=this.getLineHandle(a))&&a.text},getLineHandle:function(a){if(wb(this,a))return w(this,a)},getLineNumber:function(a){return F(a)},getLineHandleVisualStart:function(a){\"number\"==typeof a&&(a=w(this,a));return pa(a)},lineCount:function(){return this.size},firstLine:function(){return this.first},lastLine:function(){return this.first+\nthis.size-1},clipPos:function(a){return z(this,a)},getCursor:function(a){var b=this.sel.primary();return null==a||\"head\"==a?b.head:\"anchor\"==a?b.anchor:\"end\"==a||\"to\"==a||!1===a?b.to():b.from()},listSelections:function(){return this.sel.ranges},somethingSelected:function(){return this.sel.somethingSelected()},setCursor:Q(function(a,b,c){a=z(this,\"number\"==typeof a?q(a,b||0):a);E(this,na(a,null),c)}),setSelection:Q(function(a,b,c){var d=z(this,a);a=z(this,b||a);E(this,na(d,a),c)}),extendSelection:Q(function(a,\nb,c){Zb(this,z(this,a),b&&z(this,b),c)}),extendSelections:Q(function(a,b){ge(this,fe(this,a),b)}),extendSelectionsBy:Q(function(a,b){a=Wb(this.sel.ranges,a);ge(this,fe(this,a),b)}),setSelections:Q(function(a,b,c){if(a.length){for(var d=0,e=[];d<a.length;d++)e[d]=new G(z(this,a[d].anchor),z(this,a[d].head));null==b&&(b=Math.min(a.length-1,this.sel.primIndex));E(this,ga(e,b),c)}}),addSelection:Q(function(a,b,c){var d=this.sel.ranges.slice(0);d.push(new G(z(this,a),z(this,b||a)));E(this,ga(d,d.length-\n1),c)}),getSelection:function(a){for(var b=this.sel.ranges,c,d=0;d<b.length;d++){var e=Ia(this,b[d].from(),b[d].to());c=c?c.concat(e):e}return!1===a?c:c.join(a||this.lineSeparator())},getSelections:function(a){for(var b=[],c=this.sel.ranges,d=0;d<c.length;d++){var e=Ia(this,c[d].from(),c[d].to());!1!==a&&(e=e.join(a||this.lineSeparator()));b[d]=e}return b},replaceSelection:function(a,b,c){for(var d=[],e=0;e<this.sel.ranges.length;e++)d[e]=a;this.replaceSelections(d,b,c||\"+input\")},replaceSelections:Q(function(a,\nb,c){for(var d=[],e=this.sel,f=0;f<e.ranges.length;f++){var g=e.ranges[f];d[f]={from:g.from(),to:g.to(),text:this.splitLines(a[f]),origin:c}}if(f=b&&\"end\"!=b){f=[];c=a=q(this.first,0);for(e=0;e<d.length;e++){var h=d[e],g=Ne(h.from,a,c),k=Ne(La(h),a,c);a=h.to;c=k;\"around\"==b?(h=this.sel.ranges[e],h=0>t(h.head,h.anchor),f[e]=new G(h?k:g,h?g:k)):f[e]=new G(g,g)}f=new ra(f,this.sel.primIndex)}b=f;for(f=d.length-1;0<=f;f--)Wa(this,d[f]);b?he(this,b):this.cm&&Xa(this.cm)}),undo:Q(function(){qc(this,\"undo\")}),\nredo:Q(function(){qc(this,\"redo\")}),undoSelection:Q(function(){qc(this,\"undo\",!0)}),redoSelection:Q(function(){qc(this,\"redo\",!0)}),setExtending:function(a){this.extend=a},getExtending:function(){return this.extend},historySize:function(){for(var a=this.history,b=0,c=0,d=0;d<a.done.length;d++)a.done[d].ranges||++b;for(d=0;d<a.undone.length;d++)a.undone[d].ranges||++c;return{undo:b,redo:c}},clearHistory:function(){this.history=new Ac(this.history.maxGeneration)},markClean:function(){this.cleanGeneration=\nthis.changeGeneration(!0)},changeGeneration:function(a){a&&(this.history.lastOp=this.history.lastSelOp=this.history.lastOrigin=null);return this.history.generation},isClean:function(a){return this.history.generation==(a||this.cleanGeneration)},getHistory:function(){return{done:eb(this.history.done),undone:eb(this.history.undone)}},setHistory:function(a){var b=this.history=new Ac(this.history.maxGeneration);b.done=eb(a.done.slice(0),null,!0);b.undone=eb(a.undone.slice(0),null,!0)},addLineClass:Q(function(a,\nb,c){return tc(this,a,\"gutter\"==b?\"gutter\":\"class\",function(a){var d=\"text\"==b?\"textClass\":\"background\"==b?\"bgClass\":\"gutter\"==b?\"gutterClass\":\"wrapClass\";if(a[d]){if(Kb(c).test(a[d]))return!1;a[d]+=\" \"+c}else a[d]=c;return!0})}),removeLineClass:Q(function(a,b,c){return tc(this,a,\"gutter\"==b?\"gutter\":\"class\",function(a){var d=\"text\"==b?\"textClass\":\"background\"==b?\"bgClass\":\"gutter\"==b?\"gutterClass\":\"wrapClass\",f=a[d];if(f)if(null==c)a[d]=null;else{var g=f.match(Kb(c));if(!g)return!1;var h=g.index+\ng[0].length;a[d]=f.slice(0,g.index)+(g.index&&h!=f.length?\" \":\"\")+f.slice(h)||null}else return!1;return!0})}),addLineWidget:Q(function(a,b,c){return kg(this,a,b,c)}),removeLineWidget:function(a){a.clear()},markText:function(a,b,c){return db(this,z(this,a),z(this,b),c,c&&c.type||\"range\")},setBookmark:function(a,b){b={replacedWith:b&&(null==b.nodeType?b.widget:b),insertLeft:b&&b.insertLeft,clearWhenEmpty:!1,shared:b&&b.shared,handleMouseEvents:b&&b.handleMouseEvents};a=z(this,a);return db(this,a,a,\nb,\"bookmark\")},findMarksAt:function(a){a=z(this,a);var b=[],c=w(this,a.line).markedSpans;if(c)for(var d=0;d<c.length;++d){var e=c[d];(null==e.from||e.from<=a.ch)&&(null==e.to||e.to>=a.ch)&&b.push(e.marker.parent||e.marker)}return b},findMarks:function(a,b,c){a=z(this,a);b=z(this,b);var d=[],e=a.line;this.iter(a.line,b.line+1,function(f){if(f=f.markedSpans)for(var g=0;g<f.length;g++){var h=f[g];null!=h.to&&e==a.line&&a.ch>=h.to||null==h.from&&e!=a.line||null!=h.from&&e==b.line&&h.from>=b.ch||c&&!c(h.marker)||\nd.push(h.marker.parent||h.marker)}++e});return d},getAllMarks:function(){var a=[];this.iter(function(b){if(b=b.markedSpans)for(var c=0;c<b.length;++c)null!=b[c].from&&a.push(b[c].marker)});return a},posFromIndex:function(a){var b,c=this.first,d=this.lineSeparator().length;this.iter(function(e){e=e.text.length+d;if(e>a)return b=a,!0;a-=e;++c});return z(this,q(c,b))},indexFromPos:function(a){a=z(this,a);var b=a.ch;if(a.line<this.first||0>a.ch)return 0;var c=this.lineSeparator().length;this.iter(this.first,\na.line,function(a){b+=a.text.length+c});return b},copy:function(a){var b=new U(Bd(this,this.first,this.first+this.size),this.modeOption,this.first,this.lineSep);b.scrollTop=this.scrollTop;b.scrollLeft=this.scrollLeft;b.sel=this.sel;b.extend=!1;a&&(b.history.undoDepth=this.history.undoDepth,b.setHistory(this.getHistory()));return b},linkedDoc:function(a){a||(a={});var b=this.first,c=this.first+this.size;null!=a.from&&a.from>b&&(b=a.from);null!=a.to&&a.to<c&&(c=a.to);b=new U(Bd(this,b,c),a.mode||this.modeOption,\nb,this.lineSep);a.sharedHist&&(b.history=this.history);(this.linked||(this.linked=[])).push({doc:b,sharedHist:a.sharedHist});b.linked=[{doc:this,isParent:!0,sharedHist:a.sharedHist}];a=Ze(this);for(c=0;c<a.length;c++){var d=a[c],e=d.find(),f=b.clipPos(e.from),e=b.clipPos(e.to);t(f,e)&&(f=db(b,f,e,d.primary,d.primary.type),d.markers.push(f),f.parent=d)}return b},unlinkDoc:function(a){a instanceof l&&(a=a.doc);if(this.linked)for(var b=0;b<this.linked.length;++b)if(this.linked[b].doc==a){this.linked.splice(b,\n1);a.unlinkDoc(this);ig(Ze(this));break}if(a.history==this.history){var c=[a.id];Ma(a,function(a){c.push(a.id)},!0);a.history=new Ac(null);a.history.done=eb(this.history.done,c);a.history.undone=eb(this.history.undone,c)}},iterLinkedDocs:function(a){Ma(this,a)},getMode:function(){return this.mode},getEditor:function(){return this.cm},splitLines:function(a){return this.lineSep?a.split(this.lineSep):Ag(a)},lineSeparator:function(){return this.lineSep||\"\\n\"}});U.prototype.eachLine=U.prototype.iter;var Bg=\n\"iter insert remove copy getEditor constructor\".split(\" \"),Ob;for(Ob in U.prototype)U.prototype.hasOwnProperty(Ob)&&0>N(Bg,Ob)&&(l.prototype[Ob]=function(a){return function(){return a.apply(this.doc,arguments)}}(U.prototype[Ob]));fb(U);var R=l.e_preventDefault=function(a){a.preventDefault?a.preventDefault():a.returnValue=!1},Cg=l.e_stopPropagation=function(a){a.stopPropagation?a.stopPropagation():a.cancelBubble=!0},jc=l.e_stop=function(a){R(a);Cg(a)},y=l.on=function(a,b,c){a.addEventListener?a.addEventListener(b,\nc,!1):a.attachEvent?a.attachEvent(\"on\"+b,c):(a=a._handlers||(a._handlers={}),(a[b]||(a[b]=[])).push(c))},of=[],qa=l.off=function(a,b,c){if(a.removeEventListener)a.removeEventListener(b,c,!1);else if(a.detachEvent)a.detachEvent(\"on\"+b,c);else for(a=Bc(a,b,!1),b=0;b<a.length;++b)if(a[b]==c){a.splice(b,1);break}},L=l.signal=function(a,b){var c=Bc(a,b,!0);if(c.length)for(var d=Array.prototype.slice.call(arguments,2),e=0;e<c.length;++e)c[e].apply(null,d)},Ib=null,Ld=30,Je=l.Pass={toString:function(){return\"CodeMirror.Pass\"}},\noa={scroll:!1},nd={origin:\"*mouse\"},Lb={origin:\"+move\"};Ba.prototype.set=function(a,b){clearTimeout(this.id);this.id=setTimeout(b,a)};var ha=l.countColumn=function(a,b,c,d,e){null==b&&(b=a.search(/[^\\s\\u00a0]/),-1==b&&(b=a.length));d=d||0;for(e=e||0;;){var f=a.indexOf(\"\\t\",d);if(0>f||f>=b)return e+(b-d);e+=f-d;e+=c-e%c;d=f+1}},He=l.findColumn=function(a,b,c){for(var d=0,e=0;;){var f=a.indexOf(\"\\t\",d);-1==f&&(f=a.length);var g=f-d;if(f==a.length||e+g>=b)return d+Math.min(g,b-e);e+=f-d;e+=c-e%c;d=f+\n1;if(e>=b)return d}},Cc=[\"\"],gb=function(a){a.select()};vb?gb=function(a){a.selectionStart=0;a.selectionEnd=a.value.length}:B&&(gb=function(a){try{a.select()}catch(b){}});var Dg=/[\\u00df\\u0587\\u0590-\\u05f4\\u0600-\\u06ff\\u3040-\\u309f\\u30a0-\\u30ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\uac00-\\ud7af]/,qf=l.isWordChar=function(a){return/\\w/.test(a)||\"\\u0080\"<a&&(a.toUpperCase()!=a.toLowerCase()||Dg.test(a))},tg=/[\\u0300-\\u036f\\u0483-\\u0489\\u0591-\\u05bd\\u05bf\\u05c1\\u05c2\\u05c4\\u05c5\\u05c7\\u0610-\\u061a\\u064b-\\u065e\\u0670\\u06d6-\\u06dc\\u06de-\\u06e4\\u06e7\\u06e8\\u06ea-\\u06ed\\u0711\\u0730-\\u074a\\u07a6-\\u07b0\\u07eb-\\u07f3\\u0816-\\u0819\\u081b-\\u0823\\u0825-\\u0827\\u0829-\\u082d\\u0900-\\u0902\\u093c\\u0941-\\u0948\\u094d\\u0951-\\u0955\\u0962\\u0963\\u0981\\u09bc\\u09be\\u09c1-\\u09c4\\u09cd\\u09d7\\u09e2\\u09e3\\u0a01\\u0a02\\u0a3c\\u0a41\\u0a42\\u0a47\\u0a48\\u0a4b-\\u0a4d\\u0a51\\u0a70\\u0a71\\u0a75\\u0a81\\u0a82\\u0abc\\u0ac1-\\u0ac5\\u0ac7\\u0ac8\\u0acd\\u0ae2\\u0ae3\\u0b01\\u0b3c\\u0b3e\\u0b3f\\u0b41-\\u0b44\\u0b4d\\u0b56\\u0b57\\u0b62\\u0b63\\u0b82\\u0bbe\\u0bc0\\u0bcd\\u0bd7\\u0c3e-\\u0c40\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55\\u0c56\\u0c62\\u0c63\\u0cbc\\u0cbf\\u0cc2\\u0cc6\\u0ccc\\u0ccd\\u0cd5\\u0cd6\\u0ce2\\u0ce3\\u0d3e\\u0d41-\\u0d44\\u0d4d\\u0d57\\u0d62\\u0d63\\u0dca\\u0dcf\\u0dd2-\\u0dd4\\u0dd6\\u0ddf\\u0e31\\u0e34-\\u0e3a\\u0e47-\\u0e4e\\u0eb1\\u0eb4-\\u0eb9\\u0ebb\\u0ebc\\u0ec8-\\u0ecd\\u0f18\\u0f19\\u0f35\\u0f37\\u0f39\\u0f71-\\u0f7e\\u0f80-\\u0f84\\u0f86\\u0f87\\u0f90-\\u0f97\\u0f99-\\u0fbc\\u0fc6\\u102d-\\u1030\\u1032-\\u1037\\u1039\\u103a\\u103d\\u103e\\u1058\\u1059\\u105e-\\u1060\\u1071-\\u1074\\u1082\\u1085\\u1086\\u108d\\u109d\\u135f\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17b7-\\u17bd\\u17c6\\u17c9-\\u17d3\\u17dd\\u180b-\\u180d\\u18a9\\u1920-\\u1922\\u1927\\u1928\\u1932\\u1939-\\u193b\\u1a17\\u1a18\\u1a56\\u1a58-\\u1a5e\\u1a60\\u1a62\\u1a65-\\u1a6c\\u1a73-\\u1a7c\\u1a7f\\u1b00-\\u1b03\\u1b34\\u1b36-\\u1b3a\\u1b3c\\u1b42\\u1b6b-\\u1b73\\u1b80\\u1b81\\u1ba2-\\u1ba5\\u1ba8\\u1ba9\\u1c2c-\\u1c33\\u1c36\\u1c37\\u1cd0-\\u1cd2\\u1cd4-\\u1ce0\\u1ce2-\\u1ce8\\u1ced\\u1dc0-\\u1de6\\u1dfd-\\u1dff\\u200c\\u200d\\u20d0-\\u20f0\\u2cef-\\u2cf1\\u2de0-\\u2dff\\u302a-\\u302f\\u3099\\u309a\\ua66f-\\ua672\\ua67c\\ua67d\\ua6f0\\ua6f1\\ua802\\ua806\\ua80b\\ua825\\ua826\\ua8c4\\ua8e0-\\ua8f1\\ua926-\\ua92d\\ua947-\\ua951\\ua980-\\ua982\\ua9b3\\ua9b6-\\ua9b9\\ua9bc\\uaa29-\\uaa2e\\uaa31\\uaa32\\uaa35\\uaa36\\uaa43\\uaa4c\\uaab0\\uaab2-\\uaab4\\uaab7\\uaab8\\uaabe\\uaabf\\uaac1\\uabe5\\uabe8\\uabed\\udc00-\\udfff\\ufb1e\\ufe00-\\ufe0f\\ufe20-\\ufe26\\uff9e\\uff9f]/,\n$a;$a=document.createRange?function(a,b,c,d){var e=document.createRange();e.setEnd(d||a,c);e.setStart(a,b);return e}:function(a,b,c){var d=document.body.createTextRange();try{d.moveToElementText(a.parentNode)}catch(e){return d}d.collapse(!0);d.moveEnd(\"character\",c);d.moveStart(\"character\",b);return d};var ad=l.contains=function(a,b){3==b.nodeType&&(b=b.parentNode);if(a.contains)return a.contains(b);do if(11==b.nodeType&&(b=b.host),b==a)return!0;while(b=b.parentNode)};B&&11>A&&(ma=function(){try{return document.activeElement}catch(a){return document.body}});\nvar pb=l.rmClass=function(a,b){var c=a.className;if(b=Kb(b).exec(c)){var d=c.slice(b.index+b[0].length);a.className=c.slice(0,b.index)+(d?b[1]+d:\"\")}},rb=l.addClass=function(a,b){var c=a.className;Kb(b).test(c)||(a.className+=(c?\" \":\"\")+b)},Hd=!1,Vf=function(){if(B&&9>A)return!1;var a=r(\"div\");return\"draggable\"in a||\"dragDrop\"in a}(),Cd,zd,Ag=l.splitLines=3!=\"\\n\\nb\".split(/\\n/).length?function(a){for(var b=0,c=[],d=a.length;b<=d;){var e=a.indexOf(\"\\n\",b);-1==e&&(e=a.length);var f=a.slice(b,\"\\r\"==\na.charAt(e-1)?e-1:e),g=f.indexOf(\"\\r\");-1!=g?(c.push(f.slice(0,g)),b+=g+1):(c.push(f),b=e+1)}return c}:function(a){return a.split(/\\r\\n?|\\n/)},yg=window.getSelection?function(a){try{return a.selectionStart!=a.selectionEnd}catch(b){return!1}}:function(a){try{var b=a.ownerDocument.selection.createRange()}catch(c){}return b&&b.parentElement()==a?0!=b.compareEndPoints(\"StartToEnd\",b):!1},Le=function(){var a=r(\"div\");if(\"oncopy\"in a)return!0;a.setAttribute(\"oncopy\",\"return;\");return\"function\"==typeof a.oncopy}(),\nfd=null,Pa=l.keyNames={3:\"Enter\",8:\"Backspace\",9:\"Tab\",13:\"Enter\",16:\"Shift\",17:\"Ctrl\",18:\"Alt\",19:\"Pause\",20:\"CapsLock\",27:\"Esc\",32:\"Space\",33:\"PageUp\",34:\"PageDown\",35:\"End\",36:\"Home\",37:\"Left\",38:\"Up\",39:\"Right\",40:\"Down\",44:\"PrintScrn\",45:\"Insert\",46:\"Delete\",59:\";\",61:\"=\",91:\"Mod\",92:\"Mod\",93:\"Mod\",106:\"*\",107:\"=\",109:\"-\",110:\".\",111:\"/\",127:\"Delete\",173:\"-\",186:\";\",187:\"=\",188:\",\",189:\"-\",190:\".\",191:\"/\",192:\"`\",219:\"[\",220:\"\\\\\",221:\"]\",222:\"'\",63232:\"Up\",63233:\"Down\",63234:\"Left\",63235:\"Right\",\n63272:\"Delete\",63273:\"Home\",63275:\"End\",63276:\"PageUp\",63277:\"PageDown\",63302:\"Insert\"};(function(){for(var a=0;10>a;a++)Pa[a+48]=Pa[a+96]=String(a);for(a=65;90>=a;a++)Pa[a]=String.fromCharCode(a);for(a=1;12>=a;a++)Pa[a+111]=Pa[a+63235]=\"F\"+a})();var Bb,qg=function(){function a(a){return 247>=a?\"bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN\".charAt(a):\n1424<=a&&1524>=a?\"R\":1536<=a&&1773>=a?\"rrrrrrrrrrrr,rNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmm\".charAt(a-1536):1774<=a&&2220>=a?\"r\":8192<=a&&8203>=a?\"w\":8204==a?\"b\":\"L\"}function b(a,b,c){this.level=a;this.from=b;this.to=c}var c=/[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac]/,d=/[stwN]/,e=/[LRr]/,f=/[Lb1n]/,g=/[1n]/;return function(h){if(!c.test(h))return!1;\nfor(var k=h.length,m=[],l=0,q;l<k;++l)m.push(a(h.charCodeAt(l)));for(var l=0,n=\"L\";l<k;++l)q=m[l],\"m\"==q?m[l]=n:n=q;l=0;for(n=\"L\";l<k;++l)q=m[l],\"1\"==q&&\"r\"==n?m[l]=\"n\":e.test(q)&&(n=q,\"r\"==q&&(m[l]=\"R\"));l=1;for(n=m[0];l<k-1;++l)q=m[l],\"+\"==q&&\"1\"==n&&\"1\"==m[l+1]?m[l]=\"1\":\",\"!=q||n!=m[l+1]||\"1\"!=n&&\"n\"!=n||(m[l]=n),n=q;for(l=0;l<k;++l)if(q=m[l],\",\"==q)m[l]=\"N\";else if(\"%\"==q){for(n=l+1;n<k&&\"%\"==m[n];++n);var r=l&&\"!\"==m[l-1]||n<k&&\"1\"==m[n]?\"1\":\"N\";for(q=l;q<n;++q)m[q]=r;l=n-1}l=0;for(n=\"L\";l<k;++l)q=\nm[l],\"L\"==n&&\"1\"==q?m[l]=\"L\":e.test(q)&&(n=q);for(l=0;l<k;++l)if(d.test(m[l])){for(n=l+1;n<k&&d.test(m[n]);++n);q=\"L\"==(n<k?m[n]:\"L\");r=\"L\"==(l?m[l-1]:\"L\")||q?\"L\":\"R\";for(q=l;q<n;++q)m[q]=r;l=n-1}for(var n=[],v,l=0;l<k;)if(f.test(m[l])){q=l;for(++l;l<k&&f.test(m[l]);++l);n.push(new b(0,q,l))}else{var t=l,r=n.length;for(++l;l<k&&\"L\"!=m[l];++l);for(q=t;q<l;)if(g.test(m[q])){t<q&&n.splice(r,0,new b(1,t,q));t=q;for(++q;q<l&&g.test(m[q]);++q);n.splice(r,0,new b(2,t,q));t=q}else++q;t<l&&n.splice(r,0,new b(1,\nt,l))}1==n[0].level&&(v=h.match(/^\\s+/))&&(n[0].from=v[0].length,n.unshift(new b(0,0,v[0].length)));1==C(n).level&&(v=h.match(/\\s+$/))&&(C(n).to-=v[0].length,n.push(new b(0,k-v[0].length,k)));2==n[0].level&&n.unshift(new b(1,n[0].to,n[0].to));n[0].level!=C(n).level&&n.push(new b(n[0].level,k,k));return n}}();l.version=\"5.19.0\";return l});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/apl/apl.js",
    "content": "'use strict';(function(d){\"object\"==typeof exports&&\"object\"==typeof module?d(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],d):d(CodeMirror)})(function(d){d.defineMode(\"apl\",function(){var d={\".\":\"innerProduct\",\"\\\\\":\"scan\",\"/\":\"reduce\",\"\\u233f\":\"reduce1Axis\",\"\\u2340\":\"scan1Axis\",\"\\u00a8\":\"each\",\"\\u2363\":\"power\"},e={\"+\":[\"conjugate\",\"add\"],\"\\u2212\":[\"negate\",\"subtract\"],\"\\u00d7\":[\"signOf\",\"multiply\"],\"\\u00f7\":[\"reciprocal\",\"divide\"],\"\\u2308\":[\"ceiling\",\n\"greaterOf\"],\"\\u230a\":[\"floor\",\"lesserOf\"],\"\\u2223\":[\"absolute\",\"residue\"],\"\\u2373\":[\"indexGenerate\",\"indexOf\"],\"?\":[\"roll\",\"deal\"],\"\\u22c6\":[\"exponentiate\",\"toThePowerOf\"],\"\\u235f\":[\"naturalLog\",\"logToTheBase\"],\"\\u25cb\":[\"piTimes\",\"circularFuncs\"],\"!\":[\"factorial\",\"binomial\"],\"\\u2339\":[\"matrixInverse\",\"matrixDivide\"],\"<\":[null,\"lessThan\"],\"\\u2264\":[null,\"lessThanOrEqual\"],\"=\":[null,\"equals\"],\">\":[null,\"greaterThan\"],\"\\u2265\":[null,\"greaterThanOrEqual\"],\"\\u2260\":[null,\"notEqual\"],\"\\u2261\":[\"depth\",\n\"match\"],\"\\u2262\":[null,\"notMatch\"],\"\\u2208\":[\"enlist\",\"membership\"],\"\\u2377\":[null,\"find\"],\"\\u222a\":[\"unique\",\"union\"],\"\\u2229\":[null,\"intersection\"],\"\\u223c\":[\"not\",\"without\"],\"\\u2228\":[null,\"or\"],\"\\u2227\":[null,\"and\"],\"\\u2371\":[null,\"nor\"],\"\\u2372\":[null,\"nand\"],\"\\u2374\":[\"shapeOf\",\"reshape\"],\",\":[\"ravel\",\"catenate\"],\"\\u236a\":[null,\"firstAxisCatenate\"],\"\\u233d\":[\"reverse\",\"rotate\"],\"\\u2296\":[\"axis1Reverse\",\"axis1Rotate\"],\"\\u2349\":[\"transpose\",null],\"\\u2191\":[\"first\",\"take\"],\"\\u2193\":[null,\"drop\"],\n\"\\u2282\":[\"enclose\",\"partitionWithAxis\"],\"\\u2283\":[\"diclose\",\"pick\"],\"\\u2337\":[null,\"index\"],\"\\u234b\":[\"gradeUp\",null],\"\\u2352\":[\"gradeDown\",null],\"\\u22a4\":[\"encode\",null],\"\\u22a5\":[\"decode\",null],\"\\u2355\":[\"format\",\"formatByExample\"],\"\\u234e\":[\"execute\",null],\"\\u22a3\":[\"stop\",\"left\"],\"\\u22a2\":[\"pass\",\"right\"]},f=/[\\.\\/\\u233f\\u2340\\u00a8\\u2363]/,g=/\\u236c/,h=/[\\+\\u2212\\u00d7\\u00f7\\u2308\\u230a\\u2223\\u2373\\?\\u22c6\\u235f\\u25cb!\\u2339<\\u2264=>\\u2265\\u2260\\u2261\\u2262\\u2208\\u2377\\u222a\\u2229\\u223c\\u2228\\u2227\\u2371\\u2372\\u2374,\\u236a\\u233d\\u2296\\u2349\\u2191\\u2193\\u2282\\u2283\\u2337\\u234b\\u2352\\u22a4\\u22a5\\u2355\\u234e\\u22a3\\u22a2]/,\nk=/\\u2190/,l=/[\\u235d#].*$/,m=function(b){var c;c=!1;return function(a){c=a;return a===b?\"\\\\\"===c:!0}};return{startState:function(){return{prev:!1,func:!1,op:!1,string:!1,escape:!1}},token:function(b,c){var a;if(b.eatSpace())return null;a=b.next();if('\"'===a||\"'\"===a)return b.eatWhile(m(a)),b.next(),c.prev=!0,\"string\";if(/[\\[{\\(]/.test(a))return c.prev=!1,null;if(/[\\]}\\)]/.test(a))return c.prev=!0,null;if(g.test(a))return c.prev=!1,\"niladic\";if(/[\\u00af\\d]/.test(a))return c.func?(c.func=!1,c.prev=\n!1):c.prev=!0,b.eatWhile(/[\\w\\.]/),\"number\";if(f.test(a))return\"operator apl-\"+d[a];if(k.test(a))return\"apl-arrow\";if(h.test(a))return b=\"apl-\",null!=e[a]&&(b=c.prev?b+e[a][1]:b+e[a][0]),c.func=!0,c.prev=!1,\"function \"+b;if(l.test(a))return b.skipToEnd(),\"comment\";if(\"\\u2218\"===a&&\".\"===b.peek())return b.next(),\"function jot-dot\";b.eatWhile(/[\\w\\$_]/);c.prev=!0;return\"keyword\"}}});d.defineMIME(\"text/apl\",\"apl\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/asciiarmor/asciiarmor.js",
    "content": "'use strict';(function(c){\"object\"==typeof exports&&\"object\"==typeof module?c(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],c):c(CodeMirror)})(function(c){function d(a){var b=a.match(/^\\s*\\S/);a.skipToEnd();return b?\"error\":null}c.defineMode(\"asciiarmor\",function(){return{token:function(a,b){var c;if(\"top\"==b.state)return a.sol()&&(c=a.match(/^-----BEGIN (.*)?-----\\s*$/))?(b.state=\"headers\",b.type=c[1],\"tag\"):d(a);if(\"headers\"==b.state){if(a.sol()&&\na.match(/^\\w+:/))return b.state=\"header\",\"atom\";if(a=d(a))b.state=\"body\";return a}if(\"header\"==b.state)return a.skipToEnd(),b.state=\"headers\",\"string\";if(\"body\"==b.state){if(a.sol()&&(c=a.match(/^-----END (.*)?-----\\s*$/))){if(c[1]!=b.type)return\"error\";b.state=\"end\";return\"tag\"}if(a.eatWhile(/[A-Za-z0-9+\\/=]/))return null;a.next();return\"error\"}if(\"end\"==b.state)return d(a)},blankLine:function(a){\"headers\"==a.state&&(a.state=\"body\")},startState:function(){return{state:\"top\",type:null}}}});c.defineMIME(\"application/pgp\",\n\"asciiarmor\");c.defineMIME(\"application/pgp-keys\",\"asciiarmor\");c.defineMIME(\"application/pgp-signature\",\"asciiarmor\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/asn.1/asn.1.js",
    "content": "'use strict';(function(f){\"object\"==typeof exports&&\"object\"==typeof module?f(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],f):f(CodeMirror)})(function(f){function e(e){var b={};e=e.split(\" \");for(var f=0;f<e.length;++f)b[e[f]]=!0;return b}f.defineMode(\"asn.1\",function(e,b){function f(a,c){var d=a.next();if('\"'==d||\"'\"==d)return c.tokenize=n(d),c.tokenize(a,c);if(/[\\[\\]\\(\\){}:=,;]/.test(d))return g=d,\"punctuation\";if(\"-\"==d&&a.eat(\"-\"))return a.skipToEnd(),\n\"comment\";if(/\\d/.test(d))return a.eatWhile(/[\\w\\.]/),\"number\";if(l.test(d))return a.eatWhile(l),\"operator\";a.eatWhile(/[\\w\\-]/);a=a.current();return p.propertyIsEnumerable(a)?\"keyword\":q.propertyIsEnumerable(a)?\"variable cmipVerbs\":r.propertyIsEnumerable(a)?\"atom compareTypes\":t.propertyIsEnumerable(a)?\"comment status\":u.propertyIsEnumerable(a)?\"variable-3 tags\":v.propertyIsEnumerable(a)?\"builtin storage\":w.propertyIsEnumerable(a)?\"string-2 modifier\":x.propertyIsEnumerable(a)?\"atom accessTypes\":\n\"variable\"}function n(a){return function(c,d){for(var e=!1,b,f=!1;null!=(b=c.next());){if(b==a&&!e){if(b=c.peek())b=b.toLowerCase(),\"b\"!=b&&\"h\"!=b&&\"o\"!=b||c.next();f=!0;break}e=!e&&\"\\\\\"==b}if(f||!e&&!y)d.tokenize=null;return\"string\"}}function m(a,c,d,b,e){this.indented=a;this.column=c;this.type=d;this.align=b;this.prev=e}function k(a,c,d){var b=a.indented;a.context&&\"statement\"==a.context.type&&(b=a.context.indented);return a.context=new m(b,c,d,null,a.context)}function h(a){var c=a.context.type;\nif(\")\"==c||\"]\"==c||\"}\"==c)a.indented=a.context.indented;return a.context=a.context.prev}var z=e.indentUnit,p=b.keywords||{},q=b.cmipVerbs||{},r=b.compareTypes||{},t=b.status||{},u=b.tags||{},v=b.storage||{},w=b.modifier||{},x=b.accessTypes||{},y=b.multiLineStrings,A=!1!==b.indentStatements,l=/[\\|\\^]/,g;return{startState:function(a){return{tokenize:null,context:new m((a||0)-z,0,\"top\",!1),indented:0,startOfLine:!0}},token:function(a,c){var d=c.context;a.sol()&&(null==d.align&&(d.align=!1),c.indented=\na.indentation(),c.startOfLine=!0);if(a.eatSpace())return null;g=null;var b=(c.tokenize||f)(a,c);if(\"comment\"==b)return b;null==d.align&&(d.align=!0);if(\";\"!=g&&\":\"!=g&&\",\"!=g||\"statement\"!=d.type)if(\"{\"==g)k(c,a.column(),\"}\");else if(\"[\"==g)k(c,a.column(),\"]\");else if(\"(\"==g)k(c,a.column(),\")\");else if(\"}\"==g){for(;\"statement\"==d.type;)d=h(c);for(\"}\"==d.type&&(d=h(c));\"statement\"==d.type;)d=h(c)}else g==d.type?h(c):A&&((\"}\"==d.type||\"top\"==d.type)&&\";\"!=g||\"statement\"==d.type&&\"newstatement\"==g)&&\nk(c,a.column(),\"statement\");else h(c);c.startOfLine=!1;return b},electricChars:\"{}\",lineComment:\"--\",fold:\"brace\"}});f.defineMIME(\"text/x-ttcn-asn\",{name:\"asn.1\",keywords:e(\"DEFINITIONS OBJECTS IF DERIVED INFORMATION ACTION REPLY ANY NAMED CHARACTERIZED BEHAVIOUR REGISTERED WITH AS IDENTIFIED CONSTRAINED BY PRESENT BEGIN IMPORTS FROM UNITS SYNTAX MIN-ACCESS MAX-ACCESS MINACCESS MAXACCESS REVISION STATUS DESCRIPTION SEQUENCE SET COMPONENTS OF CHOICE DistinguishedName ENUMERATED SIZE MODULE END INDEX AUGMENTS EXTENSIBILITY IMPLIED EXPORTS\"),\ncmipVerbs:e(\"ACTIONS ADD GET NOTIFICATIONS REPLACE REMOVE\"),compareTypes:e(\"OPTIONAL DEFAULT MANAGED MODULE-TYPE MODULE_IDENTITY MODULE-COMPLIANCE OBJECT-TYPE OBJECT-IDENTITY OBJECT-COMPLIANCE MODE CONFIRMED CONDITIONAL SUBORDINATE SUPERIOR CLASS TRUE FALSE NULL TEXTUAL-CONVENTION\"),status:e(\"current deprecated mandatory obsolete\"),tags:e(\"APPLICATION AUTOMATIC EXPLICIT IMPLICIT PRIVATE TAGS UNIVERSAL\"),storage:e(\"BOOLEAN INTEGER OBJECT IDENTIFIER BIT OCTET STRING UTCTime InterfaceIndex IANAifType CMIP-Attribute REAL PACKAGE PACKAGES IpAddress PhysAddress NetworkAddress BITS BMPString TimeStamp TimeTicks TruthValue RowStatus DisplayString GeneralString GraphicString IA5String NumericString PrintableString SnmpAdminAtring TeletexString UTF8String VideotexString VisibleString StringStore ISO646String T61String UniversalString Unsigned32 Integer32 Gauge Gauge32 Counter Counter32 Counter64\"),\nmodifier:e(\"ATTRIBUTE ATTRIBUTES MANDATORY-GROUP MANDATORY-GROUPS GROUP GROUPS ELEMENTS EQUALITY ORDERING SUBSTRINGS DEFINED\"),accessTypes:e(\"not-accessible accessible-for-notify read-only read-create read-write\"),multiLineStrings:!0})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/asterisk/asterisk.js",
    "content": "'use strict';(function(c){\"object\"==typeof exports&&\"object\"==typeof module?c(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],c):c(CodeMirror)})(function(c){c.defineMode(\"asterisk\",function(){function c(a,b){var d,c=a.next();if(\";\"==c)return a.skipToEnd(),\"comment\";if(\"[\"==c)return a.skipTo(\"]\"),a.eat(\"]\"),\"header\";if('\"'==c)return a.skipTo('\"'),\"string\";if(\"'\"==c)return a.skipTo(\"'\"),\"string-2\";if(\"#\"==c&&(a.eatWhile(/\\w/),d=a.current(),-1!==\ne.indexOf(d)))return a.skipToEnd(),\"strong\";if(\"$\"==c&&\"{\"==a.peek())return a.skipTo(\"}\"),a.eat(\"}\"),\"variable-3\";a.eatWhile(/\\w/);d=a.current();if(-1!==f.indexOf(d)){b.extenStart=!0;switch(d){case \"same\":b.extenSame=!0;break;case \"include\":case \"switch\":case \"ignorepat\":b.extenInclude=!0}return\"atom\"}}var f=[\"exten\",\"same\",\"include\",\"ignorepat\",\"switch\"],e=[\"#include\",\"#exec\"],g=\"addqueuemember adsiprog aelsub agentlogin agentmonitoroutgoing agi alarmreceiver amd answer authenticate background backgrounddetect bridge busy callcompletioncancel callcompletionrequest celgenuserevent changemonitor chanisavail channelredirect chanspy clearhash confbridge congestion continuewhile controlplayback dahdiacceptr2call dahdibarge dahdiras dahdiscan dahdisendcallreroutingfacility dahdisendkeypadfacility datetime dbdel dbdeltree deadagi dial dictate directory disa dumpchan eagi echo endwhile exec execif execiftime exitwhile extenspy externalivr festival flash followme forkcdr getcpeid gosub gosubif goto gotoif gotoiftime hangup iax2provision ices importvar incomplete ivrdemo jabberjoin jabberleave jabbersend jabbersendgroup jabberstatus jack log macro macroexclusive macroexit macroif mailboxexists meetme meetmeadmin meetmechanneladmin meetmecount milliwatt minivmaccmess minivmdelete minivmgreet minivmmwi minivmnotify minivmrecord mixmonitor monitor morsecode mp3player mset musiconhold nbscat nocdr noop odbc odbc odbcfinish originate ospauth ospfinish osplookup ospnext page park parkandannounce parkedcall pausemonitor pausequeuemember pickup pickupchan playback playtones privacymanager proceeding progress queue queuelog raiseexception read readexten readfile receivefax receivefax receivefax record removequeuemember resetcdr retrydial return ringing sayalpha saycountedadj saycountednoun saycountpl saydigits saynumber sayphonetic sayunixtime senddtmf sendfax sendfax sendfax sendimage sendtext sendurl set setamaflags setcallerpres setmusiconhold sipaddheader sipdtmfmode sipremoveheader skel slastation slatrunk sms softhangup speechactivategrammar speechbackground speechcreate speechdeactivategrammar speechdestroy speechloadgrammar speechprocessingsound speechstart speechunloadgrammar stackpop startmusiconhold stopmixmonitor stopmonitor stopmusiconhold stopplaytones system testclient testserver transfer tryexec trysystem unpausemonitor unpausequeuemember userevent verbose vmauthenticate vmsayname voicemail voicemailmain wait waitexten waitfornoise waitforring waitforsilence waitmusiconhold waituntil while zapateller\".split(\" \");\nreturn{startState:function(){return{extenStart:!1,extenSame:!1,extenInclude:!1,extenExten:!1,extenPriority:!1,extenApplication:!1}},token:function(a,b){var d;if(a.eatSpace())return null;if(b.extenStart){a.eatWhile(/[^\\s]/);d=a.current();if(/^=>?$/.test(d))return b.extenExten=!0,b.extenStart=!1,\"strong\";b.extenStart=!1;a.skipToEnd();return\"error\"}if(b.extenExten)return b.extenExten=!1,b.extenPriority=!0,a.eatWhile(/[^,]/),b.extenInclude&&(a.skipToEnd(),b.extenPriority=!1,b.extenInclude=!1),b.extenSame&&\n(b.extenPriority=!1,b.extenSame=!1,b.extenApplication=!0),\"tag\";if(b.extenPriority){b.extenPriority=!1;b.extenApplication=!0;a.next();if(b.extenSame)return null;a.eatWhile(/[^,]/);return\"number\"}if(b.extenApplication){a.eatWhile(/,/);d=a.current();if(\",\"===d)return null;a.eatWhile(/\\w/);d=a.current().toLowerCase();b.extenApplication=!1;if(-1!==g.indexOf(d))return\"def strong\"}else return c(a,b);return null}}});c.defineMIME(\"text/x-asterisk\",\"asterisk\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/brainfuck/brainfuck.js",
    "content": "'use strict';(function(a){\"object\"==typeof exports&&\"object\"==typeof module?a(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],a):a(CodeMirror)})(function(a){var d=\"><+-.,[]\".split(\"\");a.defineMode(\"brainfuck\",function(){return{startState:function(){return{commentLine:!1,left:0,right:0,commentLoop:!1}},token:function(a,c){if(a.eatSpace())return null;a.sol()&&(c.commentLine=!1);var b=a.next().toString();if(-1!==d.indexOf(b)){if(!0===c.commentLine)return a.eol()&&\n(c.commentLine=!1),\"comment\";if(\"]\"===b||\"[\"===b)return\"[\"===b?c.left++:c.right++,\"bracket\";if(\"+\"===b||\"-\"===b)return\"keyword\";if(\"<\"===b||\">\"===b)return\"atom\";if(\".\"===b||\",\"===b)return\"def\"}else return c.commentLine=!0,a.eol()&&(c.commentLine=!1),\"comment\";a.eol()&&(c.commentLine=!1)}}});a.defineMIME(\"text/x-brainfuck\",\"brainfuck\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/clike/clike.js",
    "content": "'use strict';(function(q){\"object\"==typeof exports&&\"object\"==typeof module?q(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],q):q(CodeMirror)})(function(q){function D(a,b,e,c,g,m){this.indented=a;this.column=b;this.type=e;this.info=c;this.align=g;this.prev=m}function z(a,b,c,r){var e=a.indented;a.context&&\"statement\"!=a.context.type&&\"statement\"!=c&&(e=a.context.indented);return a.context=new D(e,b,c,r,null,a.context)}function x(a){var b=a.context.type;\nif(\")\"==b||\"]\"==b||\"}\"==b)a.indented=a.context.indented;return a.context=a.context.prev}function H(a,b,c){if(\"variable\"==b.prevToken||\"variable-3\"==b.prevToken||/\\S(?:[^- ]>|[*\\]])\\s*$|\\*$/.test(a.string.slice(0,c))||b.typeAtEndOfLine&&a.column()==a.indentation())return!0}function I(a){for(;;){if(!a||\"top\"==a.type)return!0;if(\"}\"==a.type&&\"namespace\"!=a.prev.info)return!1;a=a.prev}}function c(a){var b={};a=a.split(\" \");for(var c=0;c<a.length;++c)b[a[c]]=!0;return b}function t(a,b){return\"function\"===\ntypeof a?a(b):a.propertyIsEnumerable(b)}function n(a,b){if(!b.startOfLine)return!1;for(var c,r=null;c=a.peek();){if(\"\\\\\"==c&&a.match(/^.$/)){r=n;break}else if(\"/\"==c&&a.match(/^\\/[\\/\\*]/,!1))break;a.next()}b.tokenize=r;return\"meta\"}function A(a,b){return\"variable-3\"==b.prevToken?\"variable-3\":!1}function h(a){a.eatWhile(/[\\w\\.']/);return\"number\"}function u(a,b){a.backUp(1);if(a.match(/(R|u8R|uR|UR|LR)/)){var c=a.match(/\"([^\\s\\\\()]{0,16})\\(/);if(!c)return!1;b.cpp11RawStringDelim=c[1];b.tokenize=B;return B(a,\nb)}if(a.match(/(u8|u|U|L)/))return a.match(/[\"']/,!1)?\"string\":!1;a.next();return!1}function y(a,b){for(var c;null!=(c=a.next());)if('\"'==c&&!a.eat('\"')){b.tokenize=null;break}return\"string\"}function B(a,b){var c=b.cpp11RawStringDelim.replace(/[^\\w\\s]/g,\"\\\\$&\");a.match(new RegExp(\".*?\\\\)\"+c+'\"'))?b.tokenize=null:a.skipToEnd();return\"string\"}function k(a,b){function c(a){if(a)for(var b in a)a.hasOwnProperty(b)&&r.push(b)}\"string\"==typeof a&&(a=[a]);var r=[];c(b.keywords);c(b.types);c(b.builtin);c(b.atoms);\nr.length&&(b.helperType=a[0],q.registerHelper(\"hintWords\",a[0],r));for(var g=0;g<a.length;++g)q.defineMIME(a[g],b)}function E(a,b){for(var c=!1;!a.eol();){if(!c&&a.match('\"\"\"')){b.tokenize=null;break}c=\"\\\\\"==a.next()&&!c}return\"string\"}function F(a){return function(b,c){for(var e=!1,g,m=!1;!b.eol();){if(!a&&!e&&b.match('\"')){m=!0;break}if(a&&b.match('\"\"\"')){m=!0;break}g=b.next();!e&&\"$\"==g&&b.match(\"{\")&&b.skipTo(\"}\");e=!e&&\"\\\\\"==g&&!a}if(m||!a)c.tokenize=null;return\"string\"}}function C(a){return function(b,\nc){for(var e=!1,g,m=!1;!b.eol();){if(!e&&b.match('\"')&&(\"single\"==a||b.match('\"\"'))){m=!0;break}if(!e&&b.match(\"``\")){v=C(a);m=!0;break}g=b.next();e=\"single\"==a&&!e&&\"\\\\\"==g}m&&(c.tokenize=null);return\"string\"}}q.defineMode(\"clike\",function(a,b){function c(a,b){var c=a.next();if(w[c]){var p=w[c](a,b);if(!1!==p)return p}if('\"'==c||\"'\"==c)return b.tokenize=k(c),b.tokenize(a,b);if(L.test(c))return l=c,null;if(M.test(c)){a.backUp(1);if(a.match(N))return\"number\";a.next()}if(\"/\"==c){if(a.eat(\"*\"))return b.tokenize=\ng,g(a,b);if(a.eat(\"/\"))return a.skipToEnd(),\"comment\"}if(J.test(c)){for(;!a.match(/^\\/[\\/*]/,!1)&&a.eat(J););return\"operator\"}a.eatWhile(/[\\w\\$_\\xa1-\\uffff]/);if(K)for(;a.match(K);)a.eatWhile(/[\\w\\$_\\xa1-\\uffff]/);a=a.current();return t(v,a)?(t(y,a)&&(l=\"newstatement\"),t(C,a)&&(G=!0),\"keyword\"):t(A,a)?\"variable-3\":t(B,a)?(t(y,a)&&(l=\"newstatement\"),\"builtin\"):t(E,a)?\"atom\":\"variable\"}function k(a){return function(b,c){for(var d=!1,p,f=!1;null!=(p=b.next());){if(p==a&&!d){f=!0;break}d=!d&&\"\\\\\"==p}if(f||\n!d&&!F)c.tokenize=null;return\"string\"}}function g(a,b){for(var c=!1,p;p=a.next();){if(\"/\"==p&&c){b.tokenize=null;break}c=\"*\"==p}return\"comment\"}function m(a,c){b.typeFirstDefinitions&&a.eol()&&I(c.context)&&(c.typeAtEndOfLine=H(a,c,a.pos))}var h=a.indentUnit,n=b.statementIndentUnit||h,u=b.dontAlignCalls,v=b.keywords||{},A=b.types||{},B=b.builtin||{},y=b.blockKeywords||{},C=b.defKeywords||{},E=b.atoms||{},w=b.hooks||{},F=b.multiLineStrings,O=!1!==b.indentStatements,K=b.namespaceSeparator,L=b.isPunctuationChar||\n/[\\[\\]{}\\(\\),;\\:\\.]/,M=b.numberStart||/[\\d\\.]/,N=b.number||/^(?:0x[a-f\\d]+|0b[01]+|(?:\\d+\\.?\\d*|\\.\\d+)(?:e[-+]?\\d+)?)(u|ll?|l|f)?/i,J=b.isOperatorChar||/[+\\-*&%=<>!?|\\/]/,P=b.endStatement||/^[;:,]$/,l,G;return{startState:function(a){return{tokenize:null,context:new D((a||0)-h,0,\"top\",null,!1),indented:0,startOfLine:!0,prevToken:null}},token:function(a,f){var d=f.context;a.sol()&&(null==d.align&&(d.align=!1),f.indented=a.indentation(),f.startOfLine=!0);if(a.eatSpace())return m(a,f),null;l=G=null;var e=\n(f.tokenize||c)(a,f);if(\"comment\"==e||\"meta\"==e)return e;null==d.align&&(d.align=!0);if(P.test(l))for(;\"statement\"==f.context.type;)x(f);else if(\"{\"==l)z(f,a.column(),\"}\");else if(\"[\"==l)z(f,a.column(),\"]\");else if(\"(\"==l)z(f,a.column(),\")\");else if(\"}\"==l){for(;\"statement\"==d.type;)d=x(f);for(\"}\"==d.type&&(d=x(f));\"statement\"==d.type;)d=x(f)}else l==d.type?x(f):O&&((\"}\"==d.type||\"top\"==d.type)&&\";\"!=l||\"statement\"==d.type&&\"newstatement\"==l)&&z(f,a.column(),\"statement\",a.current());\"variable\"==e&&\n(\"def\"==f.prevToken||b.typeFirstDefinitions&&H(a,f,a.start)&&I(f.context)&&a.match(/^\\s*\\(/,!1))&&(e=\"def\");w.token&&(d=w.token(a,f,e),void 0!==d&&(e=d));\"def\"==e&&!1===b.styleDefs&&(e=\"variable\");f.startOfLine=!1;f.prevToken=G?\"def\":e||l;m(a,f);return e},indent:function(a,e){if(a.tokenize!=c&&null!=a.tokenize||a.typeAtEndOfLine)return q.Pass;var d=a.context,f=e&&e.charAt(0);\"statement\"==d.type&&\"}\"==f&&(d=d.prev);if(b.dontIndentStatements)for(;\"statement\"==d.type&&b.dontIndentStatements.test(d.info);)d=\nd.prev;if(w.indent&&(a=w.indent(a,d,e),\"number\"==typeof a))return a;a=f==d.type;var g=d.prev&&\"switch\"==d.prev.info;if(b.allmanIndentation&&/[{(]/.test(f)){for(;\"top\"!=d.type&&\"}\"!=d.type;)d=d.prev;return d.indented}return\"statement\"==d.type?d.indented+(\"{\"==f?0:n):!d.align||u&&\")\"==d.type?\")\"!=d.type||a?d.indented+(a?0:h)+(a||!g||/^(?:case|default)\\b/.test(e)?0:h):d.indented+n:d.column+(a?0:1)},electricInput:!1!==b.indentSwitch?/^\\s*(?:case .*?:|default:|\\{\\}?|\\})$/:/^\\s*[{}]$/,blockCommentStart:\"/*\",\nblockCommentEnd:\"*/\",lineComment:\"//\",fold:\"brace\"}});k([\"text/x-csrc\",\"text/x-c\",\"text/x-chdr\"],{name:\"clike\",keywords:c(\"auto if break case register continue return default do sizeof static else struct switch extern typedef union for goto while enum const volatile\"),types:c(\"int long char short double float unsigned signed void size_t ptrdiff_t bool _Complex _Bool float_t double_t intptr_t intmax_t int8_t int16_t int32_t int64_t uintptr_t uintmax_t uint8_t uint16_t uint32_t uint64_t\"),blockKeywords:c(\"case do else for if switch while struct\"),\ndefKeywords:c(\"struct\"),typeFirstDefinitions:!0,atoms:c(\"null true false\"),hooks:{\"#\":n,\"*\":A},modeProps:{fold:[\"brace\",\"include\"]}});k([\"text/x-c++src\",\"text/x-c++hdr\"],{name:\"clike\",keywords:c(\"auto if break case register continue return default do sizeof static else struct switch extern typedef union for goto while enum const volatile asm dynamic_cast namespace reinterpret_cast try explicit new static_cast typeid catch operator template typename class friend private this using const_cast inline public throw virtual delete mutable protected alignas alignof constexpr decltype nullptr noexcept thread_local final static_assert override\"),\ntypes:c(\"int long char short double float unsigned signed void size_t ptrdiff_t bool wchar_t\"),blockKeywords:c(\"catch class do else finally for if struct switch try while\"),defKeywords:c(\"class namespace struct enum union\"),typeFirstDefinitions:!0,atoms:c(\"true false null\"),dontIndentStatements:/^template$/,hooks:{\"#\":n,\"*\":A,u:u,U:u,L:u,R:u,0:h,1:h,2:h,3:h,4:h,5:h,6:h,7:h,8:h,9:h,token:function(a,b,c){if(b=\"variable\"==c&&\"(\"==a.peek()&&(\";\"==b.prevToken||null==b.prevToken||\"}\"==b.prevToken))a=a.current(),\nb=(a=/(\\w+)::(\\w+)$/.exec(a))&&a[1]==a[2];if(b)return\"def\"}},namespaceSeparator:\"::\",modeProps:{fold:[\"brace\",\"include\"]}});k(\"text/x-java\",{name:\"clike\",keywords:c(\"abstract assert break case catch class const continue default do else enum extends final finally float for goto if implements import instanceof interface native new package private protected public return static strictfp super switch synchronized this throw throws transient try volatile while\"),types:c(\"byte short int long float double boolean char void Boolean Byte Character Double Float Integer Long Number Object Short String StringBuffer StringBuilder Void\"),\nblockKeywords:c(\"catch class do else finally for if switch try while\"),defKeywords:c(\"class interface package enum\"),typeFirstDefinitions:!0,atoms:c(\"true false null\"),endStatement:/^[;:]$/,number:/^(?:0x[a-f\\d_]+|0b[01_]+|(?:[\\d_]+\\.?\\d*|\\.\\d+)(?:e[-+]?[\\d_]+)?)(u|ll?|l|f)?/i,hooks:{\"@\":function(a){a.eatWhile(/[\\w\\$_]/);return\"meta\"}},modeProps:{fold:[\"brace\",\"import\"]}});k(\"text/x-csharp\",{name:\"clike\",keywords:c(\"abstract as async await base break case catch checked class const continue default delegate do else enum event explicit extern finally fixed for foreach goto if implicit in interface internal is lock namespace new operator out override params private protected public readonly ref return sealed sizeof stackalloc static struct switch this throw try typeof unchecked unsafe using virtual void volatile while add alias ascending descending dynamic from get global group into join let orderby partial remove select set value var yield\"),\ntypes:c(\"Action Boolean Byte Char DateTime DateTimeOffset Decimal Double Func Guid Int16 Int32 Int64 Object SByte Single String Task TimeSpan UInt16 UInt32 UInt64 bool byte char decimal double short int long object sbyte float string ushort uint ulong\"),blockKeywords:c(\"catch class do else finally for foreach if struct switch try while\"),defKeywords:c(\"class interface namespace struct var\"),typeFirstDefinitions:!0,atoms:c(\"true false null\"),hooks:{\"@\":function(a,b){if(a.eat('\"'))return b.tokenize=\ny,y(a,b);a.eatWhile(/[\\w\\$_]/);return\"meta\"}}});k(\"text/x-scala\",{name:\"clike\",keywords:c(\"abstract case catch class def do else extends final finally for forSome if implicit import lazy match new null object override package private protected return sealed super this throw trait try type val var while with yield _ : = => <- <: <% >: # @ assert assume require print println printf readLine readBoolean readByte readShort readChar readInt readLong readFloat readDouble :: #:: \"),types:c(\"AnyVal App Application Array BufferedIterator BigDecimal BigInt Char Console Either Enumeration Equiv Error Exception Fractional Function IndexedSeq Int Integral Iterable Iterator List Map Numeric Nil NotNull Option Ordered Ordering PartialFunction PartialOrdering Product Proxy Range Responder Seq Serializable Set Specializable Stream StringBuilder StringContext Symbol Throwable Traversable TraversableOnce Tuple Unit Vector Boolean Byte Character CharSequence Class ClassLoader Cloneable Comparable Compiler Double Exception Float Integer Long Math Number Object Package Pair Process Runtime Runnable SecurityManager Short StackTraceElement StrictMath String StringBuffer System Thread ThreadGroup ThreadLocal Throwable Triple Void\"),\nmultiLineStrings:!0,blockKeywords:c(\"catch class do else finally for forSome if match switch try while\"),defKeywords:c(\"class def object package trait type val var\"),atoms:c(\"true false null\"),indentStatements:!1,indentSwitch:!1,hooks:{\"@\":function(a){a.eatWhile(/[\\w\\$_]/);return\"meta\"},'\"':function(a,b){if(!a.match('\"\"'))return!1;b.tokenize=E;return b.tokenize(a,b)},\"'\":function(a){a.eatWhile(/[\\w\\$_\\xa1-\\uffff]/);return\"atom\"},\"=\":function(a,b){var c=b.context;return\"}\"==c.type&&c.align&&a.eat(\">\")?\n(b.context=new D(c.indented,c.column,c.type,c.info,null,c.prev),\"operator\"):!1}},modeProps:{closeBrackets:{triples:'\"'}}});k(\"text/x-kotlin\",{name:\"clike\",keywords:c(\"package as typealias class interface this super val var fun for is in This throw return break continue object if else while do try when !in !is as? file import where by get set abstract enum open inner override private public internal protected catch finally out final vararg reified dynamic companion constructor init sealed field property receiver param sparam lateinit data inline noinline tailrec external annotation crossinline const operator infix\"),\ntypes:c(\"Boolean Byte Character CharSequence Class ClassLoader Cloneable Comparable Compiler Double Exception Float Integer Long Math Number Object Package Pair Process Runtime Runnable SecurityManager Short StackTraceElement StrictMath String StringBuffer System Thread ThreadGroup ThreadLocal Throwable Triple Void\"),intendSwitch:!1,indentStatements:!1,multiLineStrings:!0,blockKeywords:c(\"catch class do else finally for if where try while enum\"),defKeywords:c(\"class val var object package interface fun\"),\natoms:c(\"true false null this\"),hooks:{'\"':function(a,b){b.tokenize=F(a.match('\"\"'));return b.tokenize(a,b)}},modeProps:{closeBrackets:{triples:'\"'}}});k([\"x-shader/x-vertex\",\"x-shader/x-fragment\"],{name:\"clike\",keywords:c(\"sampler1D sampler2D sampler3D samplerCube sampler1DShadow sampler2DShadow const attribute uniform varying break continue discard return for while do if else struct in out inout\"),types:c(\"float int bool void vec2 vec3 vec4 ivec2 ivec3 ivec4 bvec2 bvec3 bvec4 mat2 mat3 mat4\"),blockKeywords:c(\"for while do if else struct\"),\nbuiltin:c(\"radians degrees sin cos tan asin acos atan pow exp log exp2 sqrt inversesqrt abs sign floor ceil fract mod min max clamp mix step smoothstep length distance dot cross normalize ftransform faceforward reflect refract matrixCompMult lessThan lessThanEqual greaterThan greaterThanEqual equal notEqual any all not texture1D texture1DProj texture1DLod texture1DProjLod texture2D texture2DProj texture2DLod texture2DProjLod texture3D texture3DProj texture3DLod texture3DProjLod textureCube textureCubeLod shadow1D shadow2D shadow1DProj shadow2DProj shadow1DLod shadow2DLod shadow1DProjLod shadow2DProjLod dFdx dFdy fwidth noise1 noise2 noise3 noise4\"),\natoms:c(\"true false gl_FragColor gl_SecondaryColor gl_Normal gl_Vertex gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 gl_FogCoord gl_PointCoord gl_Position gl_PointSize gl_ClipVertex gl_FrontColor gl_BackColor gl_FrontSecondaryColor gl_BackSecondaryColor gl_TexCoord gl_FogFragCoord gl_FragCoord gl_FrontFacing gl_FragData gl_FragDepth gl_ModelViewMatrix gl_ProjectionMatrix gl_ModelViewProjectionMatrix gl_TextureMatrix gl_NormalMatrix gl_ModelViewMatrixInverse gl_ProjectionMatrixInverse gl_ModelViewProjectionMatrixInverse gl_TexureMatrixTranspose gl_ModelViewMatrixInverseTranspose gl_ProjectionMatrixInverseTranspose gl_ModelViewProjectionMatrixInverseTranspose gl_TextureMatrixInverseTranspose gl_NormalScale gl_DepthRange gl_ClipPlane gl_Point gl_FrontMaterial gl_BackMaterial gl_LightSource gl_LightModel gl_FrontLightModelProduct gl_BackLightModelProduct gl_TextureColor gl_EyePlaneS gl_EyePlaneT gl_EyePlaneR gl_EyePlaneQ gl_FogParameters gl_MaxLights gl_MaxClipPlanes gl_MaxTextureUnits gl_MaxTextureCoords gl_MaxVertexAttribs gl_MaxVertexUniformComponents gl_MaxVaryingFloats gl_MaxVertexTextureImageUnits gl_MaxTextureImageUnits gl_MaxFragmentUniformComponents gl_MaxCombineTextureImageUnits gl_MaxDrawBuffers\"),\nindentSwitch:!1,hooks:{\"#\":n},modeProps:{fold:[\"brace\",\"include\"]}});k(\"text/x-nesc\",{name:\"clike\",keywords:c(\"auto if break case register continue return default do sizeof static else struct switch extern typedef union for goto while enum const volatileas atomic async call command component components configuration event generic implementation includes interface module new norace nx_struct nx_union post provides signal task uses abstract extends\"),types:c(\"int long char short double float unsigned signed void size_t ptrdiff_t\"),\nblockKeywords:c(\"case do else for if switch while struct\"),atoms:c(\"null true false\"),hooks:{\"#\":n},modeProps:{fold:[\"brace\",\"include\"]}});k(\"text/x-objectivec\",{name:\"clike\",keywords:c(\"auto if break case register continue return default do sizeof static else struct switch extern typedef union for goto while enum const volatileinline restrict _Bool _Complex _Imaginary BOOL Class bycopy byref id IMP in inout nil oneway out Protocol SEL self super atomic nonatomic retain copy readwrite readonly\"),\ntypes:c(\"int long char short double float unsigned signed void size_t ptrdiff_t\"),atoms:c(\"YES NO NULL NILL ON OFF true false\"),hooks:{\"@\":function(a){a.eatWhile(/[\\w\\$]/);return\"keyword\"},\"#\":n,indent:function(a,b,c){if(\"statement\"==b.type&&/^@\\w/.test(c))return b.indented}},modeProps:{fold:\"brace\"}});k(\"text/x-squirrel\",{name:\"clike\",keywords:c(\"base break clone continue const default delete enum extends function in class foreach local resume return this throw typeof yield constructor instanceof static\"),\ntypes:c(\"int long char short double float unsigned signed void size_t ptrdiff_t\"),blockKeywords:c(\"case catch class else for foreach if switch try while\"),defKeywords:c(\"function local class\"),typeFirstDefinitions:!0,atoms:c(\"true false null\"),hooks:{\"#\":n},modeProps:{fold:[\"brace\",\"include\"]}});var v=null;k(\"text/x-ceylon\",{name:\"clike\",keywords:c(\"abstracts alias assembly assert assign break case catch class continue dynamic else exists extends finally for function given if import in interface is let module new nonempty object of out outer package return satisfies super switch then this throw try value void while\"),\ntypes:function(a){a=a.charAt(0);return a===a.toUpperCase()&&a!==a.toLowerCase()},blockKeywords:c(\"case catch class dynamic else finally for function if interface module new object switch try while\"),defKeywords:c(\"class dynamic function interface module object package value\"),builtin:c(\"abstract actual aliased annotation by default deprecated doc final formal late license native optional sealed see serializable shared suppressWarnings tagged throws variable\"),isPunctuationChar:/[\\[\\]{}\\(\\),;\\:\\.`]/,\nisOperatorChar:/[+\\-*&%=<>!?|^~:\\/]/,numberStart:/[\\d#$]/,number:/^(?:#[\\da-fA-F_]+|\\$[01_]+|[\\d_]+[kMGTPmunpf]?|[\\d_]+\\.[\\d_]+(?:[eE][-+]?\\d+|[kMGTPmunpf]|)|)/i,multiLineStrings:!0,typeFirstDefinitions:!0,atoms:c(\"true false null larger smaller equal empty finished\"),indentSwitch:!1,styleDefs:!1,hooks:{\"@\":function(a){a.eatWhile(/[\\w\\$_]/);return\"meta\"},'\"':function(a,b){b.tokenize=C(a.match('\"\"')?\"triple\":\"single\");return b.tokenize(a,b)},\"`\":function(a,b){if(!v||!a.match(\"`\"))return!1;b.tokenize=\nv;v=null;return b.tokenize(a,b)},\"'\":function(a){a.eatWhile(/[\\w\\$_\\xa1-\\uffff]/);return\"atom\"},token:function(a,b,c){if((\"variable\"==c||\"variable-3\"==c)&&\".\"==b.prevToken)return\"variable-2\"}},modeProps:{fold:[\"brace\",\"import\"],closeBrackets:{triples:'\"'}}})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/clojure/clojure.js",
    "content": "'use strict';(function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],e):e(CodeMirror)})(function(e){e.defineMode(\"clojure\",function(e){function f(a){var c={};a=a.split(\" \");for(var b=0;b<a.length;++b)c[a[b]]=!0;return c}function h(a,c,b){this.indent=a;this.type=c;this.prev=b}var q=e.indentUnit||2,r=e.indentUnit||2,k=f(\"true false nil\"),l=f(\"defn defn- def def- defonce defmulti defmethod defmacro defstruct deftype defprotocol defrecord defproject deftest slice defalias defhinted defmacro- defn-memo defnk defnk defonce- defunbound defunbound- defvar defvar- let letfn do case cond condp for loop recur when when-not when-let when-first if if-let if-not . .. -> ->> doto and or dosync doseq dotimes dorun doall load import unimport ns in-ns refer try catch finally throw with-open with-local-vars binding gen-class gen-and-load-class gen-and-save-class handler-case handle\"),\nm=f(\"* *' *1 *2 *3 *agent* *allow-unresolved-vars* *assert* *clojure-version* *command-line-args* *compile-files* *compile-path* *compiler-options* *data-readers* *e *err* *file* *flush-on-newline* *fn-loader* *in* *math-context* *ns* *out* *print-dup* *print-length* *print-level* *print-meta* *print-readably* *read-eval* *source-path* *unchecked-math* *use-context-classloader* *verbose-defrecords* *warn-on-reflection* + +' - -' -> ->> ->ArrayChunk ->Vec ->VecNode ->VecSeq -cache-protocol-fn -reset-methods .. / < <= = == > >= EMPTY-NODE accessor aclone add-classpath add-watch agent agent-error agent-errors aget alength alias all-ns alter alter-meta! alter-var-root amap ancestors and apply areduce array-map aset aset-boolean aset-byte aset-char aset-double aset-float aset-int aset-long aset-short assert assoc assoc! assoc-in associative? atom await await-for await1 bases bean bigdec bigint biginteger binding bit-and bit-and-not bit-clear bit-flip bit-not bit-or bit-set bit-shift-left bit-shift-right bit-test bit-xor boolean boolean-array booleans bound-fn bound-fn* bound? butlast byte byte-array bytes case cat cast char char-array char-escape-string char-name-string char? chars chunk chunk-append chunk-buffer chunk-cons chunk-first chunk-next chunk-rest chunked-seq? class class? clear-agent-errors clojure-version coll? comment commute comp comparator compare compare-and-set! compile complement completing concat cond condp conj conj! cons constantly construct-proxy contains? count counted? create-ns create-struct cycle dec dec' decimal? declare dedupe default-data-readers definline definterface defmacro defmethod defmulti defn defn- defonce defprotocol defrecord defstruct deftype delay delay? deliver denominator deref derive descendants destructure disj disj! dissoc dissoc! distinct distinct? doall dorun doseq dosync dotimes doto double double-array doubles drop drop-last drop-while eduction empty empty? ensure enumeration-seq error-handler error-mode eval even? every-pred every? ex-data ex-info extend extend-protocol extend-type extenders extends? false? ffirst file-seq filter filterv find find-keyword find-ns find-protocol-impl find-protocol-method find-var first flatten float float-array float? floats flush fn fn? fnext fnil for force format frequencies future future-call future-cancel future-cancelled? future-done? future? gen-class gen-interface gensym get get-in get-method get-proxy-class get-thread-bindings get-validator group-by hash hash-combine hash-map hash-set identical? identity if-let if-not ifn? import in-ns inc inc' init-proxy instance? int int-array integer? interleave intern interpose into into-array ints io! isa? iterate iterator-seq juxt keep keep-indexed key keys keyword keyword? last lazy-cat lazy-seq let letfn line-seq list list* list? load load-file load-reader load-string loaded-libs locking long long-array longs loop macroexpand macroexpand-1 make-array make-hierarchy map map-indexed map? mapcat mapv max max-key memfn memoize merge merge-with meta method-sig methods min min-key mod munge name namespace namespace-munge neg? newline next nfirst nil? nnext not not-any? not-empty not-every? not= ns ns-aliases ns-imports ns-interns ns-map ns-name ns-publics ns-refers ns-resolve ns-unalias ns-unmap nth nthnext nthrest num number? numerator object-array odd? or parents partial partition partition-all partition-by pcalls peek persistent! pmap pop pop! pop-thread-bindings pos? pr pr-str prefer-method prefers primitives-classnames print print-ctor print-dup print-method print-simple print-str printf println println-str prn prn-str promise proxy proxy-call-with-super proxy-mappings proxy-name proxy-super push-thread-bindings pvalues quot rand rand-int rand-nth random-sample range ratio? rational? rationalize re-find re-groups re-matcher re-matches re-pattern re-seq read read-line read-string realized? reduce reduce-kv reductions ref ref-history-count ref-max-history ref-min-history ref-set refer refer-clojure reify release-pending-sends rem remove remove-all-methods remove-method remove-ns remove-watch repeat repeatedly replace replicate require reset! reset-meta! resolve rest restart-agent resultset-seq reverse reversible? rseq rsubseq satisfies? second select-keys send send-off seq seq? seque sequence sequential? set set-error-handler! set-error-mode! set-validator! set? short short-array shorts shuffle shutdown-agents slurp some some-fn sort sort-by sorted-map sorted-map-by sorted-set sorted-set-by sorted? special-symbol? spit split-at split-with str string? struct struct-map subs subseq subvec supers swap! symbol symbol? sync take take-last take-nth take-while test the-ns thread-bound? time to-array to-array-2d trampoline transduce transient tree-seq true? type unchecked-add unchecked-add-int unchecked-byte unchecked-char unchecked-dec unchecked-dec-int unchecked-divide-int unchecked-double unchecked-float unchecked-inc unchecked-inc-int unchecked-int unchecked-long unchecked-multiply unchecked-multiply-int unchecked-negate unchecked-negate-int unchecked-remainder-int unchecked-short unchecked-subtract unchecked-subtract-int underive unquote unquote-splicing update update-in update-proxy use val vals var-get var-set var? vary-meta vec vector vector-of vector? volatile! volatile? vreset! vswap! when when-first when-let when-not while with-bindings with-bindings* with-in-str with-loading-context with-local-vars with-meta with-open with-out-str with-precision with-redefs with-redefs-fn xml-seq zero? zipmap *default-data-reader-fn* as-> cond-> cond->> reduced reduced? send-via set-agent-send-executor! set-agent-send-off-executor! some-> some->>\"),\nt=f(\"ns fn def defn defmethod bound-fn if if-not case condp when while when-not when-first do future comment doto locking proxy with-open with-precision reify deftype defrecord defprotocol extend extend-protocol extend-type try catch let letfn binding loop for doseq dotimes when-let if-let defstruct struct-map assoc testing deftest handler-case handle dotrace deftrace\"),g=/\\d/,u=/[\\d:]/,v=/[0-9a-f]/i,n=/[+-]/,w=/e/i,x=/[^\\s\\(\\[\\;\\)\\]]/,p=/[\\w*+!\\-\\._?:<>\\/\\xa1-\\uffff]/,y=/^(?:def|with)[^\\/]+$|\\/(?:def|with)/;\nreturn{startState:function(){return{indentStack:null,indentation:0,mode:!1}},token:function(a,c){null==c.indentStack&&a.sol()&&(c.indentation=a.indentation());if(\"string\"!=c.mode&&a.eatSpace())return null;switch(c.mode){case \"string\":for(var b,d=!1;null!=(b=a.next());){if('\"'==b&&!d){c.mode=!1;break}d=!d&&\"\\\\\"==b}a=\"string\";break;default:if(b=a.next(),'\"'==b)a=c.mode=\"string\";else if(\"\\\\\"==b)(c=a.next())&&c.match(/[a-z]/)&&a.match(/[a-z]+/,!0)||\"u\"===c&&a.match(/[0-9a-z]{4}/i,!0),a=\"string-2\";else if(\"'\"!=\nb||u.test(a.peek()))if(\";\"==b)a.skipToEnd(),a=\"comment\";else if(d=b,\"0\"===d&&a.eat(/x/i)?(a.eatWhile(v),d=!0):(\"+\"!=d&&\"-\"!=d||!g.test(a.peek())||(a.eat(n),d=a.next()),g.test(d)?(a.eat(d),a.eatWhile(g),\".\"==a.peek()?(a.eat(\".\"),a.eatWhile(g)):\"/\"==a.peek()&&(a.eat(\"/\"),a.eatWhile(g)),a.eat(w)&&(a.eat(n),a.eatWhile(g)),d=!0):d=!1),d)a=\"number\";else if(\"(\"==b||\"[\"==b||\"{\"==b){var d=\"\",e=a.column(),f;if(\"(\"==b)for(;null!=(f=a.eat(x));)d+=f;0<d.length&&(t.propertyIsEnumerable(d)||y.test(d))?c.indentStack=\nnew h(e+q,b,c.indentStack):(a.eatSpace(),a.eol()||\";\"==a.peek()?c.indentStack=new h(e+r,b,c.indentStack):(d=e+a.current().length,c.indentStack=new h(d,b,c.indentStack)));a.backUp(a.current().length-1);a=\"bracket\"}else if(\")\"==b||\"]\"==b||\"}\"==b)a=\"bracket\",null!=c.indentStack&&c.indentStack.type==(\")\"==b?\"(\":\"]\"==b?\"[\":\"{\")&&(c.indentStack=c.indentStack.prev);else{if(\":\"==b)return a.eatWhile(p),\"atom\";a.eatWhile(p);a=l&&l.propertyIsEnumerable(a.current())?\"keyword\":m&&m.propertyIsEnumerable(a.current())?\n\"builtin\":k&&k.propertyIsEnumerable(a.current())?\"atom\":\"variable\"}else a=\"atom\"}return a},indent:function(a){return null==a.indentStack?a.indentation:a.indentStack.indent},closeBrackets:{pairs:'()[]{}\"\"'},lineComment:\";;\"}});e.defineMIME(\"text/x-clojure\",\"clojure\");e.defineMIME(\"text/x-clojurescript\",\"clojure\");e.defineMIME(\"application/edn\",\"clojure\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/cmake/cmake.js",
    "content": "'use strict';(function(b){\"object\"==typeof exports&&\"object\"==typeof module?b(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],b):b(CodeMirror)})(function(b){b.defineMode(\"cmake\",function(){function b(a,d){for(var c,b,e=!1;!a.eol()&&(c=a.next())!=d.pending;){if(\"$\"===c&&\"\\\\\"!=b&&'\"'==d.pending){e=!0;break}b=c}e&&a.backUp(1);d.continueString=c==d.pending?!1:!0;return\"string\"}function f(a,d){var c=a.next();if(\"$\"===c)return a.match(g)?\"variable-2\":\n\"variable\";if(d.continueString)return a.backUp(1),b(a,d);if(a.match(/(\\s+)?\\w+\\(/)||a.match(/(\\s+)?\\w+\\ \\(/))return a.backUp(1),\"def\";if(\"#\"==c)return a.skipToEnd(),\"comment\";if(\"'\"==c||'\"'==c)return d.pending=c,b(a,d);if(\"(\"==c||\")\"==c)return\"bracket\";if(c.match(/[0-9]/))return\"number\";a.eatWhile(/[\\w-]/);return null}var g=/({)?[a-zA-Z0-9_]+(})?/;return{startState:function(){return{inDefinition:!1,inInclude:!1,continueString:!1,pending:!1}},token:function(a,b){return a.eatSpace()?null:f(a,b)}}});\nb.defineMIME(\"text/x-cmake\",\"cmake\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/cobol/cobol.js",
    "content": "'use strict';(function(c){\"object\"==typeof exports&&\"object\"==typeof module?c(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],c):c(CodeMirror)})(function(c){c.defineMode(\"cobol\",function(){function c(a){var b={};a=a.split(\" \");for(var d=0;d<a.length;++d)b[a[d]]=!0;return b}var f=c(\"TRUE FALSE ZEROES ZEROS ZERO SPACES SPACE LOW-VALUE LOW-VALUES \"),g=c(\"ACCEPT ACCESS ACQUIRE ADD ADDRESS ADVANCING AFTER ALIAS ALL ALPHABET ALPHABETIC ALPHABETIC-LOWER ALPHABETIC-UPPER ALPHANUMERIC ALPHANUMERIC-EDITED ALSO ALTER ALTERNATE AND ANY ARE AREA AREAS ARITHMETIC ASCENDING ASSIGN AT ATTRIBUTE AUTHOR AUTO AUTO-SKIP AUTOMATIC B-AND B-EXOR B-LESS B-NOT B-OR BACKGROUND-COLOR BACKGROUND-COLOUR BEEP BEFORE BELL BINARY BIT BITS BLANK BLINK BLOCK BOOLEAN BOTTOM BY CALL CANCEL CD CF CH CHARACTER CHARACTERS CLASS CLOCK-UNITS CLOSE COBOL CODE CODE-SET COL COLLATING COLUMN COMMA COMMIT COMMITMENT COMMON COMMUNICATION COMP COMP-0 COMP-1 COMP-2 COMP-3 COMP-4 COMP-5 COMP-6 COMP-7 COMP-8 COMP-9 COMPUTATIONAL COMPUTATIONAL-0 COMPUTATIONAL-1 COMPUTATIONAL-2 COMPUTATIONAL-3 COMPUTATIONAL-4 COMPUTATIONAL-5 COMPUTATIONAL-6 COMPUTATIONAL-7 COMPUTATIONAL-8 COMPUTATIONAL-9 COMPUTE CONFIGURATION CONNECT CONSOLE CONTAINED CONTAINS CONTENT CONTINUE CONTROL CONTROL-AREA CONTROLS CONVERTING COPY CORR CORRESPONDING COUNT CRT CRT-UNDER CURRENCY CURRENT CURSOR DATA DATE DATE-COMPILED DATE-WRITTEN DAY DAY-OF-WEEK DB DB-ACCESS-CONTROL-KEY DB-DATA-NAME DB-EXCEPTION DB-FORMAT-NAME DB-RECORD-NAME DB-SET-NAME DB-STATUS DBCS DBCS-EDITED DE DEBUG-CONTENTS DEBUG-ITEM DEBUG-LINE DEBUG-NAME DEBUG-SUB-1 DEBUG-SUB-2 DEBUG-SUB-3 DEBUGGING DECIMAL-POINT DECLARATIVES DEFAULT DELETE DELIMITED DELIMITER DEPENDING DESCENDING DESCRIBED DESTINATION DETAIL DISABLE DISCONNECT DISPLAY DISPLAY-1 DISPLAY-2 DISPLAY-3 DISPLAY-4 DISPLAY-5 DISPLAY-6 DISPLAY-7 DISPLAY-8 DISPLAY-9 DIVIDE DIVISION DOWN DROP DUPLICATE DUPLICATES DYNAMIC EBCDIC EGI EJECT ELSE EMI EMPTY EMPTY-CHECK ENABLE END END. END-ACCEPT END-ACCEPT. END-ADD END-CALL END-COMPUTE END-DELETE END-DISPLAY END-DIVIDE END-EVALUATE END-IF END-INVOKE END-MULTIPLY END-OF-PAGE END-PERFORM END-READ END-RECEIVE END-RETURN END-REWRITE END-SEARCH END-START END-STRING END-SUBTRACT END-UNSTRING END-WRITE END-XML ENTER ENTRY ENVIRONMENT EOP EQUAL EQUALS ERASE ERROR ESI EVALUATE EVERY EXCEEDS EXCEPTION EXCLUSIVE EXIT EXTEND EXTERNAL EXTERNALLY-DESCRIBED-KEY FD FETCH FILE FILE-CONTROL FILE-STREAM FILES FILLER FINAL FIND FINISH FIRST FOOTING FOR FOREGROUND-COLOR FOREGROUND-COLOUR FORMAT FREE FROM FULL FUNCTION GENERATE GET GIVING GLOBAL GO GOBACK GREATER GROUP HEADING HIGH-VALUE HIGH-VALUES HIGHLIGHT I-O I-O-CONTROL ID IDENTIFICATION IF IN INDEX INDEX-1 INDEX-2 INDEX-3 INDEX-4 INDEX-5 INDEX-6 INDEX-7 INDEX-8 INDEX-9 INDEXED INDIC INDICATE INDICATOR INDICATORS INITIAL INITIALIZE INITIATE INPUT INPUT-OUTPUT INSPECT INSTALLATION INTO INVALID INVOKE IS JUST JUSTIFIED KANJI KEEP KEY LABEL LAST LD LEADING LEFT LEFT-JUSTIFY LENGTH LENGTH-CHECK LESS LIBRARY LIKE LIMIT LIMITS LINAGE LINAGE-COUNTER LINE LINE-COUNTER LINES LINKAGE LOCAL-STORAGE LOCALE LOCALLY LOCK MEMBER MEMORY MERGE MESSAGE METACLASS MODE MODIFIED MODIFY MODULES MOVE MULTIPLE MULTIPLY NATIONAL NATIVE NEGATIVE NEXT NO NO-ECHO NONE NOT NULL NULL-KEY-MAP NULL-MAP NULLS NUMBER NUMERIC NUMERIC-EDITED OBJECT OBJECT-COMPUTER OCCURS OF OFF OMITTED ON ONLY OPEN OPTIONAL OR ORDER ORGANIZATION OTHER OUTPUT OVERFLOW OWNER PACKED-DECIMAL PADDING PAGE PAGE-COUNTER PARSE PERFORM PF PH PIC PICTURE PLUS POINTER POSITION POSITIVE PREFIX PRESENT PRINTING PRIOR PROCEDURE PROCEDURE-POINTER PROCEDURES PROCEED PROCESS PROCESSING PROGRAM PROGRAM-ID PROMPT PROTECTED PURGE QUEUE QUOTE QUOTES RANDOM RD READ READY REALM RECEIVE RECONNECT RECORD RECORD-NAME RECORDS RECURSIVE REDEFINES REEL REFERENCE REFERENCE-MONITOR REFERENCES RELATION RELATIVE RELEASE REMAINDER REMOVAL RENAMES REPEATED REPLACE REPLACING REPORT REPORTING REPORTS REPOSITORY REQUIRED RERUN RESERVE RESET RETAINING RETRIEVAL RETURN RETURN-CODE RETURNING REVERSE-VIDEO REVERSED REWIND REWRITE RF RH RIGHT RIGHT-JUSTIFY ROLLBACK ROLLING ROUNDED RUN SAME SCREEN SD SEARCH SECTION SECURE SECURITY SEGMENT SEGMENT-LIMIT SELECT SEND SENTENCE SEPARATE SEQUENCE SEQUENTIAL SET SHARED SIGN SIZE SKIP1 SKIP2 SKIP3 SORT SORT-MERGE SORT-RETURN SOURCE SOURCE-COMPUTER SPACE-FILL SPECIAL-NAMES STANDARD STANDARD-1 STANDARD-2 START STARTING STATUS STOP STORE STRING SUB-QUEUE-1 SUB-QUEUE-2 SUB-QUEUE-3 SUB-SCHEMA SUBFILE SUBSTITUTE SUBTRACT SUM SUPPRESS SYMBOLIC SYNC SYNCHRONIZED SYSIN SYSOUT TABLE TALLYING TAPE TENANT TERMINAL TERMINATE TEST TEXT THAN THEN THROUGH THRU TIME TIMES TITLE TO TOP TRAILING TRAILING-SIGN TRANSACTION TYPE TYPEDEF UNDERLINE UNEQUAL UNIT UNSTRING UNTIL UP UPDATE UPON USAGE USAGE-MODE USE USING VALID VALIDATE VALUE VALUES VARYING VLR WAIT WHEN WHEN-COMPILED WITH WITHIN WORDS WORKING-STORAGE WRITE XML XML-CODE XML-EVENT XML-NTEXT XML-TEXT ZERO ZERO-FILL \"),\nh=c(\"- * ** / + < <= = > >= \"),e=/\\d/,m=/[\\d:]/,n=/[0-9a-f]/i,k=/[+-]/,p=/e/i,l=/[\\w*+\\-]/;return{startState:function(){return{indentStack:null,indentation:0,mode:!1}},token:function(a,b){null==b.indentStack&&a.sol()&&(b.indentation=6);if(a.eatSpace())return null;switch(b.mode){case \"string\":for(var d;null!=(d=a.next());)if('\"'==d||\"'\"==d){b.mode=!1;break}a=\"string\";break;default:var c=a.next();d=a.column();if(0<=d&&5>=d)a=\"def\";else if(72<=d&&79>=d)a.skipToEnd(),a=\"header\";else if(\"*\"==c&&6==d)a.skipToEnd(),\na=\"comment\";else if('\"'==c||\"'\"==c)a=b.mode=\"string\";else if(\"'\"!=c||m.test(a.peek()))if(\".\"==c)a=\"link\";else if(b=c,\"0\"===b&&a.eat(/x/i)?(a.eatWhile(n),b=!0):(\"+\"!=b&&\"-\"!=b||!e.test(a.peek())||(a.eat(k),b=a.next()),e.test(b)?(a.eat(b),a.eatWhile(e),\".\"==a.peek()&&(a.eat(\".\"),a.eatWhile(e)),a.eat(p)&&(a.eat(k),a.eatWhile(e)),b=!0):b=!1),b)a=\"number\";else{if(a.current().match(l))for(;71>d&&void 0!==a.eat(l);)d++;a=g&&g.propertyIsEnumerable(a.current().toUpperCase())?\"keyword\":h&&h.propertyIsEnumerable(a.current().toUpperCase())?\n\"builtin\":f&&f.propertyIsEnumerable(a.current().toUpperCase())?\"atom\":null}else a=\"atom\"}return a},indent:function(a){return null==a.indentStack?a.indentation:a.indentStack.indent}}});c.defineMIME(\"text/x-cobol\",\"cobol\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/coffeescript/coffeescript.js",
    "content": "'use strict';(function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],e):e(CodeMirror)})(function(e){e.defineMode(\"coffeescript\",function(e,t){function k(a){return new RegExp(\"^((\"+a.join(\")|(\")+\"))\\\\b\")}function h(a,b){if(a.sol()){null===b.scope.align&&(b.scope.align=!1);var c=b.scope.offset;if(a.eatSpace())return a=a.indentation(),a>c&&\"coffee\"==b.scope.type?\"indent\":a<c?\"dedent\":null;\n0<c&&m(a,b)}if(a.eatSpace())return null;c=a.peek();if(a.match(\"####\"))return a.skipToEnd(),\"comment\";if(a.match(\"###\"))return b.tokenize=u,b.tokenize(a,b);if(\"#\"===c)return a.skipToEnd(),\"comment\";if(a.match(/^-?[0-9\\.]/,!1)){c=!1;a.match(/^-?\\d*\\.\\d+(e[\\+\\-]?\\d+)?/i)&&(c=!0);a.match(/^-?\\d+\\.\\d*/)&&(c=!0);a.match(/^-?\\.\\d+/)&&(c=!0);if(c)return\".\"==a.peek()&&a.backUp(1),\"number\";c=!1;a.match(/^-?0x[0-9a-f]+/i)&&(c=!0);a.match(/^-?[1-9]\\d*(e[\\+\\-]?\\d+)?/)&&(c=!0);a.match(/^-?0(?![\\dx])/i)&&(c=!0);\nif(c)return\"number\"}if(a.match(v))return b.tokenize=p(a.current(),!1,\"string\"),b.tokenize(a,b);if(a.match(w)){if(\"/\"!=a.current()||a.match(/^.*\\//,!1))return b.tokenize=p(a.current(),!0,\"string-2\"),b.tokenize(a,b);a.backUp(1)}if(a.match(x)||a.match(y))return\"operator\";if(a.match(z))return\"punctuation\";if(a.match(A))return\"atom\";if(a.match(B)||b.prop&&a.match(q))return\"property\";if(a.match(C))return\"keyword\";if(a.match(q))return\"variable\";a.next();return\"error\"}function p(a,b,c){return function(d,\nf){for(;!d.eol();)if(d.eatWhile(/[^'\"\\/\\\\]/),d.eat(\"\\\\\")){if(d.next(),b&&d.eol())return c}else{if(d.match(a))return f.tokenize=h,c;d.eat(/['\"\\/]/)}b&&(t.singleLineStringErrors?c=\"error\":f.tokenize=h);return c}}function u(a,b){for(;!a.eol();){a.eatWhile(/[^#]/);if(a.match(\"###\")){b.tokenize=h;break}a.eatWhile(\"#\")}return\"comment\"}function n(a,b,c){c=c||\"coffee\";for(var d=0,f=!1,r=null,g=b.scope;g;g=g.prev)if(\"coffee\"===g.type||\"}\"==g.type){d=g.offset+e.indentUnit;break}\"coffee\"!==c?(f=null,r=a.column()+\na.current().length):b.scope.align&&(b.scope.align=!1);b.scope={offset:d,type:c,prev:b.scope,align:f,alignOffset:r}}function m(a,b){if(b.scope.prev){if(\"coffee\"===b.scope.type){a=a.indentation();for(var c=!1,d=b.scope;d;d=d.prev)if(a===d.offset){c=!0;break}if(!c)return!0;for(;b.scope.prev&&b.scope.offset!==a;)b.scope=b.scope.prev}else b.scope=b.scope.prev;return!1}}var x=/^(?:->|=>|\\+[+=]?|-[\\-=]?|\\*[\\*=]?|\\/[\\/=]?|[=!]=|<[><]?=?|>>?=?|%=?|&=?|\\|=?|\\^=?|\\~|!|\\?|(or|and|\\|\\||&&|\\?)=)/,z=/^(?:[()\\[\\]{},:`=;]|\\.\\.?\\.?)/,\nq=/^[_A-Za-z$][_A-Za-z$0-9]*/,B=/^@[_A-Za-z$][_A-Za-z$0-9]*/,y=k(\"and or not is isnt in instanceof typeof\".split(\" \")),l=\"for while loop if unless else switch try catch finally class\".split(\" \"),C=k(l.concat(\"break by continue debugger delete do in of new return then this @ throw when until extends\".split(\" \"))),l=k(l),v=/^('{3}|\\\"{3}|['\\\"])/,w=/^(\\/{3}|\\/)/,A=k(\"Infinity NaN undefined null true false on off yes no\".split(\" \"));return{startState:function(a){return{tokenize:h,scope:{offset:a||0,type:\"coffee\",\nprev:null,align:!1},prop:!1,dedent:0}},token:function(a,b){var c=null===b.scope.align&&b.scope;c&&a.sol()&&(c.align=!1);var d;d=b.tokenize(a,b);var f=a.current();\"return\"===f&&(b.dedent=!0);((\"->\"===f||\"=>\"===f)&&a.eol()||\"indent\"===d)&&n(a,b);var e=\"[({\".indexOf(f);-1!==e&&n(a,b,\"])}\".slice(e,e+1));l.exec(f)&&n(a,b);\"then\"==f&&m(a,b);if(\"dedent\"===d&&m(a,b))d=\"error\";else{e=\"])}\".indexOf(f);if(-1!==e){for(;\"coffee\"==b.scope.type&&b.scope.prev;)b.scope=b.scope.prev;b.scope.type==f&&(b.scope=b.scope.prev)}b.dedent&&\na.eol()&&(\"coffee\"==b.scope.type&&b.scope.prev&&(b.scope=b.scope.prev),b.dedent=!1)}d&&\"comment\"!=d&&(c&&(c.align=!0),b.prop=\"punctuation\"==d&&\".\"==a.current());return d},indent:function(a,b){if(a.tokenize!=h)return 0;a=a.scope;var c=b&&-1<\"])}\".indexOf(b.charAt(0));if(c)for(;\"coffee\"==a.type&&a.prev;)a=a.prev;b=c&&a.type===b.charAt(0);return a.align?a.alignOffset-(b?1:0):(b?a.prev:a).offset},lineComment:\"#\",fold:\"indent\"}});e.defineMIME(\"text/x-coffeescript\",\"coffeescript\");e.defineMIME(\"text/coffeescript\",\n\"coffeescript\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/commonlisp/commonlisp.js",
    "content": "'use strict';(function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],e):e(CodeMirror)})(function(e){e.defineMode(\"commonlisp\",function(e){function g(a){for(var b;b=a.next();)if(\"\\\\\"==b)a.next();else if(!k.test(b)){a.backUp(1);break}return a.current()}function f(a,b){if(a.eatSpace())return d=\"ws\",null;if(a.match(l))return\"number\";var c=a.next();\"\\\\\"==c&&(c=a.next());if('\"'==c)return(b.tokenize=\nm)(a,b);if(\"(\"==c)return d=\"open\",\"bracket\";if(\")\"==c||\"]\"==c)return d=\"close\",\"bracket\";if(\";\"==c)return a.skipToEnd(),d=\"ws\",\"comment\";if(/['`,@]/.test(c))return null;if(\"|\"==c){if(a.skipTo(\"|\"))return a.next(),\"symbol\";a.skipToEnd();return\"error\"}if(\"#\"==c)return c=a.next(),\"[\"==c?(d=\"open\",\"bracket\"):/[+\\-=\\.']/.test(c)||/\\d/.test(c)&&a.match(/^\\d*#/)?null:\"|\"==c?(b.tokenize=n)(a,b):\":\"==c?(g(a),\"meta\"):\"error\";a=g(a);if(\".\"==a)return null;d=\"symbol\";return\"nil\"==a||\"t\"==a||\":\"==a.charAt(0)?\"atom\":\n\"open\"==b.lastType&&(p.test(a)||h.test(a))?\"keyword\":\"&\"==a.charAt(0)?\"variable-2\":\"variable\"}function m(a,b){for(var c=!1,d;d=a.next();){if('\"'==d&&!c){b.tokenize=f;break}c=!c&&\"\\\\\"==d}return\"string\"}function n(a,b){for(var c,e;c=a.next();){if(\"#\"==c&&\"|\"==e){b.tokenize=f;break}e=c}d=\"ws\";return\"comment\"}var p=/^(block|let*|return-from|catch|load-time-value|setq|eval-when|locally|symbol-macrolet|flet|macrolet|tagbody|function|multiple-value-call|the|go|multiple-value-prog1|throw|if|progn|unwind-protect|labels|progv|let|quote)$/,\nh=/^with|^def|^do|^prog|case$|^cond$|bind$|when$|unless$/,l=/^(?:[+\\-]?(?:\\d+|\\d*\\.\\d+)(?:[efd][+\\-]?\\d+)?|[+\\-]?\\d+(?:\\/[+\\-]?\\d+)?|#b[+\\-]?[01]+|#o[+\\-]?[0-7]+|#x[+\\-]?[\\da-f]+)/,k=/[^\\s'`,@()\\[\\]\";]/,d;return{startState:function(){return{ctx:{prev:null,start:0,indentTo:0},lastType:null,tokenize:f}},token:function(a,b){a.sol()&&\"number\"!=typeof b.ctx.indentTo&&(b.ctx.indentTo=b.ctx.start+1);d=null;var c=b.tokenize(a,b);\"ws\"!=d&&(null==b.ctx.indentTo?\"symbol\"==d&&h.test(a.current())?b.ctx.indentTo=\nb.ctx.start+e.indentUnit:b.ctx.indentTo=\"next\":\"next\"==b.ctx.indentTo&&(b.ctx.indentTo=a.column()),b.lastType=d);\"open\"==d?b.ctx={prev:b.ctx,start:a.column(),indentTo:null}:\"close\"==d&&(b.ctx=b.ctx.prev||b.ctx);return c},indent:function(a,b){b=a.ctx.indentTo;return\"number\"==typeof b?b:a.ctx.start+1},closeBrackets:{pairs:'()[]{}\"\"'},lineComment:\";;\",blockCommentStart:\"#|\",blockCommentEnd:\"|#\"}});e.defineMIME(\"text/x-common-lisp\",\"commonlisp\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/crystal/crystal.js",
    "content": "'use strict';(function(g){\"object\"==typeof exports&&\"object\"==typeof module?g(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],g):g(CodeMirror)})(function(g){g.defineMode(\"crystal\",function(g){function m(a,b){return new RegExp((b?\"\":\"^\")+\"(?:\"+a.join(\"|\")+\")\"+(b?\"$\":\"\\\\b\"))}function h(a,b,c){c.tokenize.push(a);return a(b,c)}function r(a,b){if(a.eatSpace())return null;if(\"\\\\\"!=b.lastToken&&a.match(\"{%\",!1))return h(n(\"%\",\"%\"),a,b);if(\"\\\\\"!=b.lastToken&&\na.match(\"{{\",!1))return h(n(\"{\",\"}\"),a,b);if(\"#\"==a.peek())return a.skipToEnd(),\"comment\";var c;if(a.match(k))return a.eat(/[?!]/),c=a.current(),a.eat(\":\")?\"atom\":\".\"==b.lastToken?\"property\":D.test(c)?(\"abstract\"!=b.lastToken&&E.test(c)?\"fun\"==c&&0<=b.blocks.indexOf(\"lib\")||(b.blocks.push(c),b.currentIndent+=1):x.test(c)&&(b.blocks.pop(),--b.currentIndent),y.hasOwnProperty(c)&&b.tokenize.push(y[c]),\"keyword\"):F.test(c)?\"atom\":\"variable\";if(a.eat(\"@\")){if(\"[\"==a.peek())return h(q(\"[\",\"]\",\"meta\"),a,\nb);a.eat(\"@\");a.match(k)||a.match(p);return\"variable-2\"}if(a.eat(\"$\"))return a.eat(/[0-9]+|\\?/)||a.match(k)||a.match(p),\"variable-3\";if(a.match(p))return\"tag\";if(a.eat(\":\")){if(a.eat('\"'))return h(t('\"',\"atom\",!1),a,b);if(a.match(k)||a.match(p)||a.match(u)||a.match(v)||a.match(z))return\"atom\";a.eat(\":\");return\"operator\"}if(a.eat('\"'))return h(t('\"',\"string\",!0),a,b);if(\"%\"==a.peek()){c=\"string\";var e=!0,d;if(a.match(\"%r\"))c=\"string-2\",d=a.next();else if(a.match(\"%w\"))e=!1,d=a.next();else if(d=a.match(/^%([^\\w\\s=])/))d=\nd[1];else return a.match(/^%[a-zA-Z0-9_\\u009F-\\uFFFF]*/)?\"meta\":\"operator\";w.hasOwnProperty(d)&&(d=w[d]);return h(t(d,c,e),a,b)}if(a.eat(\"'\"))return a.match(/^(?:[^']|\\\\(?:[befnrtv0'\"]|[0-7]{3}|u(?:[0-9a-fA-F]{4}|\\{[0-9a-fA-F]{1,6}\\})))/),a.eat(\"'\"),\"atom\";if(a.eat(\"0\"))return a.eat(\"x\")?a.match(/^[0-9a-fA-F]+/):a.eat(\"o\")?a.match(/^[0-7]+/):a.eat(\"b\")&&a.match(/^[01]+/),\"number\";if(a.eat(/\\d/))return a.match(/^\\d*(?:\\.\\d+)?(?:[eE][+-]?\\d+)?/),\"number\";if(a.match(u))return a.eat(\"=\"),\"operator\";if(a.match(v)||\na.match(G))return\"operator\";if(c=a.match(/[({[]/,!1))return c=c[0],h(q(c,w[c],null),a,b);if(a.eat(\"\\\\\"))return a.next(),\"meta\";a.next();return null}function q(a,b,c,e){return function(d,f){if(!e&&d.match(a))return f.tokenize[f.tokenize.length-1]=q(a,b,c,!0),f.currentIndent+=1,c;var g=r(d,f);d.current()===b&&(f.tokenize.pop(),--f.currentIndent,g=c);return g}}function n(a,b,c){return function(e,d){return!c&&e.match(\"{\"+a)?(d.currentIndent+=1,d.tokenize[d.tokenize.length-1]=n(a,b,!0),\"meta\"):e.match(b+\n\"}\")?(--d.currentIndent,d.tokenize.pop(),\"meta\"):r(e,d)}}function A(a,b){if(a.eatSpace())return null;a.match(k)?a.eat(/[!?]/):a.match(u)||a.match(v)||a.match(z);b.tokenize.pop();return\"def\"}function l(a,b){if(a.eatSpace())return null;a.match(p);b.tokenize.pop();return\"def\"}function t(a,b,c){return function(e,d){for(var f=!1;e.peek();)if(f)e.next(),f=!1;else{if(e.match(\"{%\",!1)){d.tokenize.push(n(\"%\",\"%\"));break}if(e.match(\"{{\",!1)){d.tokenize.push(n(\"{\",\"}\"));break}if(c&&e.match(\"#{\",!1)){d.tokenize.push(q(\"#{\",\n\"}\",\"meta\"));break}f=e.next();if(f==a){d.tokenize.pop();break}f=\"\\\\\"==f}return b}}var u=/^(?:[-+/%|&^]|\\*\\*?|[<>]{2})/,v=/^(?:[=!]~|===|<=>|[<>=!]=?|[|&]{2}|~)/,z=/^(?:\\[\\][?=]?)/,G=/^(?:\\.(?:\\.{2})?|->|[?:])/,k=/^[a-z_\\u009F-\\uFFFF][a-zA-Z0-9_\\u009F-\\uFFFF]*/,p=/^[A-Z_\\u009F-\\uFFFF][a-zA-Z0-9_\\u009F-\\uFFFF]*/,D=m(\"abstract alias as asm begin break case class def do else elsif end ensure enum extend for fun if ifdef include instance_sizeof lib macro module next of out pointerof private protected rescue return require sizeof struct super then type typeof union unless until when while with yield __DIR__ __FILE__ __LINE__\".split(\" \")),\nF=m([\"true\",\"false\",\"nil\",\"self\"]),E=m(\"def fun macro class module struct lib enum union if unless case while until begin then do for ifdef\".split(\" \")),B=[\"end\",\"else\",\"elsif\",\"rescue\",\"ensure\"],x=m(B),C=[\"\\\\)\",\"\\\\}\",\"\\\\]\"],H=new RegExp(\"^(?:\"+C.join(\"|\")+\")$\"),y={def:A,fun:A,macro:function(a,b){if(a.eatSpace())return null;var c;if(c=a.match(k)){if(\"def\"==c)return\"keyword\";a.eat(/[?!]/)}b.tokenize.pop();return\"def\"},\"class\":l,module:l,struct:l,lib:l,\"enum\":l,union:l},w={\"[\":\"]\",\"{\":\"}\",\"(\":\")\",\"<\":\">\"};\nreturn{startState:function(){return{tokenize:[r],currentIndent:0,lastToken:null,blocks:[]}},token:function(a,b){var c=b.tokenize[b.tokenize.length-1](a,b);a=a.current();c&&\"comment\"!=c&&(b.lastToken=a);return c},indent:function(a,b){b=b.replace(/^\\s*(?:\\{%)?\\s*|\\s*(?:%\\})?\\s*$/g,\"\");return x.test(b)||H.test(b)?g.indentUnit*(a.currentIndent-1):g.indentUnit*a.currentIndent},fold:\"indent\",electricInput:m(C.concat(B),!0),lineComment:\"#\"}});g.defineMIME(\"text/x-crystal\",\"crystal\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/css/css.js",
    "content": "'use strict';(function(k){\"object\"==typeof exports&&\"object\"==typeof module?k(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],k):k(CodeMirror)})(function(k){function l(d){for(var e={},f=0;f<d.length;++f)e[d[f]]=!0;return e}function m(d,e){for(var f=!1,k;null!=(k=d.next());){if(f&&\"/\"==k){e.tokenize=null;break}f=\"*\"==k}return[\"comment\",\"comment\"]}k.defineMode(\"css\",function(d,e){function f(a,c){K=c;return a}function l(a,c){var b=a.next();if(w[b]){var d=\nw[b](a,c);if(!1!==d)return d}if(\"@\"==b)return a.eatWhile(/[\\w\\\\\\-]/),f(\"def\",a.current());if(\"=\"==b||(\"~\"==b||\"|\"==b)&&a.eat(\"=\"))return f(null,\"compare\");if('\"'==b||\"'\"==b)return c.tokenize=m(b),c.tokenize(a,c);if(\"#\"==b)return a.eatWhile(/[\\w\\\\\\-]/),f(\"atom\",\"hash\");if(\"!\"==b)return a.match(/^\\s*\\w*/),f(\"keyword\",\"important\");if(/\\d/.test(b)||\".\"==b&&a.eat(/\\d/))return a.eatWhile(/[\\w.%]/),f(\"number\",\"unit\");if(\"-\"===b){if(/[\\d.]/.test(a.peek()))return a.eatWhile(/[\\w.%]/),f(\"number\",\"unit\");if(a.match(/^-[\\w\\\\\\-]+/))return a.eatWhile(/[\\w\\\\\\-]/),\na.match(/^\\s*:/,!1)?f(\"variable-2\",\"variable-definition\"):f(\"variable-2\",\"variable\");if(a.match(/^\\w+-/))return f(\"meta\",\"meta\")}else return/[,+>*\\/]/.test(b)?f(null,\"select-op\"):\".\"==b&&a.match(/^-?[_a-z][_a-z0-9-]*/i)?f(\"qualifier\",\"qualifier\"):/[:;{}\\[\\]\\(\\)]/.test(b)?f(null,b):\"u\"==b&&a.match(/rl(-prefix)?\\(/)||\"d\"==b&&a.match(\"omain(\")||\"r\"==b&&a.match(\"egexp(\")?(a.backUp(1),c.tokenize=y,f(\"property\",\"word\")):/[\\w\\\\\\-]/.test(b)?(a.eatWhile(/[\\w\\\\\\-]/),f(\"property\",\"word\")):f(null,null)}function m(a){return function(c,\nb){for(var d=!1,e;null!=(e=c.next());){if(e==a&&!d){\")\"==a&&c.backUp(1);break}d=!d&&\"\\\\\"==e}if(e==a||!d&&\")\"!=a)b.tokenize=null;return f(\"string\",\"string\")}}function y(a,c){a.next();a.match(/\\s*[\\\"\\')]/,!1)?c.tokenize=null:c.tokenize=m(\")\");return f(null,\"(\")}function r(a,c,b){this.type=a;this.indent=c;this.prev=b}function h(a,c,b,d){a.context=new r(b,c.indentation()+(!1===d?0:v),a.context);return b}function n(a){a.context.prev&&(a.context=a.context.prev);return a.context.type}function q(a,c,b,d){for(d=\nd||1;0<d;d--)b.context=b.context.prev;return p[b.context.type](a,c,b)}function t(a){a=a.current().toLowerCase();g=F.hasOwnProperty(a)?\"atom\":E.hasOwnProperty(a)?\"keyword\":\"variable\"}var u=e.inline;e.propertyKeywords||(e=k.resolveMode(\"text/css\"));var v=d.indentUnit,w=e.tokenHooks,z=e.documentTypes||{},A=e.mediaTypes||{},D=e.mediaFeatures||{},G=e.mediaValueKeywords||{},B=e.propertyKeywords||{},C=e.nonStandardPropertyKeywords||{},H=e.fontProperties||{},I=e.counterDescriptors||{},E=e.colorKeywords||\n{},F=e.valueKeywords||{},x=e.allowNested,J=!0===e.supportsAtComponent,K,g,p={top:function(a,c,b){if(\"{\"==a)return h(b,c,\"block\");if(\"}\"==a&&b.context.prev)return n(b);if(J&&/@component/.test(a))return h(b,c,\"atComponentBlock\");if(/^@(-moz-)?document$/.test(a))return h(b,c,\"documentTypes\");if(/^@(media|supports|(-moz-)?document|import)$/.test(a))return h(b,c,\"atBlock\");if(/^@(font-face|counter-style)/.test(a))return b.stateArg=a,\"restricted_atBlock_before\";if(/^@(-(moz|ms|o|webkit)-)?keyframes$/.test(a))return\"keyframes\";\nif(a&&\"@\"==a.charAt(0))return h(b,c,\"at\");if(\"hash\"==a)g=\"builtin\";else if(\"word\"==a)g=\"tag\";else{if(\"variable-definition\"==a)return\"maybeprop\";if(\"interpolation\"==a)return h(b,c,\"interpolation\");if(\":\"==a)return\"pseudo\";if(x&&\"(\"==a)return h(b,c,\"parens\")}return b.context.type},block:function(a,c,b){if(\"word\"==a){a=c.current().toLowerCase();if(B.hasOwnProperty(a))return g=\"property\",\"maybeprop\";if(C.hasOwnProperty(a))return g=\"string-2\",\"maybeprop\";if(x)return g=c.match(/^\\s*:(?:\\s|$)/,!1)?\"property\":\n\"tag\",\"block\";g+=\" error\";return\"maybeprop\"}if(\"meta\"==a)return\"block\";if(x||\"hash\"!=a&&\"qualifier\"!=a)return p.top(a,c,b);g=\"error\";return\"block\"},maybeprop:function(a,c,b){return\":\"==a?h(b,c,\"prop\"):p[b.context.type](a,c,b)},prop:function(a,c,b){if(\";\"==a)return n(b);if(\"{\"==a&&x)return h(b,c,\"propBlock\");if(\"}\"==a||\"{\"==a)return q(a,c,b);if(\"(\"==a)return h(b,c,\"parens\");if(\"hash\"==a&&!/^#([0-9a-fA-f]{3,4}|[0-9a-fA-f]{6}|[0-9a-fA-f]{8})$/.test(c.current()))g+=\" error\";else if(\"word\"==a)t(c);else if(\"interpolation\"==\na)return h(b,c,\"interpolation\");return\"prop\"},propBlock:function(a,c,b){return\"}\"==a?n(b):\"word\"==a?(g=\"property\",\"maybeprop\"):b.context.type},parens:function(a,c,b){if(\"{\"==a||\"}\"==a)return q(a,c,b);if(\")\"==a)return n(b);if(\"(\"==a)return h(b,c,\"parens\");if(\"interpolation\"==a)return h(b,c,\"interpolation\");\"word\"==a&&t(c);return\"parens\"},pseudo:function(a,c,b){return\"word\"==a?(g=\"variable-3\",b.context.type):p[b.context.type](a,c,b)},documentTypes:function(a,c,b){return\"word\"==a&&z.hasOwnProperty(c.current())?\n(g=\"tag\",b.context.type):p.atBlock(a,c,b)},atBlock:function(a,c,b){if(\"(\"==a)return h(b,c,\"atBlock_parens\");if(\"}\"==a||\";\"==a)return q(a,c,b);if(\"{\"==a)return n(b)&&h(b,c,x?\"block\":\"top\");if(\"interpolation\"==a)return h(b,c,\"interpolation\");\"word\"==a&&(a=c.current().toLowerCase(),g=\"only\"==a||\"not\"==a||\"and\"==a||\"or\"==a?\"keyword\":A.hasOwnProperty(a)?\"attribute\":D.hasOwnProperty(a)?\"property\":G.hasOwnProperty(a)?\"keyword\":B.hasOwnProperty(a)?\"property\":C.hasOwnProperty(a)?\"string-2\":F.hasOwnProperty(a)?\n\"atom\":E.hasOwnProperty(a)?\"keyword\":\"error\");return b.context.type},atComponentBlock:function(a,c,b){if(\"}\"==a)return q(a,c,b);if(\"{\"==a)return n(b)&&h(b,c,x?\"block\":\"top\",!1);\"word\"==a&&(g=\"error\");return b.context.type},atBlock_parens:function(a,c,b){return\")\"==a?n(b):\"{\"==a||\"}\"==a?q(a,c,b,2):p.atBlock(a,c,b)},restricted_atBlock_before:function(a,c,b){return\"{\"==a?h(b,c,\"restricted_atBlock\"):\"word\"==a&&\"@counter-style\"==b.stateArg?(g=\"variable\",\"restricted_atBlock_before\"):p[b.context.type](a,\nc,b)},restricted_atBlock:function(a,c,b){return\"}\"==a?(b.stateArg=null,n(b)):\"word\"==a?(g=\"@font-face\"==b.stateArg&&!H.hasOwnProperty(c.current().toLowerCase())||\"@counter-style\"==b.stateArg&&!I.hasOwnProperty(c.current().toLowerCase())?\"error\":\"property\",\"maybeprop\"):\"restricted_atBlock\"},keyframes:function(a,c,b){return\"word\"==a?(g=\"variable\",\"keyframes\"):\"{\"==a?h(b,c,\"top\"):p[b.context.type](a,c,b)},at:function(a,c,b){if(\";\"==a)return n(b);if(\"{\"==a||\"}\"==a)return q(a,c,b);\"word\"==a?g=\"tag\":\"hash\"==\na&&(g=\"builtin\");return\"at\"},interpolation:function(a,c,b){if(\"}\"==a)return n(b);if(\"{\"==a||\";\"==a)return q(a,c,b);\"word\"==a?g=\"variable\":\"variable\"!=a&&\"(\"!=a&&\")\"!=a&&(g=\"error\");return\"interpolation\"}};return{startState:function(a){return{tokenize:null,state:u?\"block\":\"top\",stateArg:null,context:new r(u?\"block\":\"top\",a||0,null)}},token:function(a,c){if(!c.tokenize&&a.eatSpace())return null;var b=(c.tokenize||l)(a,c);b&&\"object\"==typeof b&&(K=b[1],b=b[0]);g=b;c.state=p[c.state](K,a,c);return g},\nindent:function(a,c){a=a.context;c=c&&c.charAt(0);var b=a.indent;\"prop\"!=a.type||\"}\"!=c&&\")\"!=c||(a=a.prev);if(a.prev)if(\"}\"==c&&(\"block\"==a.type||\"top\"==a.type||\"interpolation\"==a.type||\"restricted_atBlock\"==a.type))a=a.prev,b=a.indent;else if(\")\"==c&&(\"parens\"==a.type||\"atBlock_parens\"==a.type)||\"{\"==c&&(\"at\"==a.type||\"atBlock\"==a.type))b=Math.max(0,a.indent-v);return b},electricChars:\"}\",blockCommentStart:\"/*\",blockCommentEnd:\"*/\",fold:\"brace\"}});var y=[\"domain\",\"regexp\",\"url\",\"url-prefix\"],G=\nl(y),B=\"all aural braille handheld print projection screen tty tv embossed\".split(\" \"),r=l(B),C=\"width min-width max-width height min-height max-height device-width min-device-width max-device-width device-height min-device-height max-device-height aspect-ratio min-aspect-ratio max-aspect-ratio device-aspect-ratio min-device-aspect-ratio max-device-aspect-ratio color min-color max-color color-index min-color-index max-color-index monochrome min-monochrome max-monochrome resolution min-resolution max-resolution scan grid orientation device-pixel-ratio min-device-pixel-ratio max-device-pixel-ratio pointer any-pointer hover any-hover\".split(\" \"),\nt=l(C),H=\"landscape portrait none coarse fine on-demand hover interlace progressive\".split(\" \"),D=l(H),I=\"align-content align-items align-self alignment-adjust alignment-baseline anchor-point animation animation-delay animation-direction animation-duration animation-fill-mode animation-iteration-count animation-name animation-play-state animation-timing-function appearance azimuth backface-visibility background background-attachment background-blend-mode background-clip background-color background-image background-origin background-position background-repeat background-size baseline-shift binding bleed bookmark-label bookmark-level bookmark-state bookmark-target border border-bottom border-bottom-color border-bottom-left-radius border-bottom-right-radius border-bottom-style border-bottom-width border-collapse border-color border-image border-image-outset border-image-repeat border-image-slice border-image-source border-image-width border-left border-left-color border-left-style border-left-width border-radius border-right border-right-color border-right-style border-right-width border-spacing border-style border-top border-top-color border-top-left-radius border-top-right-radius border-top-style border-top-width border-width bottom box-decoration-break box-shadow box-sizing break-after break-before break-inside caption-side clear clip color color-profile column-count column-fill column-gap column-rule column-rule-color column-rule-style column-rule-width column-span column-width columns content counter-increment counter-reset crop cue cue-after cue-before cursor direction display dominant-baseline drop-initial-after-adjust drop-initial-after-align drop-initial-before-adjust drop-initial-before-align drop-initial-size drop-initial-value elevation empty-cells fit fit-position flex flex-basis flex-direction flex-flow flex-grow flex-shrink flex-wrap float float-offset flow-from flow-into font font-feature-settings font-family font-kerning font-language-override font-size font-size-adjust font-stretch font-style font-synthesis font-variant font-variant-alternates font-variant-caps font-variant-east-asian font-variant-ligatures font-variant-numeric font-variant-position font-weight grid grid-area grid-auto-columns grid-auto-flow grid-auto-rows grid-column grid-column-end grid-column-gap grid-column-start grid-gap grid-row grid-row-end grid-row-gap grid-row-start grid-template grid-template-areas grid-template-columns grid-template-rows hanging-punctuation height hyphens icon image-orientation image-rendering image-resolution inline-box-align justify-content left letter-spacing line-break line-height line-stacking line-stacking-ruby line-stacking-shift line-stacking-strategy list-style list-style-image list-style-position list-style-type margin margin-bottom margin-left margin-right margin-top marker-offset marks marquee-direction marquee-loop marquee-play-count marquee-speed marquee-style max-height max-width min-height min-width move-to nav-down nav-index nav-left nav-right nav-up object-fit object-position opacity order orphans outline outline-color outline-offset outline-style outline-width overflow overflow-style overflow-wrap overflow-x overflow-y padding padding-bottom padding-left padding-right padding-top page page-break-after page-break-before page-break-inside page-policy pause pause-after pause-before perspective perspective-origin pitch pitch-range play-during position presentation-level punctuation-trim quotes region-break-after region-break-before region-break-inside region-fragment rendering-intent resize rest rest-after rest-before richness right rotation rotation-point ruby-align ruby-overhang ruby-position ruby-span shape-image-threshold shape-inside shape-margin shape-outside size speak speak-as speak-header speak-numeral speak-punctuation speech-rate stress string-set tab-size table-layout target target-name target-new target-position text-align text-align-last text-decoration text-decoration-color text-decoration-line text-decoration-skip text-decoration-style text-emphasis text-emphasis-color text-emphasis-position text-emphasis-style text-height text-indent text-justify text-outline text-overflow text-shadow text-size-adjust text-space-collapse text-transform text-underline-position text-wrap top transform transform-origin transform-style transition transition-delay transition-duration transition-property transition-timing-function unicode-bidi vertical-align visibility voice-balance voice-duration voice-family voice-pitch voice-range voice-rate voice-stress voice-volume volume white-space widows width word-break word-spacing word-wrap z-index clip-path clip-rule mask enable-background filter flood-color flood-opacity lighting-color stop-color stop-opacity pointer-events color-interpolation color-interpolation-filters color-rendering fill fill-opacity fill-rule image-rendering marker marker-end marker-mid marker-start shape-rendering stroke stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-rendering baseline-shift dominant-baseline glyph-orientation-horizontal glyph-orientation-vertical text-anchor writing-mode\".split(\" \"),\nu=l(I),E=\"scrollbar-arrow-color scrollbar-base-color scrollbar-dark-shadow-color scrollbar-face-color scrollbar-highlight-color scrollbar-shadow-color scrollbar-3d-light-color scrollbar-track-color shape-inside searchfield-cancel-button searchfield-decoration searchfield-results-button searchfield-results-decoration zoom\".split(\" \"),v=l(E),w=l(\"font-family src unicode-range font-variant font-feature-settings font-stretch font-weight font-style\".split(\" \")),F=l(\"additive-symbols fallback negative pad prefix range speak-as suffix symbols system\".split(\" \")),\nJ=\"aliceblue antiquewhite aqua aquamarine azure beige bisque black blanchedalmond blue blueviolet brown burlywood cadetblue chartreuse chocolate coral cornflowerblue cornsilk crimson cyan darkblue darkcyan darkgoldenrod darkgray darkgreen darkkhaki darkmagenta darkolivegreen darkorange darkorchid darkred darksalmon darkseagreen darkslateblue darkslategray darkturquoise darkviolet deeppink deepskyblue dimgray dodgerblue firebrick floralwhite forestgreen fuchsia gainsboro ghostwhite gold goldenrod gray grey green greenyellow honeydew hotpink indianred indigo ivory khaki lavender lavenderblush lawngreen lemonchiffon lightblue lightcoral lightcyan lightgoldenrodyellow lightgray lightgreen lightpink lightsalmon lightseagreen lightskyblue lightslategray lightsteelblue lightyellow lime limegreen linen magenta maroon mediumaquamarine mediumblue mediumorchid mediumpurple mediumseagreen mediumslateblue mediumspringgreen mediumturquoise mediumvioletred midnightblue mintcream mistyrose moccasin navajowhite navy oldlace olive olivedrab orange orangered orchid palegoldenrod palegreen paleturquoise palevioletred papayawhip peachpuff peru pink plum powderblue purple rebeccapurple red rosybrown royalblue saddlebrown salmon sandybrown seagreen seashell sienna silver skyblue slateblue slategray snow springgreen steelblue tan teal thistle tomato turquoise violet wheat white whitesmoke yellow yellowgreen\".split(\" \"),\nz=l(J),L=\"above absolute activeborder additive activecaption afar after-white-space ahead alias all all-scroll alphabetic alternate always amharic amharic-abegede antialiased appworkspace arabic-indic armenian asterisks attr auto avoid avoid-column avoid-page avoid-region background backwards baseline below bidi-override binary bengali blink block block-axis bold bolder border border-box both bottom break break-all break-word bullets button button-bevel buttonface buttonhighlight buttonshadow buttontext calc cambodian capitalize caps-lock-indicator caption captiontext caret cell center checkbox circle cjk-decimal cjk-earthly-branch cjk-heavenly-stem cjk-ideographic clear clip close-quote col-resize collapse color color-burn color-dodge column column-reverse compact condensed contain content content-box context-menu continuous copy counter counters cover crop cross crosshair currentcolor cursive cyclic darken dashed decimal decimal-leading-zero default default-button dense destination-atop destination-in destination-out destination-over devanagari difference disc discard disclosure-closed disclosure-open document dot-dash dot-dot-dash dotted double down e-resize ease ease-in ease-in-out ease-out element ellipse ellipsis embed end ethiopic ethiopic-abegede ethiopic-abegede-am-et ethiopic-abegede-gez ethiopic-abegede-ti-er ethiopic-abegede-ti-et ethiopic-halehame-aa-er ethiopic-halehame-aa-et ethiopic-halehame-am-et ethiopic-halehame-gez ethiopic-halehame-om-et ethiopic-halehame-sid-et ethiopic-halehame-so-et ethiopic-halehame-ti-er ethiopic-halehame-ti-et ethiopic-halehame-tig ethiopic-numeric ew-resize exclusion expanded extends extra-condensed extra-expanded fantasy fast fill fixed flat flex flex-end flex-start footnotes forwards from geometricPrecision georgian graytext grid groove gujarati gurmukhi hand hangul hangul-consonant hard-light hebrew help hidden hide higher highlight highlighttext hiragana hiragana-iroha horizontal hsl hsla hue icon ignore inactiveborder inactivecaption inactivecaptiontext infinite infobackground infotext inherit initial inline inline-axis inline-block inline-flex inline-grid inline-table inset inside intrinsic invert italic japanese-formal japanese-informal justify kannada katakana katakana-iroha keep-all khmer korean-hangul-formal korean-hanja-formal korean-hanja-informal landscape lao large larger left level lighter lighten line-through linear linear-gradient lines list-item listbox listitem local logical loud lower lower-alpha lower-armenian lower-greek lower-hexadecimal lower-latin lower-norwegian lower-roman lowercase ltr luminosity malayalam match matrix matrix3d media-controls-background media-current-time-display media-fullscreen-button media-mute-button media-play-button media-return-to-realtime-button media-rewind-button media-seek-back-button media-seek-forward-button media-slider media-sliderthumb media-time-remaining-display media-volume-slider media-volume-slider-container media-volume-sliderthumb medium menu menulist menulist-button menulist-text menulist-textfield menutext message-box middle min-intrinsic mix mongolian monospace move multiple multiply myanmar n-resize narrower ne-resize nesw-resize no-close-quote no-drop no-open-quote no-repeat none normal not-allowed nowrap ns-resize numbers numeric nw-resize nwse-resize oblique octal open-quote optimizeLegibility optimizeSpeed oriya oromo outset outside outside-shape overlay overline padding padding-box painted page paused persian perspective plus-darker plus-lighter pointer polygon portrait pre pre-line pre-wrap preserve-3d progress push-button radial-gradient radio read-only read-write read-write-plaintext-only rectangle region relative repeat repeating-linear-gradient repeating-radial-gradient repeat-x repeat-y reset reverse rgb rgba ridge right rotate rotate3d rotateX rotateY rotateZ round row row-resize row-reverse rtl run-in running s-resize sans-serif saturation scale scale3d scaleX scaleY scaleZ screen scroll scrollbar se-resize searchfield searchfield-cancel-button searchfield-decoration searchfield-results-button searchfield-results-decoration semi-condensed semi-expanded separate serif show sidama simp-chinese-formal simp-chinese-informal single skew skewX skewY skip-white-space slide slider-horizontal slider-vertical sliderthumb-horizontal sliderthumb-vertical slow small small-caps small-caption smaller soft-light solid somali source-atop source-in source-out source-over space space-around space-between spell-out square square-button start static status-bar stretch stroke sub subpixel-antialiased super sw-resize symbolic symbols table table-caption table-cell table-column table-column-group table-footer-group table-header-group table-row table-row-group tamil telugu text text-bottom text-top textarea textfield thai thick thin threeddarkshadow threedface threedhighlight threedlightshadow threedshadow tibetan tigre tigrinya-er tigrinya-er-abegede tigrinya-et tigrinya-et-abegede to top trad-chinese-formal trad-chinese-informal translate translate3d translateX translateY translateZ transparent ultra-condensed ultra-expanded underline up upper-alpha upper-armenian upper-greek upper-hexadecimal upper-latin upper-norwegian upper-roman uppercase urdu url var vertical vertical-text visible visibleFill visiblePainted visibleStroke visual w-resize wait wave wider window windowframe windowtext words wrap wrap-reverse x-large x-small xor xx-large xx-small\".split(\" \"),\nA=l(L),y=y.concat(B).concat(C).concat(H).concat(I).concat(E).concat(J).concat(L);k.registerHelper(\"hintWords\",\"css\",y);k.defineMIME(\"text/css\",{documentTypes:G,mediaTypes:r,mediaFeatures:t,mediaValueKeywords:D,propertyKeywords:u,nonStandardPropertyKeywords:v,fontProperties:w,counterDescriptors:F,colorKeywords:z,valueKeywords:A,tokenHooks:{\"/\":function(d,e){if(!d.eat(\"*\"))return!1;e.tokenize=m;return m(d,e)}},name:\"css\"});k.defineMIME(\"text/x-scss\",{mediaTypes:r,mediaFeatures:t,mediaValueKeywords:D,\npropertyKeywords:u,nonStandardPropertyKeywords:v,colorKeywords:z,valueKeywords:A,fontProperties:w,allowNested:!0,tokenHooks:{\"/\":function(d,e){return d.eat(\"/\")?(d.skipToEnd(),[\"comment\",\"comment\"]):d.eat(\"*\")?(e.tokenize=m,m(d,e)):[\"operator\",\"operator\"]},\":\":function(d){return d.match(/\\s*\\{/)?[null,\"{\"]:!1},$:function(d){d.match(/^[\\w-]+/);return d.match(/^\\s*:/,!1)?[\"variable-2\",\"variable-definition\"]:[\"variable-2\",\"variable\"]},\"#\":function(d){return d.eat(\"{\")?[null,\"interpolation\"]:!1}},name:\"css\",\nhelperType:\"scss\"});k.defineMIME(\"text/x-less\",{mediaTypes:r,mediaFeatures:t,mediaValueKeywords:D,propertyKeywords:u,nonStandardPropertyKeywords:v,colorKeywords:z,valueKeywords:A,fontProperties:w,allowNested:!0,tokenHooks:{\"/\":function(d,e){return d.eat(\"/\")?(d.skipToEnd(),[\"comment\",\"comment\"]):d.eat(\"*\")?(e.tokenize=m,m(d,e)):[\"operator\",\"operator\"]},\"@\":function(d){if(d.eat(\"{\"))return[null,\"interpolation\"];if(d.match(/^(charset|document|font-face|import|(-(moz|ms|o|webkit)-)?keyframes|media|namespace|page|supports)\\b/,\n!1))return!1;d.eatWhile(/[\\w\\\\\\-]/);return d.match(/^\\s*:/,!1)?[\"variable-2\",\"variable-definition\"]:[\"variable-2\",\"variable\"]},\"&\":function(){return[\"atom\",\"atom\"]}},name:\"css\",helperType:\"less\"});k.defineMIME(\"text/x-gss\",{documentTypes:G,mediaTypes:r,mediaFeatures:t,propertyKeywords:u,nonStandardPropertyKeywords:v,fontProperties:w,counterDescriptors:F,colorKeywords:z,valueKeywords:A,supportsAtComponent:!0,tokenHooks:{\"/\":function(d,e){if(!d.eat(\"*\"))return!1;e.tokenize=m;return m(d,e)}},name:\"css\",\nhelperType:\"gss\"})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/cypher/cypher.js",
    "content": "'use strict';(function(d){\"object\"==typeof exports&&\"object\"==typeof module?d(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],d):d(CodeMirror)})(function(d){var g=function(c){return new RegExp(\"^(?:\"+c.join(\"|\")+\")$\",\"i\")};d.defineMode(\"cypher\",function(c){var p=function(b){var a=b.next();if('\"'===a||\"'\"===a)return b.match(/.+?[\"']/),\"string\";if(/[{}\\(\\),\\.;\\[\\]]/.test(a))return e=a,\"node\";if(\"/\"===a&&b.eat(\"/\"))return b.skipToEnd(),\"comment\";\nif(k.test(a))return b.eatWhile(k),null;b.eatWhile(/[_\\w\\d]/);if(b.eat(\":\"))return b.eatWhile(/[\\w\\d_\\-]/),\"atom\";b=b.current();return l.test(b)?\"builtin\":m.test(b)?\"def\":n.test(b)?\"keyword\":\"variable\"},f=function(b,a,c){return b.context={prev:b.context,indent:b.indent,col:c,type:a}},h=function(b){b.indent=b.context.indent;return b.context=b.context.prev},q=c.indentUnit,e,l=g(\"abs acos allShortestPaths asin atan atan2 avg ceil coalesce collect cos cot count degrees e endnode exp extract filter floor haversin head id keys labels last left length log log10 lower ltrim max min node nodes percentileCont percentileDisc pi radians rand range reduce rel relationship relationships replace reverse right round rtrim shortestPath sign sin size split sqrt startnode stdev stdevp str substring sum tail tan timestamp toFloat toInt toString trim type upper\".split(\" \")),\nm=g(\"all and any contains exists has in none not or single xor\".split(\" \")),n=g(\"as asc ascending assert by case commit constraint create csv cypher delete desc descending detach distinct drop else end ends explain false fieldterminator foreach from headers in index is join limit load match merge null on optional order periodic profile remove return scan set skip start starts then true union unique unwind using when where with call yield\".split(\" \")),k=/[*+\\-<>=&|~%^]/;return{startState:function(){return{tokenize:p,\ncontext:null,indent:0,col:0}},token:function(b,a){b.sol()&&(a.context&&null==a.context.align&&(a.context.align=!1),a.indent=b.indentation());if(b.eatSpace())return null;var c=a.tokenize(b,a);\"comment\"!==c&&a.context&&null==a.context.align&&\"pattern\"!==a.context.type&&(a.context.align=!0);if(\"(\"===e)f(a,\")\",b.column());else if(\"[\"===e)f(a,\"]\",b.column());else if(\"{\"===e)f(a,\"}\",b.column());else if(/[\\]\\}\\)]/.test(e)){for(;a.context&&\"pattern\"===a.context.type;)h(a);a.context&&e===a.context.type&&h(a)}else\".\"===\ne&&a.context&&\"pattern\"===a.context.type?h(a):/atom|string|variable/.test(c)&&a.context&&(/[\\}\\]]/.test(a.context.type)?f(a,\"pattern\",b.column()):\"pattern\"!==a.context.type||a.context.align||(a.context.align=!0,a.context.col=b.column()));return c},indent:function(b,a){a=a&&a.charAt(0);b=b.context;if(/[\\]\\}]/.test(a))for(;b&&\"pattern\"===b.type;)b=b.prev;a=b&&a===b.type;return b?\"keywords\"===b.type?d.commands.newlineAndIndent:b.align?b.col+(a?0:1):b.indent+(a?0:q):0}}});d.modeExtensions.cypher={autoFormatLineBreaks:function(c){var d,\nf;d=c.split(\"\\n\");f=/\\s+\\b(return|where|order by|match|with|skip|limit|create|delete|set)\\b\\s/g;for(c=0;c<d.length;c++)d[c]=d[c].replace(f,\" \\n$1 \").trim();return d.join(\"\\n\")}};d.defineMIME(\"application/x-cypher-query\",\"cypher\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/d/d.js",
    "content": "'use strict';(function(f){\"object\"==typeof exports&&\"object\"==typeof module?f(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],f):f(CodeMirror)})(function(f){function h(k){var g={};k=k.split(\" \");for(var f=0;f<k.length;++f)g[k[f]]=!0;return g}f.defineMode(\"d\",function(k,g){function h(a,b){var c=a.next();if(q[c]){var d=q[c](a,b);if(!1!==d)return d}if('\"'==c||\"'\"==c||\"`\"==c)return b.tokenize=v(c),b.tokenize(a,b);if(/[\\[\\]{}\\(\\),;\\:\\.]/.test(c))return e=\nc,null;if(/\\d/.test(c))return a.eatWhile(/[\\w\\.]/),\"number\";if(\"/\"==c){if(a.eat(\"+\")){b.tokenize=n;for(c=!1;d=a.next();){if(\"/\"==d&&c){b.tokenize=null;break}c=\"+\"==d}return\"comment\"}if(a.eat(\"*\"))return b.tokenize=n,n(a,b);if(a.eat(\"/\"))return a.skipToEnd(),\"comment\"}if(r.test(c))return a.eatWhile(r),\"operator\";a.eatWhile(/[\\w\\$_\\xa1-\\uffff]/);a=a.current();return w.propertyIsEnumerable(a)?(t.propertyIsEnumerable(a)&&(e=\"newstatement\"),\"keyword\"):x.propertyIsEnumerable(a)?(t.propertyIsEnumerable(a)&&\n(e=\"newstatement\"),\"builtin\"):y.propertyIsEnumerable(a)?\"atom\":\"variable\"}function v(a){return function(b,c){for(var d=!1,e,f=!1;null!=(e=b.next());){if(e==a&&!d){f=!0;break}d=!d&&\"\\\\\"==e}if(f||!d&&!z)c.tokenize=null;return\"string\"}}function n(a,b){for(var c=!1,d;d=a.next();){if(\"/\"==d&&c){b.tokenize=null;break}c=\"*\"==d}return\"comment\"}function u(a,b,c,d,e){this.indented=a;this.column=b;this.type=c;this.align=d;this.prev=e}function m(a,b,c){var d=a.indented;a.context&&\"statement\"==a.context.type&&\n(d=a.context.indented);return a.context=new u(d,b,c,null,a.context)}function l(a){var b=a.context.type;if(\")\"==b||\"]\"==b||\"}\"==b)a.indented=a.context.indented;return a.context=a.context.prev}var p=k.indentUnit,A=g.statementIndentUnit||p,w=g.keywords||{},x=g.builtin||{},t=g.blockKeywords||{},y=g.atoms||{},q=g.hooks||{},z=g.multiLineStrings,r=/[+\\-*&%=<>!?|\\/]/,e;return{startState:function(a){return{tokenize:null,context:new u((a||0)-p,0,\"top\",!1),indented:0,startOfLine:!0}},token:function(a,b){var c=\nb.context;a.sol()&&(null==c.align&&(c.align=!1),b.indented=a.indentation(),b.startOfLine=!0);if(a.eatSpace())return null;e=null;var d=(b.tokenize||h)(a,b);if(\"comment\"==d||\"meta\"==d)return d;null==c.align&&(c.align=!0);if(\";\"!=e&&\":\"!=e&&\",\"!=e||\"statement\"!=c.type)if(\"{\"==e)m(b,a.column(),\"}\");else if(\"[\"==e)m(b,a.column(),\"]\");else if(\"(\"==e)m(b,a.column(),\")\");else if(\"}\"==e){for(;\"statement\"==c.type;)c=l(b);for(\"}\"==c.type&&(c=l(b));\"statement\"==c.type;)c=l(b)}else e==c.type?l(b):((\"}\"==c.type||\n\"top\"==c.type)&&\";\"!=e||\"statement\"==c.type&&\"newstatement\"==e)&&m(b,a.column(),\"statement\");else l(b);b.startOfLine=!1;return d},indent:function(a,b){if(a.tokenize!=h&&null!=a.tokenize)return f.Pass;a=a.context;b=b&&b.charAt(0);\"statement\"==a.type&&\"}\"==b&&(a=a.prev);var c=b==a.type;return\"statement\"==a.type?a.indented+(\"{\"==b?0:A):a.align?a.column+(c?0:1):a.indented+(c?0:p)},electricChars:\"{}\"}});f.defineMIME(\"text/x-d\",{name:\"d\",keywords:h(\"abstract alias align asm assert auto break case cast cdouble cent cfloat const continue debug default delegate delete deprecated export extern final finally function goto immutable import inout invariant is lazy macro module new nothrow override package pragma private protected public pure ref return shared short static super synchronized template this throw typedef typeid typeof volatile __FILE__ __LINE__ __gshared __traits __vector __parameters body catch class do else enum for foreach foreach_reverse if in interface mixin out scope struct switch try union unittest version while with\"),\nblockKeywords:h(\"body catch class do else enum for foreach foreach_reverse if in interface mixin out scope struct switch try union unittest version while with\"),builtin:h(\"bool byte char creal dchar double float idouble ifloat int ireal long real short ubyte ucent uint ulong ushort wchar wstring void size_t sizediff_t\"),atoms:h(\"exit failure success true false null\"),hooks:{\"@\":function(f,g){f.eatWhile(/[\\w\\$_]/);return\"meta\"}}})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/dart/dart.js",
    "content": "'use strict';(function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\"),require(\"../clike/clike\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\",\"../clike/clike\"],e):e(CodeMirror)})(function(e){function d(b){for(var a={},c=0;c<b.length;++c)a[b[c]]=!0;return a}function f(b,a,c,e){function d(a,c){for(var d=!1;!a.eol();){if(!e&&!d&&\"$\"==a.peek()){a=c;(a.interpolationStack||(a.interpolationStack=[])).push(a.tokenize);c.tokenize=n;break}var h=\na.next();if(h==b&&!d&&(!f||a.match(b+b))){c.tokenize=null;break}d=!e&&!d&&\"\\\\\"==h}return\"string\"}var f=!1;if(a.eat(b))if(a.eat(b))f=!0;else return\"string\";c.tokenize=d;return d(a,c)}function n(b,a){b.eat(\"$\");b.eat(\"{\")?a.tokenize=null:a.tokenize=p;return null}function p(b,a){b.eatWhile(/[\\w_]/);a.tokenize=(a.interpolationStack||(a.interpolationStack=[])).pop();return\"variable\"}function g(b){return function(a,c){for(var d;d=a.next();)if(\"*\"==d&&a.eat(\"/\"))if(1==b){c.tokenize=null;break}else return c.tokenize=\ng(b-1),c.tokenize(a,c);else if(\"/\"==d&&a.eat(\"*\"))return c.tokenize=g(b+1),c.tokenize(a,c);return\"comment\"}}var k=\"this super static final const abstract class extends external factory implements get native operator set typedef with enum throw rethrow assert break case continue default in return new deferred async await try catch finally do else for if switch while import library export part of show hide is as\".split(\" \"),l=[\"true\",\"false\",\"null\"],m=\"void bool num int double dynamic var String\".split(\" \");\ne.defineMIME(\"application/dart\",{name:\"clike\",keywords:d(k),blockKeywords:d(\"try catch finally do else for if switch while\".split(\" \")),builtin:d(m),atoms:d(l),hooks:{\"@\":function(b){b.eatWhile(/[\\w\\$_\\.]/);return\"meta\"},\"'\":function(b,a){return f(\"'\",b,a,!1)},'\"':function(b,a){return f('\"',b,a,!1)},r:function(b,a){var c=b.peek();return\"'\"==c||'\"'==c?f(b.next(),b,a,!0):!1},\"}\":function(b,a){return 0<(a.interpolationStack?a.interpolationStack.length:0)?(a.tokenize=(a.interpolationStack||(a.interpolationStack=\n[])).pop(),null):!1},\"/\":function(b,a){if(!b.eat(\"*\"))return!1;a.tokenize=g(1);return a.tokenize(b,a)}}});e.registerHelper(\"hintWords\",\"application/dart\",k.concat(l).concat(m));e.defineMode(\"dart\",function(b){return e.getMode(b,\"application/dart\")},\"clike\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/diff/diff.js",
    "content": "'use strict';(function(a){\"object\"==typeof exports&&\"object\"==typeof module?a(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],a):a(CodeMirror)})(function(a){a.defineMode(\"diff\",function(){var a={\"+\":\"positive\",\"-\":\"negative\",\"@\":\"meta\"};return{token:function(b){var c=b.string.search(/[\\t ]+?$/);if(!b.sol()||0===c)return b.skipToEnd(),(\"error \"+(a[b.string.charAt(0)]||\"\")).replace(/ $/,\"\");var d=a[b.peek()]||b.skipToEnd();-1===c?b.skipToEnd():\nb.pos=c;return d}}});a.defineMIME(\"text/x-diff\",\"diff\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/django/django.js",
    "content": "'use strict';(function(c){\"object\"==typeof exports&&\"object\"==typeof module?c(require(\"../../lib/codemirror\"),require(\"../htmlmixed/htmlmixed\"),require(\"../../addon/mode/overlay\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\",\"../htmlmixed/htmlmixed\",\"../../addon/mode/overlay\"],c):c(CodeMirror)})(function(c){c.defineMode(\"django:inner\",function(){function c(b,a){if(b.match(\"{{\"))return a.tokenize=m,\"tag\";if(b.match(\"{%\"))return a.tokenize=l,\"tag\";if(b.match(\"{#\"))return a.tokenize=\nn,\"comment\";for(;null!=b.next()&&!b.match(/\\{[{%#]/,!1););return null}function d(b,a){return function(c,d){!d.escapeNext&&c.eat(b)?d.tokenize=a:(d.escapeNext&&(d.escapeNext=!1),\"\\\\\"==c.next()&&(d.escapeNext=!0));return\"string\"}}function m(b,a){if(a.waitDot){a.waitDot=!1;if(\".\"!=b.peek())return\"null\";if(b.match(/\\.\\W+/))return\"error\";if(b.eat(\".\"))return a.waitProperty=!0,\"null\";throw Error(\"Unexpected error while waiting for property.\");}if(a.waitPipe){a.waitPipe=!1;if(\"|\"!=b.peek())return\"null\";\nif(b.match(/\\.\\W+/))return\"error\";if(b.eat(\"|\"))return a.waitFilter=!0,\"null\";throw Error(\"Unexpected error while waiting for filter.\");}if(a.waitProperty&&(a.waitProperty=!1,b.match(/\\b(\\w+)\\b/)))return a.waitDot=!0,a.waitPipe=!0,\"property\";if(a.waitFilter&&(a.waitFilter=!1,b.match(f)))return\"variable-2\";if(b.eatSpace())return a.waitProperty=!1,\"null\";if(b.match(/\\b\\d+(\\.\\d+)?\\b/))return\"number\";if(b.match(\"'\"))return a.tokenize=d(\"'\",a.tokenize),\"string\";if(b.match('\"'))return a.tokenize=d('\"',\na.tokenize),\"string\";if(b.match(/\\b(\\w+)\\b/)&&!a.foundVariable)return a.waitDot=!0,a.waitPipe=!0,\"variable\";if(b.match(\"}}\"))return a.waitProperty=null,a.waitFilter=null,a.waitDot=null,a.waitPipe=null,a.tokenize=c,\"tag\";b.next();return\"null\"}function l(b,a){if(a.waitDot){a.waitDot=!1;if(\".\"!=b.peek())return\"null\";if(b.match(/\\.\\W+/))return\"error\";if(b.eat(\".\"))return a.waitProperty=!0,\"null\";throw Error(\"Unexpected error while waiting for property.\");}if(a.waitPipe){a.waitPipe=!1;if(\"|\"!=b.peek())return\"null\";\nif(b.match(/\\.\\W+/))return\"error\";if(b.eat(\"|\"))return a.waitFilter=!0,\"null\";throw Error(\"Unexpected error while waiting for filter.\");}if(a.waitProperty&&(a.waitProperty=!1,b.match(/\\b(\\w+)\\b/)))return a.waitDot=!0,a.waitPipe=!0,\"property\";if(a.waitFilter&&(a.waitFilter=!1,b.match(f)))return\"variable-2\";if(b.eatSpace())return a.waitProperty=!1,\"null\";if(b.match(/\\b\\d+(\\.\\d+)?\\b/))return\"number\";if(b.match(\"'\"))return a.tokenize=d(\"'\",a.tokenize),\"string\";if(b.match('\"'))return a.tokenize=d('\"',\na.tokenize),\"string\";if(b.match(g))return\"operator\";if(b.match(h))return\"keyword\";var e=b.match(k);if(e)return\"comment\"==e[0]&&(a.blockCommentTag=!0),\"keyword\";if(b.match(/\\b(\\w+)\\b/))return a.waitDot=!0,a.waitPipe=!0,\"variable\";if(b.match(\"%}\"))return a.waitProperty=null,a.waitFilter=null,a.waitDot=null,a.waitPipe=null,a.blockCommentTag?(a.blockCommentTag=!1,a.tokenize=p):a.tokenize=c,\"tag\";b.next();return\"null\"}function n(b,a){b.match(/^.*?#\\}/)?a.tokenize=c:b.skipToEnd();return\"comment\"}function p(b,\na){if(b.match(/\\{%\\s*endcomment\\s*%\\}/,!1))return a.tokenize=l,b.match(\"{%\"),\"tag\";b.next();return\"comment\"}var k=\"block endblock for endfor true false filter endfilter loop none self super if elif endif as else import with endwith without context ifequal endifequal ifnotequal endifnotequal extends include load comment endcomment empty url static trans blocktrans endblocktrans now regroup lorem ifchanged endifchanged firstof debug cycle csrf_token autoescape endautoescape spaceless endspaceless ssi templatetag verbatim endverbatim widthratio\".split(\" \"),\nf=\"add addslashes capfirst center cut date default default_if_none dictsort dictsortreversed divisibleby escape escapejs filesizeformat first floatformat force_escape get_digit iriencode join last length length_is linebreaks linebreaksbr linenumbers ljust lower make_list phone2numeric pluralize pprint random removetags rjust safe safeseq slice slugify stringformat striptags time timesince timeuntil title truncatechars truncatechars_html truncatewords truncatewords_html unordered_list upper urlencode urlize urlizetrunc wordcount wordwrap yesno\".split(\" \"),\ng=\"== != < > <= >=\".split(\" \"),h=[\"in\",\"not\",\"or\",\"and\"],k=new RegExp(\"^\\\\b(\"+k.join(\"|\")+\")\\\\b\"),f=new RegExp(\"^\\\\b(\"+f.join(\"|\")+\")\\\\b\"),g=new RegExp(\"^\\\\b(\"+g.join(\"|\")+\")\\\\b\"),h=new RegExp(\"^\\\\b(\"+h.join(\"|\")+\")\\\\b\");return{startState:function(){return{tokenize:c}},token:function(b,a){return a.tokenize(b,a)},blockCommentStart:\"{% comment %}\",blockCommentEnd:\"{% endcomment %}\"}});c.defineMode(\"django\",function(e){var d=c.getMode(e,\"text/html\");e=c.getMode(e,\"django:inner\");return c.overlayMode(d,\ne)});c.defineMIME(\"text/x-django\",\"django\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/dockerfile/dockerfile.js",
    "content": "'use strict';(function(a){\"object\"==typeof exports&&\"object\"==typeof module?a(require(\"../../lib/codemirror\"),require(\"../../addon/mode/simple\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\",\"../../addon/mode/simple\"],a):a(CodeMirror)})(function(a){a.defineSimpleMode(\"dockerfile\",{start:[{regex:/#.*$/,token:\"comment\"},{regex:/(from|maintainer|run|cmd|expose|env|add|copy|entrypoint|volume|user|workdir|onbuild)\\s*$/i,token:\"variable-2\"},{regex:/(from|maintainer|run|cmd|expose|env|add|copy|entrypoint|volume|user|workdir|onbuild)(\\s+)/i,\ntoken:[\"variable-2\",null],next:\"arguments\"},{regex:/./,token:null}],arguments:[{regex:/#.*$/,token:\"error\",next:\"start\"},{regex:/[^#]+\\\\$/,token:null},{regex:/[^#]+/,token:null,next:\"start\"},{regex:/$/,token:null,next:\"start\"},{token:null,next:\"start\"}],meta:{lineComment:\"#\"}});a.defineMIME(\"text/x-dockerfile\",\"dockerfile\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/dtd/dtd.js",
    "content": "'use strict';(function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],e):e(CodeMirror)})(function(e){e.defineMode(\"dtd\",function(e){function f(b,a){d=a;return b}function g(b,a){var c=b.next();if(\"<\"==c&&b.eat(\"!\")){if(b.eatWhile(/[\\-]/))return a.tokenize=h,h(b,a);if(b.eatWhile(/[\\w]/))return f(\"keyword\",\"doindent\")}else{if(\"<\"==c&&b.eat(\"?\"))return a.tokenize=k(\"meta\",\"?>\"),f(\"meta\",c);if(\"#\"==\nc&&b.eatWhile(/[\\w]/))return f(\"atom\",\"tag\");if(\"|\"==c)return f(\"keyword\",\"seperator\");if(c.match(/[\\(\\)\\[\\]\\-\\.,\\+\\?>]/))return f(null,c);if(c.match(/[\\[\\]]/))return f(\"rule\",c);if('\"'==c||\"'\"==c)return a.tokenize=l(c),a.tokenize(b,a);if(b.eatWhile(/[a-zA-Z\\?\\+\\d]/))return a=b.current(),null!==a.substr(a.length-1,a.length).match(/\\?|\\+/)&&b.backUp(1),f(\"tag\",\"tag\");if(\"%\"==c||\"*\"==c)return f(\"number\",\"number\");b.eatWhile(/[\\w\\\\\\-_%.{,]/);return f(null,null)}}function h(b,a){for(var c=0,d;null!=(d=\nb.next());){if(2<=c&&\">\"==d){a.tokenize=g;break}c=\"-\"==d?c+1:0}return f(\"comment\",\"comment\")}function l(b){return function(a,c){for(var d=!1,e;null!=(e=a.next());){if(e==b&&!d){c.tokenize=g;break}d=!d&&\"\\\\\"==e}return f(\"string\",\"tag\")}}function k(b,a){return function(c,d){for(;!c.eol();){if(c.match(a)){d.tokenize=g;break}c.next()}return b}}var m=e.indentUnit,d;return{startState:function(b){return{tokenize:g,baseIndent:b||0,stack:[]}},token:function(b,a){if(b.eatSpace())return null;var c=a.tokenize(b,\na),e=a.stack[a.stack.length-1];\"[\"==b.current()||\"doindent\"===d||\"[\"==d?a.stack.push(\"rule\"):\"endtag\"===d?a.stack[a.stack.length-1]=\"endtag\":\"]\"==b.current()||\"]\"==d||\">\"==d&&\"rule\"==e?a.stack.pop():\"[\"==d&&a.stack.push(\"[\");return c},indent:function(b,a){var c=b.stack.length;if(a.match(/\\]\\s+|\\]/))--c;else if(\">\"===a.substr(a.length-1,a.length)){if(\"<\"!==a.substr(0,1)&&!(\"doindent\"==d&&1<a.length))if(\"doindent\"==d)c--;else if(!(\">\"==d&&1<a.length||\"tag\"==d&&\">\"!==a))if(\"tag\"==d&&\"rule\"==b.stack[b.stack.length-\n1])c--;else if(\"tag\"==d)c++;else if(\">\"===a&&\"rule\"==b.stack[b.stack.length-1]&&\">\"===d)c--;else if(\">\"!==a||\"rule\"!=b.stack[b.stack.length-1])\"<\"!==a.substr(0,1)&&\">\"===a.substr(0,1)?--c:\">\"!==a&&--c;null!=d&&\"]\"!=d||c--}return b.baseIndent+c*m},electricChars:\"]>\"}});e.defineMIME(\"application/xml-dtd\",\"dtd\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/dylan/dylan.js",
    "content": "'use strict';(function(f){\"object\"==typeof exports&&\"object\"==typeof module?f(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],f):f(CodeMirror)})(function(f){f.defineMode(\"dylan\",function(f){function k(a,e,b){e.tokenize=b;return b(a,e)}function l(a,e){var b=a.peek();if(\"'\"==b||'\"'==b)return a.next(),k(a,e,m(b,\"string\"));if(\"/\"==b){a.next();if(a.eat(\"*\"))return k(a,e,q);if(a.eat(\"/\"))return a.skipToEnd(),\"comment\";a.backUp(1)}else if(/[+\\-\\d\\.]/.test(b)){if(a.match(/^[+-]?[0-9]*\\.[0-9]*([esdx][+-]?[0-9]+)?/i)||\na.match(/^[+-]?[0-9]+([esdx][+-]?[0-9]+)/i)||a.match(/^[+-]?\\d+/))return\"number\"}else{if(\"#\"==b){a.next();b=a.peek();if('\"'==b)return a.next(),k(a,e,m('\"',\"string\"));if(\"b\"==b)return a.next(),a.eatWhile(/[01]/),\"number\";if(\"x\"==b)return a.next(),a.eatWhile(/[\\da-f]/i),\"number\";if(\"o\"==b)return a.next(),a.eatWhile(/[0-7]/),\"number\";if(\"#\"==b)return a.next(),\"punctuation\";if(\"[\"==b||\"(\"==b)return a.next(),\"bracket\";if(a.match(/f|t|all-keys|include|key|next|rest/i))return\"atom\";a.eatWhile(/[-a-zA-Z]/);\nreturn\"error\"}if(\"~\"==b)return a.next(),b=a.peek(),\"=\"==b&&(a.next(),b=a.peek(),\"=\"==b&&a.next()),\"operator\";if(\":\"==b){a.next();b=a.peek();if(\"=\"==b)return a.next(),\"operator\";if(\":\"==b)return a.next(),\"punctuation\"}else{if(-1!=\"[](){}\".indexOf(b))return a.next(),\"bracket\";if(-1!=\".,\".indexOf(b))return a.next(),\"punctuation\";if(a.match(\"end\"))return\"keyword\"}}for(var c in d)if(d.hasOwnProperty(c)&&(e=d[c],e instanceof Array&&e.some(function(b){return a.match(b)})||a.match(e)))return r[c];if(/[+\\-*\\/^=<>&|]/.test(b))return a.next(),\n\"operator\";if(a.match(\"define\"))return\"def\";a.eatWhile(/[\\w\\-]/);if(n[a.current()])return p[a.current()];if(a.current().match(t))return\"variable\";a.next();return\"variable-2\"}function q(a,c){for(var b=!1,e=!1,d=0,g;g=a.next();){if(\"/\"==g&&b)if(0<d)d--;else{c.tokenize=l;break}else\"*\"==g&&e&&d++;b=\"*\"==g;e=\"/\"==g}return\"comment\"}function m(a,c){return function(b,e){for(var d=!1,g,f=!1;null!=(g=b.next());){if(g==a&&!d){f=!0;break}d=!d&&\"\\\\\"==g}if(f||!d)e.tokenize=l;return c}}var c={unnamedDefinition:[\"interface\"],\nnamedDefinition:\"module library macro C-struct C-union C-function C-callable-wrapper\".split(\" \"),typeParameterizedDefinition:[\"class\",\"C-subtype\",\"C-mapped-subtype\"],otherParameterizedDefinition:[\"method\",\"function\",\"C-variable\",\"C-address\"],constantSimpleDefinition:[\"constant\"],variableSimpleDefinition:[\"variable\"],otherSimpleDefinition:[\"generic\",\"domain\",\"C-pointer-type\",\"table\"],statement:\"if block begin method case for select when unless until while iterate profiling dynamic-bind\".split(\" \"),\nseparator:\"finally exception cleanup else elseif afterwards\".split(\" \"),other:\"above below by from handler in instance let local otherwise slot subclass then to keyed-by virtual\".split(\" \"),signalingCalls:\"signal error cerror break check-type abort\".split(\" \")};c.otherDefinition=c.unnamedDefinition.concat(c.namedDefinition).concat(c.otherParameterizedDefinition);c.definition=c.typeParameterizedDefinition.concat(c.otherDefinition);c.parameterizedDefinition=c.typeParameterizedDefinition.concat(c.otherParameterizedDefinition);\nc.simpleDefinition=c.constantSimpleDefinition.concat(c.variableSimpleDefinition).concat(c.otherSimpleDefinition);c.keyword=c.statement.concat(c.separator).concat(c.other);var t=/^[-_a-zA-Z?!*@<>$%]+/,d={symbolKeyword:\"[-_a-zA-Z?!*@<>$%]+:\",symbolClass:\"<[-_a-zA-Z?!*@<>$%]+>\",symbolGlobal:\"\\\\*[-_a-zA-Z?!*@<>$%]+\\\\*\",symbolConstant:\"\\\\$[-_a-zA-Z?!*@<>$%]+\"},r={symbolKeyword:\"atom\",symbolClass:\"tag\",symbolGlobal:\"variable-2\",symbolConstant:\"variable-3\"},h;for(h in d)d.hasOwnProperty(h)&&(d[h]=new RegExp(\"^\"+\nd[h]));d.keyword=[/^with(?:out)?-[-_a-zA-Z?!*@<>$%]+/];var u={keyword:\"keyword\",definition:\"def\",simpleDefinition:\"def\",signalingCalls:\"builtin\"},n={},p={};[\"keyword\",\"definition\",\"simpleDefinition\",\"signalingCalls\"].forEach(function(a){c[a].forEach(function(c){n[c]=a;p[c]=u[a]})});return{startState:function(){return{tokenize:l,currentIndent:0}},token:function(a,c){return a.eatSpace()?null:c.tokenize(a,c)},blockCommentStart:\"/*\",blockCommentEnd:\"*/\"}});f.defineMIME(\"text/x-dylan\",\"dylan\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/ebnf/ebnf.js",
    "content": "'use strict';(function(c){\"object\"==typeof exports&&\"object\"==typeof module?c(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],c):c(CodeMirror)})(function(c){c.defineMode(\"ebnf\",function(g){var e=null;g.bracesMode&&(e=c.getMode(g,g.bracesMode));return{startState:function(){return{stringType:null,commentType:null,braced:0,lhs:!0,localState:null,stack:[],inDefinition:!1}},token:function(a,b){if(a){0===b.stack.length&&('\"'==a.peek()||\"'\"==a.peek()?\n(b.stringType=a.peek(),a.next(),b.stack.unshift(1)):a.match(/^\\/\\*/)?(b.stack.unshift(0),b.commentType=0):a.match(/^\\(\\*/)&&(b.stack.unshift(0),b.commentType=1));switch(b.stack[0]){case 1:for(;1===b.stack[0]&&!a.eol();)a.peek()===b.stringType?(a.next(),b.stack.shift()):\"\\\\\"===a.peek()?(a.next(),a.next()):a.match(/^.[^\\\\\\\"\\']*/);return b.lhs?\"property string\":\"string\";case 0:for(;0===b.stack[0]&&!a.eol();)0===b.commentType&&a.match(/\\*\\//)?(b.stack.shift(),b.commentType=null):1===b.commentType&&a.match(/\\*\\)/)?\n(b.stack.shift(),b.commentType=null):a.match(/^.[^\\*]*/);return\"comment\";case 2:for(;2===b.stack[0]&&!a.eol();)a.match(/^[^\\]\\\\]+/)||a.match(/^\\\\./)||b.stack.shift();return\"operator\"}var d=a.peek();if(null!==e&&(b.braced||\"{\"===d)){null===b.localState&&(b.localState=c.startState(e));d=e.token(a,b.localState);a=a.current();if(!d)for(var f=0;f<a.length;f++)\"{\"===a[f]?(0===b.braced&&(d=\"matchingbracket\"),b.braced++):\"}\"===a[f]&&(b.braced--,0===b.braced&&(d=\"matchingbracket\"));return d}switch(d){case \"[\":return a.next(),\nb.stack.unshift(2),\"bracket\";case \":\":case \"|\":case \";\":return a.next(),\"operator\";case \"%\":if(a.match(\"%%\"))return\"header\";if(a.match(/[%][A-Za-z]+/))return\"keyword\";if(a.match(/[%][}]/))return\"matchingbracket\";break;case \"/\":if(a.match(/[\\/][A-Za-z]+/))return\"keyword\";case \"\\\\\":if(a.match(/[\\][a-z]+/))return\"string-2\";case \".\":if(a.match(\".\"))return\"atom\";case \"*\":case \"-\":case \"+\":case \"^\":if(a.match(d))return\"atom\";case \"$\":if(a.match(\"$$\"))return\"builtin\";if(a.match(/[$][0-9]+/))return\"variable-3\";\ncase \"<\":if(a.match(/<<[a-zA-Z_]+>>/))return\"builtin\"}if(a.match(/^\\/\\//))return a.skipToEnd(),\"comment\";if(a.match(/return/))return\"operator\";if(a.match(/^[a-zA-Z_][a-zA-Z0-9_]*/))return a.match(/(?=[\\(.])/)?\"variable\":a.match(/(?=[\\s\\n]*[:=])/)?\"def\":\"variable-2\";if(-1!=[\"[\",\"]\",\"(\",\")\"].indexOf(a.peek()))return a.next(),\"bracket\";a.eatSpace()||a.next();return null}}}});c.defineMIME(\"text/x-ebnf\",\"ebnf\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/ecl/ecl.js",
    "content": "'use strict';(function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],e):e(CodeMirror)})(function(e){e.defineMode(\"ecl\",function(e){function f(a){var b={};a=a.split(\" \");for(var c=0;c<a.length;++c)b[a[c]]=!0;return b}function l(a,b){var c=a.next();if(p[c]){var g=p[c](a,b);if(!1!==g)return g}if('\"'==c||\"'\"==c)return b.tokenize=v(c),b.tokenize(a,b);if(/[\\[\\]{}\\(\\),;\\:\\.]/.test(c))return d=\nc,null;if(/\\d/.test(c))return a.eatWhile(/[\\w\\.]/),\"number\";if(\"/\"==c){if(a.eat(\"*\"))return b.tokenize=q,q(a,b);if(a.eat(\"/\"))return a.skipToEnd(),\"comment\"}if(r.test(c))return a.eatWhile(r),\"operator\";a.eatWhile(/[\\w\\$_]/);a=a.current().toLowerCase();if(w.propertyIsEnumerable(a))return h.propertyIsEnumerable(a)&&(d=\"newstatement\"),\"keyword\";if(x.propertyIsEnumerable(a))return h.propertyIsEnumerable(a)&&(d=\"newstatement\"),\"variable\";if(y.propertyIsEnumerable(a))return h.propertyIsEnumerable(a)&&(d=\n\"newstatement\"),\"variable-2\";if(t.propertyIsEnumerable(a))return h.propertyIsEnumerable(a)&&(d=\"newstatement\"),\"variable-3\";if(z.propertyIsEnumerable(a))return h.propertyIsEnumerable(a)&&(d=\"newstatement\"),\"builtin\";for(b=a.length-1;0<=b&&(!isNaN(a[b])||\"_\"==a[b]);)--b;return 0<b&&(b=a.substr(0,b+1),t.propertyIsEnumerable(b))?(h.propertyIsEnumerable(b)&&(d=\"newstatement\"),\"variable-3\"):A.propertyIsEnumerable(a)?\"atom\":null}function v(a){return function(b,c){for(var g=!1,d,e=!1;null!=(d=b.next());){if(d==\na&&!g){e=!0;break}g=!g&&\"\\\\\"==d}if(e||!g)c.tokenize=l;return\"string\"}}function q(a,b){for(var c=!1,d;d=a.next();){if(\"/\"==d&&c){b.tokenize=l;break}c=\"*\"==d}return\"comment\"}function u(a,b,c,d,e){this.indented=a;this.column=b;this.type=c;this.align=d;this.prev=e}function m(a,b,c){return a.context=new u(a.indented,b,c,null,a.context)}function k(a){var b=a.context.type;if(\")\"==b||\"]\"==b||\"}\"==b)a.indented=a.context.indented;return a.context=a.context.prev}var n=e.indentUnit,w=f(\"abs acos allnodes ascii asin asstring atan atan2 ave case choose choosen choosesets clustersize combine correlation cos cosh count covariance cron dataset dedup define denormalize distribute distributed distribution ebcdic enth error evaluate event eventextra eventname exists exp failcode failmessage fetch fromunicode getisvalid global graph group hash hash32 hash64 hashcrc hashmd5 having if index intformat isvalid iterate join keyunicode length library limit ln local log loop map matched matchlength matchposition matchtext matchunicode max merge mergejoin min nolocal nonempty normalize parse pipe power preload process project pull random range rank ranked realformat recordof regexfind regexreplace regroup rejected rollup round roundup row rowdiff sample set sin sinh sizeof soapcall sort sorted sqrt stepped stored sum table tan tanh thisnode topn tounicode transfer trim truncate typeof ungroup unicodeorder variance which workunit xmldecode xmlencode xmltext xmlunicode\"),\nx=f(\"apply assert build buildindex evaluate fail keydiff keypatch loadxml nothor notify output parallel sequential soapcall wait\"),y=f(\"__compressed__ all and any as atmost before beginc++ best between case const counter csv descend encrypt end endc++ endmacro except exclusive expire export extend false few first flat from full function group header heading hole ifblock import in interface joined keep keyed last left limit load local locale lookup macro many maxcount maxlength min skew module named nocase noroot noscan nosort not of only opt or outer overwrite packed partition penalty physicallength pipe quote record relationship repeat return right scan self separator service shared skew skip sql store terminator thor threshold token transform trim true type unicodeorder unsorted validate virtual whole wild within xml xpath\"),\nt=f(\"ascii big_endian boolean data decimal ebcdic integer pattern qstring real record rule set of string token udecimal unicode unsigned varstring varunicode\"),z=f(\"checkpoint deprecated failcode failmessage failure global independent onwarning persist priority recovery stored success wait when\"),h=f(\"catch class do else finally for if switch try while\"),A=f(\"true false null\"),p={\"#\":function(a,b){if(!b.startOfLine)return!1;a.skipToEnd();return\"meta\"}},r=/[+\\-*&%=<>!?|\\/]/,d;return{startState:function(a){return{tokenize:null,\ncontext:new u((a||0)-n,0,\"top\",!1),indented:0,startOfLine:!0}},token:function(a,b){var c=b.context;a.sol()&&(null==c.align&&(c.align=!1),b.indented=a.indentation(),b.startOfLine=!0);if(a.eatSpace())return null;d=null;var e=(b.tokenize||l)(a,b);if(\"comment\"==e||\"meta\"==e)return e;null==c.align&&(c.align=!0);if(\";\"!=d&&\":\"!=d||\"statement\"!=c.type)if(\"{\"==d)m(b,a.column(),\"}\");else if(\"[\"==d)m(b,a.column(),\"]\");else if(\"(\"==d)m(b,a.column(),\")\");else if(\"}\"==d){for(;\"statement\"==c.type;)c=k(b);for(\"}\"==\nc.type&&(c=k(b));\"statement\"==c.type;)c=k(b)}else d==c.type?k(b):(\"}\"==c.type||\"top\"==c.type||\"statement\"==c.type&&\"newstatement\"==d)&&m(b,a.column(),\"statement\");else k(b);b.startOfLine=!1;return e},indent:function(a,b){if(a.tokenize!=l&&null!=a.tokenize)return 0;a=a.context;b=b&&b.charAt(0);\"statement\"==a.type&&\"}\"==b&&(a=a.prev);var c=b==a.type;return\"statement\"==a.type?a.indented+(\"{\"==b?0:n):a.align?a.column+(c?0:1):a.indented+(c?0:n)},electricChars:\"{}\"}});e.defineMIME(\"text/x-ecl\",\"ecl\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/eiffel/eiffel.js",
    "content": "'use strict';(function(d){\"object\"==typeof exports&&\"object\"==typeof module?d(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],d):d(CodeMirror)})(function(d){d.defineMode(\"eiffel\",function(){function d(b){for(var a={},c=0,d=b.length;c<d;++c)a[b[c]]=!0;return a}function e(b,a){if(b.eatSpace())return null;var c=b.next();return'\"'==c||\"'\"==c?(c=h(c,\"string\"),a.tokenize.push(c),c(b,a)):\"-\"==c&&b.eat(\"-\")?(b.skipToEnd(),\"comment\"):\":\"==c&&b.eat(\"=\")?\n\"operator\":/[0-9]/.test(c)?(b.eatWhile(/[xXbBCc0-9\\.]/),b.eat(/[\\?\\!]/),\"ident\"):/[a-zA-Z_0-9]/.test(c)?(b.eatWhile(/[a-zA-Z_0-9]/),b.eat(/[\\?\\!]/),\"ident\"):/[=+\\-\\/*^%<>~]/.test(c)?(b.eatWhile(/[=+\\-\\/*^%<>~]/),\"operator\"):null}function h(b,a,c){return function(d,e){for(var f=!1,g;null!=(g=d.next());){if(g==b&&(c||!f)){e.tokenize.pop();break}f=!f&&\"%\"==g}return a}}var k=d(\"note across when variant until unique undefine then strip select retry rescue require rename reference redefine prefix once old obsolete loop local like is inspect infix include if frozen from external export ensure end elseif else do creation create check alias agent separate invariant inherit indexing feature expanded deferred class Void True Result Precursor False Current create attached detachable as and implies not or\".split(\" \")),\nl=d(\":=;and then;and;or;<<;>>\".split(\";\"));return{startState:function(){return{tokenize:[e]}},token:function(b,a){a=a.tokenize[a.tokenize.length-1](b,a);\"ident\"==a&&(a=b.current(),a=k.propertyIsEnumerable(b.current())?\"keyword\":l.propertyIsEnumerable(b.current())?\"operator\":/^[A-Z][A-Z_0-9]*$/g.test(a)?\"tag\":/^0[bB][0-1]+$/g.test(a)?\"number\":/^0[cC][0-7]+$/g.test(a)?\"number\":/^0[xX][a-fA-F0-9]+$/g.test(a)?\"number\":/^([0-9]+\\.[0-9]*)|([0-9]*\\.[0-9]+)$/g.test(a)?\"number\":/^[0-9]+$/g.test(a)?\"number\":\n\"variable\");return a},lineComment:\"--\"}});d.defineMIME(\"text/x-eiffel\",\"eiffel\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/elm/elm.js",
    "content": "'use strict';(function(d){\"object\"==typeof exports&&\"object\"==typeof module?d(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],d):d(CodeMirror)})(function(d){d.defineMode(\"elm\",function(){function d(a,c,b){c(b);return b(a,c)}function f(){return function(a,c){if(a.eatWhile(h))return null;var b=a.next();if(p.test(b))return\"{\"==b&&a.eat(\"-\")?(b=\"comment\",a.eat(\"#\")&&(b=\"meta\"),d(a,c,k(b,1))):null;if(\"'\"==b)return a.eat(\"\\\\\"),a.next(),a.eat(\"'\")?\"string\":\n\"error\";if('\"'==b)return d(a,c,l);if(q.test(b))return a.eatWhile(m),a.eat(\".\")?\"qualifier\":\"variable-2\";if(r.test(b))return c=1===a.pos,a.eatWhile(m),c?\"variable-3\":\"variable\";if(e.test(b)){if(\"0\"==b){if(a.eat(/[xX]/))return a.eatWhile(t),\"integer\";if(a.eat(/[oO]/))return a.eatWhile(u),\"number\"}a.eatWhile(e);b=\"number\";a.eat(\".\")&&(b=\"number\",a.eatWhile(e));a.eat(/[eE]/)&&(b=\"number\",a.eat(/[-+]/),a.eatWhile(e));return b}if(g.test(b)){if(\"-\"==b&&a.eat(/-/)&&(a.eatWhile(/-/),!a.eat(g)))return a.skipToEnd(),\n\"comment\";a.eatWhile(g);return\"builtin\"}return\"error\"}}function k(a,c){return 0==c?f():function(b,d){for(var e=c;!b.eol();){var g=b.next();if(\"{\"==g&&b.eat(\"-\"))++e;else if(\"-\"==g&&b.eat(\"}\")&&(--e,0==e))return d(f()),a}d(k(a,e));return a}}function l(a,c){for(;!a.eol();){var b=a.next();if('\"'==b)return c(f()),\"string\";if(\"\\\\\"==b){if(a.eol()||a.eat(h))return c(v),\"string\";a.eat(\"&\")||a.next()}}c(f());return\"error\"}function v(a,c){if(a.eat(\"\\\\\"))return d(a,c,l);a.next();c(f());return\"error\"}var r=/[a-z_]/,\nq=/[A-Z]/,e=/[0-9]/,t=/[0-9A-Fa-f]/,u=/[0-7]/,m=/[a-z_A-Z0-9\\']/,g=/[-!#$%&*+.\\/<=>?@\\\\^|~:\\u03BB\\u2192]/,p=/[(),;[\\]`{}]/,h=/[ \\t\\v\\f]/,n=function(){for(var a={},c='case of as if then else let in infix infixl infixr type alias input output foreign loopback module where import exposing _ .. | : = \\\\ \" -> <-'.split(\" \"),b=c.length;b--;)a[c[b]]=\"keyword\";return a}();return{startState:function(){return{f:f()}},copyState:function(a){return{f:a.f}},token:function(a,c){var b=c.f(a,function(a){c.f=a});a=\na.current();return n.hasOwnProperty(a)?n[a]:b}}});d.defineMIME(\"text/x-elm\",\"elm\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/erlang/erlang.js",
    "content": "'use strict';(function(k){\"object\"==typeof exports&&\"object\"==typeof module?k(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],k):k(CodeMirror)})(function(k){k.defineMIME(\"text/x-erlang\",\"erlang\");k.defineMode(\"erlang\",function(y){function z(a,b){if(b.in_string)return b.in_string=!n(a,'\"',\"\\\\\"),c(b,a,\"string\");if(b.in_atom)return b.in_atom=!n(a,\"'\",\"\\\\\"),c(b,a,\"atom\");if(a.eatSpace())return c(b,a,\"whitespace\");if(!m(b)&&a.match(/-\\s*[a-z\\u00df-\\u00f6\\u00f8-\\u00ff][\\w\\u00d8-\\u00de\\u00c0-\\u00d6\\u00df-\\u00f6\\u00f8-\\u00ff]*/))return g(a.current(),\nA)?c(b,a,\"type\"):c(b,a,\"attribute\");var d=a.next();if(\"%\"==d)return a.skipToEnd(),c(b,a,\"comment\");if(\":\"==d)return c(b,a,\"colon\");if(\"?\"==d)return a.eatSpace(),a.eatWhile(p),c(b,a,\"macro\");if(\"#\"==d)return a.eatSpace(),a.eatWhile(p),c(b,a,\"record\");if(\"$\"==d)return\"\\\\\"!=a.next()||a.match(B)?c(b,a,\"number\"):c(b,a,\"error\");if(\".\"==d)return c(b,a,\"dot\");if(\"'\"==d){if(!(b.in_atom=!n(a,\"'\",\"\\\\\"))){if(a.match(/\\s*\\/\\s*[0-9]/,!1))return a.match(/\\s*\\/\\s*[0-9]/,!0),c(b,a,\"fun\");if(a.match(/\\s*\\(/,!1)||a.match(/\\s*:/,\n!1))return c(b,a,\"function\")}return c(b,a,\"atom\")}if('\"'==d)return b.in_string=!n(a,'\"',\"\\\\\"),c(b,a,\"string\");if(/[A-Z_\\u00d8-\\u00de\\u00c0-\\u00d6]/.test(d))return a.eatWhile(p),c(b,a,\"variable\");if(/[a-z_\\u00df-\\u00f6\\u00f8-\\u00ff]/.test(d)){a.eatWhile(p);if(a.match(/\\s*\\/\\s*[0-9]/,!1))return a.match(/\\s*\\/\\s*[0-9]/,!0),c(b,a,\"fun\");d=a.current();if(g(d,C))return c(b,a,\"keyword\");if(g(d,D))return c(b,a,\"operator\");if(a.match(/\\s*\\(/,!1))return!g(d,E)||\":\"==m(b).token&&\"erlang\"!=m(b,2).token?g(d,F)?\nc(b,a,\"guard\"):c(b,a,\"function\"):c(b,a,\"builtin\");var f=a.match(/([\\n\\s]+|%[^\\n]*\\n)*(.)/,!1);return\":\"==(f?f.pop():\"\")?\"erlang\"==d?c(b,a,\"builtin\"):c(b,a,\"function\"):g(d,[\"true\",\"false\"])?c(b,a,\"boolean\"):c(b,a,\"atom\")}var f=/[0-9]/,r=/[0-9a-zA-Z]/;return f.test(d)?(a.eatWhile(f),a.eat(\"#\")?a.eatWhile(r)||a.backUp(1):a.eat(\".\")&&(a.eatWhile(f)?a.eat(/[eE]/)&&(a.eat(/[-+]/)?a.eatWhile(f)||a.backUp(2):a.eatWhile(f)||a.backUp(1)):a.backUp(1)),c(b,a,\"number\")):v(a,G,t)?c(b,a,\"open_paren\"):v(a,H,w)?c(b,\na,\"close_paren\"):x(a,I,J)?c(b,a,\"separator\"):x(a,K,L)?c(b,a,\"operator\"):c(b,a,null)}function v(a,b,d){if(1==a.current().length&&b.test(a.current())){for(a.backUp(1);b.test(a.peek());)if(a.next(),g(a.current(),d))return!0;a.backUp(a.current().length-1)}return!1}function x(a,b,d){if(1==a.current().length&&b.test(a.current())){for(;b.test(a.peek());)a.next();for(;0<a.current().length;){if(g(a.current(),d))return!0;a.backUp(1)}a.next()}return!1}function n(a,b,d){for(;!a.eol();){var f=a.next();if(f==b)return!0;\nf==d&&a.next()}return!1}function g(a,b){return-1<b.indexOf(a)}function c(a,b,d){var f;f=b.current();var c=b.column();b=b.indentation();f={token:f,column:c,indent:b,type:d};\"comment\"!=f.type&&\"whitespace\"!=f.type&&(c=a.tokenStack,b=c.length-1,0<b&&\"record\"===c[b].type&&\"dot\"===f.type?c.pop():(0<b&&\"group\"===c[b].type&&c.pop(),c.push(f)),a.tokenStack=c,a.tokenStack=M(a.tokenStack));switch(d){case \"atom\":return\"atom\";case \"attribute\":return\"attribute\";case \"boolean\":return\"atom\";case \"builtin\":return\"builtin\";\ncase \"close_paren\":return null;case \"colon\":return null;case \"comment\":return\"comment\";case \"dot\":return null;case \"error\":return\"error\";case \"fun\":return\"meta\";case \"function\":return\"tag\";case \"guard\":return\"property\";case \"keyword\":return\"keyword\";case \"macro\":return\"variable-2\";case \"number\":return\"number\";case \"open_paren\":return null;case \"operator\":return\"operator\";case \"record\":return\"bracket\";case \"separator\":return null;case \"string\":return\"string\";case \"type\":return\"def\";case \"variable\":return\"variable\";\ndefault:return null}}function N(a){return{token:a,column:0,indent:0,type:a}}function m(a,b){var d=a.tokenStack.length;b=b?b:1;return d<b?!1:a.tokenStack[d-b]}function M(a){if(!a.length)return a;var b=a.length-1;if(\"dot\"===a[b].type)return[];if(1<b&&\"fun\"===a[b].type&&\"fun\"===a[b-1].token)return a.slice(0,b-1);switch(a[b].token){case \"}\":return e(a,{g:[\"{\"]});case \"]\":return e(a,{i:[\"[\"]});case \")\":return e(a,{i:[\"(\"]});case \">>\":return e(a,{i:[\"<<\"]});case \"end\":return e(a,{i:\"begin case fun if receive try\".split(\" \")});\ncase \",\":return e(a,{e:\"begin try when -> , ( [ { <<\".split(\" \")});case \"->\":return e(a,{r:[\"when\"],m:[\"try\",\"if\",\"case\",\"receive\"]});case \";\":return e(a,{E:\"case fun if receive try when\".split(\" \")});case \"catch\":return e(a,{e:[\"try\"]});case \"of\":return e(a,{e:[\"case\"]});case \"after\":return e(a,{e:[\"receive\",\"try\"]});default:return a}}function e(a,b){for(var d in b)for(var c=a.length-1,r=b[d],h=c-1;-1<h;h--)if(g(a[h].token,r)){var e=a.slice(0,h);switch(d){case \"m\":return e.concat(a[h]).concat(a[c]);\ncase \"r\":return e.concat(a[c]);case \"i\":return e;case \"g\":return e.concat(N(\"group\"));case \"E\":return e.concat(a[h]);case \"e\":return e.concat(a[h])}}return\"E\"==d?[]:a}function O(a,b){var d,c=y.indentUnit;b=b.match(/,|[a-z]+|\\}|\\]|\\)|>>|\\|+|\\(/);b=l(b)&&0===b.index?b[0]:\"\";var e=m(a,1),h=m(a,2);if(a.in_string||a.in_atom)return k.Pass;if(h){if(\"when\"==e.token)return e.column+c;if(\"when\"===b&&\"function\"===h.type)return h.indent+c;if(\"(\"===b&&\"fun\"===e.token)return e.column+3;if(\"catch\"===b&&(d=u(a,[\"try\"])))return d.column;\nif(g(b,[\"end\",\"after\",\"of\"]))return(d=u(a,\"begin case fun if receive try\".split(\" \")))?d.column:k.Pass;if(g(b,w))return(d=u(a,t))?d.column:k.Pass;if(g(e.token,[\",\",\"|\",\"||\"])||g(b,[\",\",\"|\",\"||\"]))return a=a.tokenStack.slice(0,-1),d=q(a,\"type\",[\"open_paren\"]),(d=l(a[d])?a[d]:!1)?d.column+d.token.length:c;if(\"->\"==e.token)return g(h.token,[\"receive\",\"case\",\"if\",\"try\"])?h.column+c+c:h.column+c;if(g(e.token,t))return e.column+e.token.length;a=a.tokenStack;d=q(a,\"type\",[\"open_paren\",\"separator\",\"keyword\"]);\nb=q(a,\"type\",[\"operator\"]);d=l(d)&&l(b)&&d<b?a[d+1]:l(d)?a[d]:!1;return l(d)?d.column+c:0}return 0}function u(a,b){a=a.tokenStack;b=q(a,\"token\",b);return l(a[b])?a[b]:!1}function q(a,b,d){for(var c=a.length-1;-1<c;c--)if(g(a[c][b],d))return c;return!1}function l(a){return!1!==a&&null!=a}var A=[\"-type\",\"-spec\",\"-export_type\",\"-opaque\"],C=\"after begin catch case cond end fun if let of query receive try when\".split(\" \"),I=/[\\->,;]/,J=[\"->\",\";\",\",\"],D=\"and andalso band bnot bor bsl bsr bxor div not or orelse rem xor\".split(\" \"),\nK=/[\\+\\-\\*\\/<>=\\|:!]/,L=\"= + - * / > >= < =< =:= == =/= /= || <- !\".split(\" \"),G=/[<\\(\\[\\{]/,t=[\"<<\",\"(\",\"[\",\"{\"],H=/[>\\)\\]\\}]/,w=[\"}\",\"]\",\")\",\">>\"],F=\"is_atom is_binary is_bitstring is_boolean is_float is_function is_integer is_list is_number is_pid is_port is_record is_reference is_tuple atom binary bitstring boolean function integer list number pid port record reference tuple\".split(\" \"),E=\"abs adler32 adler32_combine alive apply atom_to_binary atom_to_list binary_to_atom binary_to_existing_atom binary_to_list binary_to_term bit_size bitstring_to_list byte_size check_process_code contact_binary crc32 crc32_combine date decode_packet delete_module disconnect_node element erase exit float float_to_list garbage_collect get get_keys group_leader halt hd integer_to_list internal_bif iolist_size iolist_to_binary is_alive is_atom is_binary is_bitstring is_boolean is_float is_function is_integer is_list is_number is_pid is_port is_process_alive is_record is_reference is_tuple length link list_to_atom list_to_binary list_to_bitstring list_to_existing_atom list_to_float list_to_integer list_to_pid list_to_tuple load_module make_ref module_loaded monitor_node node node_link node_unlink nodes notalive now open_port pid_to_list port_close port_command port_connect port_control pre_loaded process_flag process_info processes purge_module put register registered round self setelement size spawn spawn_link spawn_monitor spawn_opt split_binary statistics term_to_binary time throw tl trunc tuple_size tuple_to_list unlink unregister whereis\".split(\" \"),\np=/[\\w@\\u00d8-\\u00de\\u00c0-\\u00d6\\u00df-\\u00f6\\u00f8-\\u00ff]/,B=/[0-7]{1,3}|[bdefnrstv\\\\\"']|\\^[a-zA-Z]|x[0-9a-zA-Z]{2}|x{[0-9a-zA-Z]+}/;return{startState:function(){return{tokenStack:[],in_string:!1,in_atom:!1}},token:function(a,b){return z(a,b)},indent:function(a,b){return O(a,b)},lineComment:\"%\"}})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/factor/factor.js",
    "content": "'use strict';(function(a){\"object\"==typeof exports&&\"object\"==typeof module?a(require(\"../../lib/codemirror\"),require(\"../../addon/mode/simple\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\",\"../../addon/mode/simple\"],a):a(CodeMirror)})(function(a){a.defineSimpleMode(\"factor\",{start:[{regex:/#?!.*/,token:\"comment\"},{regex:/\"\"\"/,token:\"string\",next:\"string3\"},{regex:/\"/,token:\"string\",next:\"string\"},{regex:/(?:[+-]?)(?:0x[\\d,a-f]+)|(?:0o[0-7]+)|(?:0b[0,1]+)|(?:\\d+.?\\d*)/,token:\"number\"},\n{regex:/(\\:)(\\s+)(\\S+)(\\s+)(\\()/,token:[\"keyword\",null,\"def\",null,\"keyword\"],next:\"stack\"},{regex:/USING\\:/,token:\"keyword\",next:\"vocabulary\"},{regex:/(USE\\:|IN\\:)(\\s+)(\\S+)/,token:[\"keyword\",null,\"variable-2\"]},{regex:/<\\S+>/,token:\"builtin\"},{regex:/;|t|f|if|\\.|\\[|\\]|\\{|\\}|MAIN:/,token:\"keyword\"},{regex:/\\S+/,token:\"variable\"},{regex:/./,token:null}],vocabulary:[{regex:/;/,token:\"keyword\",next:\"start\"},{regex:/\\S+/,token:\"variable-2\"},{regex:/./,token:null}],string:[{regex:/(?:[^\\\\]|\\\\.)*?\"/,token:\"string\",\nnext:\"start\"},{regex:/.*/,token:\"string\"}],string3:[{regex:/(?:[^\\\\]|\\\\.)*?\"\"\"/,token:\"string\",next:\"start\"},{regex:/.*/,token:\"string\"}],stack:[{regex:/\\)/,token:\"meta\",next:\"start\"},{regex:/--/,token:\"meta\"},{regex:/\\S+/,token:\"variable-3\"},{regex:/./,token:null}],meta:{dontIndentStates:[\"start\",\"vocabulary\",\"string\",\"string3\",\"stack\"],lineComment:[\"!\",\"#!\"]}});a.defineMIME(\"text/x-factor\",\"factor\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/fcl/fcl.js",
    "content": "'use strict';(function(d){\"object\"==typeof exports&&\"object\"==typeof module?d(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],d):d(CodeMirror)})(function(d){d.defineMode(\"fcl\",function(d){function f(a,b){var c=a.next();if(/[\\d\\.]/.test(c))return\".\"==c?a.match(/^[0-9]+([eE][\\-+]?[0-9]+)?/):\"0\"==c?a.match(/^[xX][0-9a-fA-F]+/)||a.match(/^0[0-7]+/):a.match(/^[0-9]*\\.?[0-9]*([eE][\\-+]?[0-9]+)?/),\"number\";if(\"/\"==c||\"(\"==c){if(a.eat(\"*\"))return b.tokenize=\nh,h(a,b);if(a.eat(\"/\"))return a.skipToEnd(),\"comment\"}if(k.test(c))return a.eatWhile(k),\"operator\";a.eatWhile(/[\\w\\$_\\xa1-\\uffff]/);a=a.current().toLowerCase();return p.propertyIsEnumerable(a)||l.propertyIsEnumerable(a)||g.propertyIsEnumerable(a)?\"keyword\":q.propertyIsEnumerable(a)?\"atom\":\"variable\"}function h(a,b){for(var c=!1,e;e=a.next();){if((\"/\"==e||\")\"==e)&&c){b.tokenize=f;break}c=\"*\"==e}return\"comment\"}function m(a,b,c,e,d){this.indented=a;this.column=b;this.type=c;this.align=e;this.prev=d}\nvar n=d.indentUnit,p={term:!0,method:!0,accu:!0,rule:!0,then:!0,is:!0,and:!0,or:!0,\"if\":!0,\"default\":!0},l={var_input:!0,var_output:!0,fuzzify:!0,defuzzify:!0,function_block:!0,ruleblock:!0},g={end_ruleblock:!0,end_defuzzify:!0,end_function_block:!0,end_fuzzify:!0,end_var:!0},q={\"true\":!0,\"false\":!0,nan:!0,real:!0,min:!0,max:!0,cog:!0,cogs:!0},k=/[+\\-*&^%:=<>!|\\/]/;return{startState:function(a){return{tokenize:null,context:new m((a||0)-n,0,\"top\",!1),indented:0,startOfLine:!0}},token:function(a,b){var c=\nb.context;a.sol()&&(null==c.align&&(c.align=!1),b.indented=a.indentation(),b.startOfLine=!0);if(a.eatSpace())return null;var d=(b.tokenize||f)(a,b);if(\"comment\"==d)return d;null==c.align&&(c.align=!0);c=a.current().toLowerCase();l.propertyIsEnumerable(c)?(a=a.column(),b.context=new m(b.indented,a,\"end_block\",null,b.context)):g.propertyIsEnumerable(c)&&b.context.prev&&(\"end_block\"==b.context.type&&(b.indented=b.context.indented),b.context=b.context.prev);b.startOfLine=!1;return d},indent:function(a,\nb){if(a.tokenize!=f&&null!=a.tokenize)return 0;a=a.context;b=g.propertyIsEnumerable(b);return a.align?a.column+(b?0:1):a.indented+(b?0:n)},electricChars:\"ryk\",fold:\"brace\",blockCommentStart:\"(*\",blockCommentEnd:\"*)\",lineComment:\"//\"}});d.defineMIME(\"text/x-fcl\",\"fcl\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/forth/forth.js",
    "content": "'use strict';(function(d){\"object\"==typeof exports&&\"object\"==typeof module?d(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],d):d(CodeMirror)})(function(d){function e(d){var b=[];d.split(\" \").forEach(function(a){b.push({name:a})});return b}var f=e(\"INVERT AND OR XOR 2* 2/ LSHIFT RSHIFT 0= = 0< < > U< MIN MAX 2DROP 2DUP 2OVER 2SWAP ?DUP DEPTH DROP DUP OVER ROT SWAP >R R> R@ + - 1+ 1- ABS NEGATE S>D * M* UM* FM/MOD SM/REM UM/MOD */ */MOD / /MOD MOD HERE , @ ! CELL+ CELLS C, C@ C! CHARS 2@ 2! ALIGN ALIGNED +! ALLOT CHAR [CHAR] [ ] BL FIND EXECUTE IMMEDIATE COUNT LITERAL STATE ; DOES> >BODY EVALUATE SOURCE >IN <# # #S #> HOLD SIGN BASE >NUMBER HEX DECIMAL FILL MOVE . CR EMIT SPACE SPACES TYPE U. .R U.R ACCEPT TRUE FALSE <> U> 0<> 0> NIP TUCK ROLL PICK 2>R 2R@ 2R> WITHIN UNUSED MARKER I J TO COMPILE, [COMPILE] SAVE-INPUT RESTORE-INPUT PAD ERASE 2LITERAL DNEGATE D- D+ D0< D0= D2* D2/ D< D= DMAX DMIN D>S DABS M+ M*/ D. D.R 2ROT DU< CATCH THROW FREE RESIZE ALLOCATE CS-PICK CS-ROLL GET-CURRENT SET-CURRENT FORTH-WORDLIST GET-ORDER SET-ORDER PREVIOUS SEARCH-WORDLIST WORDLIST FIND ALSO ONLY FORTH DEFINITIONS ORDER -TRAILING /STRING SEARCH COMPARE CMOVE CMOVE> BLANK SLITERAL\"),\ng=e(\"IF ELSE THEN BEGIN WHILE REPEAT UNTIL RECURSE [IF] [ELSE] [THEN] ?DO DO LOOP +LOOP UNLOOP LEAVE EXIT AGAIN CASE OF ENDOF ENDCASE\");d.defineMode(\"forth\",function(){function d(b,a){var c;for(c=b.length-1;0<=c;c--)if(b[c].name===a.toUpperCase())return b[c]}return{startState:function(){return{state:\"\",base:10,coreWordList:f,immediateWordList:g,wordList:[]}},token:function(b,a){var c;if(b.eatSpace())return null;if(\"\"===a.state){if(b.match(/^(\\]|:NONAME)(\\s|$)/i))return a.state=\" compilation\",\"builtin compilation\";\nif(c=b.match(/^(\\:)\\s+(\\S+)(\\s|$)+/))return a.wordList.push({name:c[2].toUpperCase()}),a.state=\" compilation\",\"def\"+a.state;if(c=b.match(/^(VARIABLE|2VARIABLE|CONSTANT|2CONSTANT|CREATE|POSTPONE|VALUE|WORD)\\s+(\\S+)(\\s|$)+/i))return a.wordList.push({name:c[2].toUpperCase()}),\"def\"+a.state;if(c=b.match(/^(\\'|\\[\\'\\])\\s+(\\S+)(\\s|$)+/))return\"builtin\"+a.state}else{if(b.match(/^(\\;|\\[)(\\s)/))return a.state=\"\",b.backUp(1),\"builtin compilation\";if(b.match(/^(\\;|\\[)($)/))return a.state=\"\",\"builtin compilation\";\nif(b.match(/^(POSTPONE)\\s+\\S+(\\s|$)+/))return\"builtin\"}if(c=b.match(/^(\\S+)(\\s+|$)/))return void 0!==d(a.wordList,c[1])?\"variable\"+a.state:\"\\\\\"===c[1]?(b.skipToEnd(),\"comment\"+a.state):void 0!==d(a.coreWordList,c[1])?\"builtin\"+a.state:void 0!==d(a.immediateWordList,c[1])?\"keyword\"+a.state:\"(\"===c[1]?(b.eatWhile(function(a){return\")\"!==a}),b.eat(\")\"),\"comment\"+a.state):\".(\"===c[1]?(b.eatWhile(function(a){return\")\"!==a}),b.eat(\")\"),\"string\"+a.state):'S\"'===c[1]||'.\"'===c[1]||'C\"'===c[1]?(b.eatWhile(function(a){return'\"'!==\na}),b.eat('\"'),\"string\"+a.state):c[1]-68719476735?\"number\"+a.state:\"atom\"+a.state}}});d.defineMIME(\"text/x-forth\",\"forth\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/fortran/fortran.js",
    "content": "'use strict';(function(b){\"object\"==typeof exports&&\"object\"==typeof module?b(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],b):b(CodeMirror)})(function(b){b.defineMode(\"fortran\",function(){function b(a){for(var d={},c=0;c<a.length;++c)d[a[c]]=!0;return d}function g(a,d){if(a.match(h))return\"operator\";var c=a.next();if(\"!\"==c)return a.skipToEnd(),\"comment\";if('\"'==c||\"'\"==c)return d.tokenize=k(c),d.tokenize(a,d);if(/[\\[\\]\\(\\),]/.test(c))return null;\nif(/\\d/.test(c))return a.eatWhile(/[\\w\\.]/),\"number\";if(e.test(c))return a.eatWhile(e),\"operator\";a.eatWhile(/[\\w\\$_]/);a=a.current().toLowerCase();return l.hasOwnProperty(a)?\"keyword\":m.hasOwnProperty(a)||n.hasOwnProperty(a)?\"builtin\":\"variable\"}function k(a){return function(d,c){for(var b=!1,f,e=!1;null!=(f=d.next());){if(f==a&&!b){e=!0;break}b=!b&&\"\\\\\"==f}if(e||!b)c.tokenize=null;return\"string\"}}var l=b(\"abstract accept allocatable allocate array assign asynchronous backspace bind block byte call case class close common contains continue cycle data deallocate decode deferred dimension do elemental else encode end endif entry enumerator equivalence exit external extrinsic final forall format function generic go goto if implicit import include inquire intent interface intrinsic module namelist non_intrinsic non_overridable none nopass nullify open optional options parameter pass pause pointer print private program protected public pure read recursive result return rewind save select sequence stop subroutine target then to type use value volatile where while write\".split(\" \")),\nm=b(\"abort abs access achar acos adjustl adjustr aimag aint alarm all allocated alog amax amin amod and anint any asin associated atan besj besjn besy besyn bit_size btest cabs ccos ceiling cexp char chdir chmod clog cmplx command_argument_count complex conjg cos cosh count cpu_time cshift csin csqrt ctime c_funloc c_loc c_associated c_null_ptr c_null_funptr c_f_pointer c_null_char c_alert c_backspace c_form_feed c_new_line c_carriage_return c_horizontal_tab c_vertical_tab dabs dacos dasin datan date_and_time dbesj dbesj dbesjn dbesy dbesy dbesyn dble dcos dcosh ddim derf derfc dexp digits dim dint dlog dlog dmax dmin dmod dnint dot_product dprod dsign dsinh dsin dsqrt dtanh dtan dtime eoshift epsilon erf erfc etime exit exp exponent extends_type_of fdate fget fgetc float floor flush fnum fputc fput fraction fseek fstat ftell gerror getarg get_command get_command_argument get_environment_variable getcwd getenv getgid getlog getpid getuid gmtime hostnm huge iabs iachar iand iargc ibclr ibits ibset ichar idate idim idint idnint ieor ierrno ifix imag imagpart index int ior irand isatty ishft ishftc isign iso_c_binding is_iostat_end is_iostat_eor itime kill kind lbound len len_trim lge lgt link lle llt lnblnk loc log logical long lshift lstat ltime matmul max maxexponent maxloc maxval mclock merge move_alloc min minexponent minloc minval mod modulo mvbits nearest new_line nint not or pack perror precision present product radix rand random_number random_seed range real realpart rename repeat reshape rrspacing rshift same_type_as scale scan second selected_int_kind selected_real_kind set_exponent shape short sign signal sinh sin sleep sngl spacing spread sqrt srand stat sum symlnk system system_clock tan tanh time tiny transfer transpose trim ttynam ubound umask unlink unpack verify xor zabs zcos zexp zlog zsin zsqrt\".split(\" \")),\nn=b(\"c_bool c_char c_double c_double_complex c_float c_float_complex c_funptr c_int c_int16_t c_int32_t c_int64_t c_int8_t c_int_fast16_t c_int_fast32_t c_int_fast64_t c_int_fast8_t c_int_least16_t c_int_least32_t c_int_least64_t c_int_least8_t c_intmax_t c_intptr_t c_long c_long_double c_long_double_complex c_long_long c_ptr c_short c_signed_char c_size_t character complex double integer logical real\".split(\" \")),e=/[+\\-*&=<>\\/\\:]/,h=/(.and.|.or.|.eq.|.lt.|.le.|.gt.|.ge.|.ne.|.not.|.eqv.|.neqv.)/i;\nreturn{startState:function(){return{tokenize:null}},token:function(a,b){return a.eatSpace()?null:(b.tokenize||g)(a,b)}}});b.defineMIME(\"text/x-fortran\",\"fortran\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/gas/gas.js",
    "content": "'use strict';(function(c){\"object\"==typeof exports&&\"object\"==typeof module?c(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],c):c(CodeMirror)})(function(c){c.defineMode(\"gas\",function(c,k){function n(b){f=\"@\";l.syntax=\"builtin\";a.r0=\"variable\";a.r1=\"variable\";a.r2=\"variable\";a.r3=\"variable\";a.r4=\"variable\";a.r5=\"variable\";a.r6=\"variable\";a.r7=\"variable\";a.r8=\"variable\";a.r9=\"variable\";a.r10=\"variable\";a.r11=\"variable\";a.r12=\"variable\";a.sp=\"variable-2\";\na.lr=\"variable-2\";a.pc=\"variable-2\";a.r13=a.sp;a.r14=a.lr;a.r15=a.pc;g.push(function(a,b){if(\"#\"===a)return b.eatWhile(/\\w/),\"number\"})}function m(a,e){for(var b=!1,d;null!=(d=a.next());){if(\"/\"===d&&b){e.tokenize=null;break}b=\"*\"===d}return\"comment\"}var g=[],f=\"\",l={\".abort\":\"builtin\",\".align\":\"builtin\",\".altmacro\":\"builtin\",\".ascii\":\"builtin\",\".asciz\":\"builtin\",\".balign\":\"builtin\",\".balignw\":\"builtin\",\".balignl\":\"builtin\",\".bundle_align_mode\":\"builtin\",\".bundle_lock\":\"builtin\",\".bundle_unlock\":\"builtin\",\n\".byte\":\"builtin\",\".cfi_startproc\":\"builtin\",\".comm\":\"builtin\",\".data\":\"builtin\",\".def\":\"builtin\",\".desc\":\"builtin\",\".dim\":\"builtin\",\".double\":\"builtin\",\".eject\":\"builtin\",\".else\":\"builtin\",\".elseif\":\"builtin\",\".end\":\"builtin\",\".endef\":\"builtin\",\".endfunc\":\"builtin\",\".endif\":\"builtin\",\".equ\":\"builtin\",\".equiv\":\"builtin\",\".eqv\":\"builtin\",\".err\":\"builtin\",\".error\":\"builtin\",\".exitm\":\"builtin\",\".extern\":\"builtin\",\".fail\":\"builtin\",\".file\":\"builtin\",\".fill\":\"builtin\",\".float\":\"builtin\",\".func\":\"builtin\",\n\".global\":\"builtin\",\".gnu_attribute\":\"builtin\",\".hidden\":\"builtin\",\".hword\":\"builtin\",\".ident\":\"builtin\",\".if\":\"builtin\",\".incbin\":\"builtin\",\".include\":\"builtin\",\".int\":\"builtin\",\".internal\":\"builtin\",\".irp\":\"builtin\",\".irpc\":\"builtin\",\".lcomm\":\"builtin\",\".lflags\":\"builtin\",\".line\":\"builtin\",\".linkonce\":\"builtin\",\".list\":\"builtin\",\".ln\":\"builtin\",\".loc\":\"builtin\",\".loc_mark_labels\":\"builtin\",\".local\":\"builtin\",\".long\":\"builtin\",\".macro\":\"builtin\",\".mri\":\"builtin\",\".noaltmacro\":\"builtin\",\".nolist\":\"builtin\",\n\".octa\":\"builtin\",\".offset\":\"builtin\",\".org\":\"builtin\",\".p2align\":\"builtin\",\".popsection\":\"builtin\",\".previous\":\"builtin\",\".print\":\"builtin\",\".protected\":\"builtin\",\".psize\":\"builtin\",\".purgem\":\"builtin\",\".pushsection\":\"builtin\",\".quad\":\"builtin\",\".reloc\":\"builtin\",\".rept\":\"builtin\",\".sbttl\":\"builtin\",\".scl\":\"builtin\",\".section\":\"builtin\",\".set\":\"builtin\",\".short\":\"builtin\",\".single\":\"builtin\",\".size\":\"builtin\",\".skip\":\"builtin\",\".sleb128\":\"builtin\",\".space\":\"builtin\",\".stab\":\"builtin\",\".string\":\"builtin\",\n\".struct\":\"builtin\",\".subsection\":\"builtin\",\".symver\":\"builtin\",\".tag\":\"builtin\",\".text\":\"builtin\",\".title\":\"builtin\",\".type\":\"builtin\",\".uleb128\":\"builtin\",\".val\":\"builtin\",\".version\":\"builtin\",\".vtable_entry\":\"builtin\",\".vtable_inherit\":\"builtin\",\".warning\":\"builtin\",\".weak\":\"builtin\",\".weakref\":\"builtin\",\".word\":\"builtin\"},a={};c=(k.architecture||\"x86\").toLowerCase();\"x86\"===c?(f=\"#\",a.ax=\"variable\",a.eax=\"variable-2\",a.rax=\"variable-3\",a.bx=\"variable\",a.ebx=\"variable-2\",a.rbx=\"variable-3\",a.cx=\n\"variable\",a.ecx=\"variable-2\",a.rcx=\"variable-3\",a.dx=\"variable\",a.edx=\"variable-2\",a.rdx=\"variable-3\",a.si=\"variable\",a.esi=\"variable-2\",a.rsi=\"variable-3\",a.di=\"variable\",a.edi=\"variable-2\",a.rdi=\"variable-3\",a.sp=\"variable\",a.esp=\"variable-2\",a.rsp=\"variable-3\",a.bp=\"variable\",a.ebp=\"variable-2\",a.rbp=\"variable-3\",a.ip=\"variable\",a.eip=\"variable-2\",a.rip=\"variable-3\",a.cs=\"keyword\",a.ds=\"keyword\",a.ss=\"keyword\",a.es=\"keyword\",a.fs=\"keyword\",a.gs=\"keyword\"):\"arm\"!==c&&\"armv6\"!==c||n(k);return{startState:function(){return{tokenize:null}},\ntoken:function(b,e){if(e.tokenize)return e.tokenize(b,e);if(b.eatSpace())return null;var c,d=b.next();if(\"/\"===d&&b.eat(\"*\"))return e.tokenize=m,m(b,e);if(d===f)return b.skipToEnd(),\"comment\";if('\"'===d){a:for(e=!1;null!=(c=b.next());){if('\"'===c&&!e)break a;e=!e&&\"\\\\\"===c}return\"string\"}if(\".\"===d)return b.eatWhile(/\\w/),b=b.current().toLowerCase(),(c=l[b])||null;if(\"=\"===d)return b.eatWhile(/\\w/),\"tag\";if(\"{\"===d||\"}\"===d)return\"braket\";if(/\\d/.test(d)){if(\"0\"===d&&b.eat(\"x\"))return b.eatWhile(/[0-9a-fA-F]/),\n\"number\";b.eatWhile(/\\d/);return\"number\"}if(/\\w/.test(d)){b.eatWhile(/\\w/);if(b.eat(\":\"))return\"tag\";b=b.current().toLowerCase();return(c=a[b])||null}for(var h=0;h<g.length;h++)if(c=g[h](d,b,e))return c},lineComment:f,blockCommentStart:\"/*\",blockCommentEnd:\"*/\"}})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/gfm/gfm.js",
    "content": "'use strict';(function(c){\"object\"==typeof exports&&\"object\"==typeof module?c(require(\"../../lib/codemirror\"),require(\"../markdown/markdown\"),require(\"../../addon/mode/overlay\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\",\"../markdown/markdown\",\"../../addon/mode/overlay\"],c):c(CodeMirror)})(function(c){var h=/^((?:(?:aaas?|about|acap|adiumxtra|af[ps]|aim|apt|attachment|aw|beshare|bitcoin|bolo|callto|cap|chrome(?:-extension)?|cid|coap|com-eventbrite-attendee|content|crid|cvs|data|dav|dict|dlna-(?:playcontainer|playsingle)|dns|doi|dtn|dvb|ed2k|facetime|feed|file|finger|fish|ftp|geo|gg|git|gizmoproject|go|gopher|gtalk|h323|hcp|https?|iax|icap|icon|im|imap|info|ipn|ipp|irc[6s]?|iris(?:\\.beep|\\.lwz|\\.xpc|\\.xpcs)?|itms|jar|javascript|jms|keyparc|lastfm|ldaps?|magnet|mailto|maps|market|message|mid|mms|ms-help|msnim|msrps?|mtqp|mumble|mupdate|mvn|news|nfs|nih?|nntp|notes|oid|opaquelocktoken|palm|paparazzi|platform|pop|pres|proxy|psyc|query|res(?:ource)?|rmi|rsync|rtmp|rtsp|secondlife|service|session|sftp|sgn|shttp|sieve|sips?|skype|sm[bs]|snmp|soap\\.beeps?|soldat|spotify|ssh|steam|svn|tag|teamspeak|tel(?:net)?|tftp|things|thismessage|tip|tn3270|tv|udp|unreal|urn|ut2004|vemmi|ventrilo|view-source|webcal|wss?|wtai|wyciwyg|xcon(?:-userid)?|xfire|xmlrpc\\.beeps?|xmpp|xri|ymsgr|z39\\.50[rs]?):(?:\\/{1,3}|[a-z0-9%])|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}\\/)(?:[^\\s()<>]|\\([^\\s()<>]*\\))+(?:\\([^\\s()<>]*\\)|[^\\s`*!()\\[\\]{};:'\".,<>?\\u00ab\\u00bb\\u201c\\u201d\\u2018\\u2019]))/i;\nc.defineMode(\"gfm\",function(k,d){var g=0,e={underscoresBreakWords:!1,taskLists:!0,fencedCodeBlocks:\"```\",strikethrough:!0},f;for(f in d)e[f]=d[f];e.name=\"markdown\";return c.overlayMode(c.getMode(k,e),{startState:function(){return{code:!1,codeBlock:!1,ateSpace:!1}},copyState:function(a){return{code:a.code,codeBlock:a.codeBlock,ateSpace:a.ateSpace}},token:function(a,b){b.combineTokens=null;if(b.codeBlock){if(a.match(/^```+/))return b.codeBlock=!1,null;a.skipToEnd();return null}a.sol()&&(b.code=!1);\nif(a.sol()&&a.match(/^```+/))return a.skipToEnd(),b.codeBlock=!0,null;if(\"`\"===a.peek()){a.next();var c=a.pos;a.eatWhile(\"`\");a=1+a.pos-c;b.code?a===g&&(b.code=!1):(g=a,b.code=!0);return null}if(b.code)return a.next(),null;if(a.eatSpace())return b.ateSpace=!0,null;if(a.sol()||b.ateSpace)if(b.ateSpace=!1,!1!==d.gitHubSpice&&(a.match(/^(?:[a-zA-Z0-9\\-_]+\\/)?(?:[a-zA-Z0-9\\-_]+@)?(?:[a-f0-9]{7,40}\\b)/)||a.match(/^(?:[a-zA-Z0-9\\-_]+\\/)?(?:[a-zA-Z0-9\\-_]+)?#[0-9]+\\b/)))return b.combineTokens=!0,\"link\";\nif(a.match(h)&&\"](\"!=a.string.slice(a.start-2,a.start)&&(0==a.start||/\\W/.test(a.string.charAt(a.start-1))))return b.combineTokens=!0,\"link\";a.next();return null},blankLine:function(a){a.code=!1;return null}})},\"markdown\");c.defineMIME(\"text/x-gfm\",\"gfm\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/gherkin/gherkin.js",
    "content": "'use strict';(function(c){\"object\"==typeof exports&&\"object\"==typeof module?c(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],c):c(CodeMirror)})(function(c){c.defineMode(\"gherkin\",function(){return{startState:function(){return{lineNumber:0,tableHeaderLine:!1,allowFeature:!0,allowBackground:!1,allowScenario:!1,allowSteps:!1,allowPlaceholders:!1,allowMultilineArgument:!1,inMultilineString:!1,inMultilineTable:!1,inKeywordLine:!1}},token:function(b,\na){b.sol()&&(a.lineNumber++,a.inKeywordLine=!1,a.inMultilineTable&&(a.tableHeaderLine=!1,b.match(/\\s*\\|/,!1)||(a.allowMultilineArgument=!1,a.inMultilineTable=!1)));b.eatSpace();if(a.allowMultilineArgument){if(a.inMultilineString)return b.match('\"\"\"')?(a.inMultilineString=!1,a.allowMultilineArgument=!1):b.match(/.*/),\"string\";if(a.inMultilineTable){if(b.match(/\\|\\s*/))return\"bracket\";b.match(/[^\\|]*/);return a.tableHeaderLine?\"header\":\"string\"}if(b.match('\"\"\"'))return a.inMultilineString=!0,\"string\";\nif(b.match(\"|\"))return a.inMultilineTable=!0,a.tableHeaderLine=!0,\"bracket\"}if(b.match(/#.*/))return\"comment\";if(!a.inKeywordLine&&b.match(/@\\S+/))return\"tag\";if(!a.inKeywordLine&&a.allowFeature&&b.match(/(\\u6a5f\\u80fd|\\u529f\\u80fd|\\u30d5\\u30a3\\u30fc\\u30c1\\u30e3|\\uae30\\ub2a5|\\u0e42\\u0e04\\u0e23\\u0e07\\u0e2b\\u0e25\\u0e31\\u0e01|\\u0e04\\u0e27\\u0e32\\u0e21\\u0e2a\\u0e32\\u0e21\\u0e32\\u0e23\\u0e16|\\u0e04\\u0e27\\u0e32\\u0e21\\u0e15\\u0e49\\u0e2d\\u0e07\\u0e01\\u0e32\\u0e23\\u0e17\\u0e32\\u0e07\\u0e18\\u0e38\\u0e23\\u0e01\\u0e34\\u0e08|\\u0cb9\\u0cc6\\u0c9a\\u0ccd\\u0c9a\\u0cb3|\\u0c17\\u0c41\\u0c23\\u0c2e\\u0c41|\\u0a2e\\u0a41\\u0a39\\u0a3e\\u0a02\\u0a26\\u0a30\\u0a3e|\\u0a28\\u0a15\\u0a36 \\u0a28\\u0a41\\u0a39\\u0a3e\\u0a30|\\u0a16\\u0a3e\\u0a38\\u0a40\\u0a05\\u0a24|\\u0930\\u0942\\u092a \\u0932\\u0947\\u0916|\\u0648\\u0650\\u06cc\\u0698\\u06af\\u06cc|\\u062e\\u0627\\u0635\\u064a\\u0629|\\u05ea\\u05db\\u05d5\\u05e0\\u05d4|\\u0424\\u0443\\u043d\\u043a\\u0446\\u0456\\u043e\\u043d\\u0430\\u043b|\\u0424\\u0443\\u043d\\u043a\\u0446\\u0438\\u044f|\\u0424\\u0443\\u043d\\u043a\\u0446\\u0438\\u043e\\u043d\\u0430\\u043b\\u043d\\u043e\\u0441\\u0442|\\u0424\\u0443\\u043d\\u043a\\u0446\\u0438\\u043e\\u043d\\u0430\\u043b|\\u04ae\\u0437\\u0435\\u043d\\u0447\\u04d9\\u043b\\u0435\\u043a\\u043b\\u0435\\u043b\\u0435\\u043a|\\u0421\\u0432\\u043e\\u0439\\u0441\\u0442\\u0432\\u043e|\\u041e\\u0441\\u043e\\u0431\\u0438\\u043d\\u0430|\\u041c\\u04e9\\u043c\\u043a\\u0438\\u043d\\u043b\\u0435\\u043a|\\u041c\\u043e\\u0433\\u0443\\u045b\\u043d\\u043e\\u0441\\u0442|\\u039b\\u03b5\\u03b9\\u03c4\\u03bf\\u03c5\\u03c1\\u03b3\\u03af\\u03b1|\\u0394\\u03c5\\u03bd\\u03b1\\u03c4\\u03cc\\u03c4\\u03b7\\u03c4\\u03b1|W\\u0142a\\u015bciwo\\u015b\\u0107|Vlastnos\\u0165|Trajto|T\\u00ednh n\\u0103ng|Savyb\\u0117|Pretty much|Po\\u017eiadavka|Po\\u017eadavek|Potrzeba biznesowa|\\u00d6zellik|Osobina|Ominaisuus|Omadus|OH HAI|Mogu\\u0107nost|Mogucnost|Jellemz\\u0151|Hw\\u00e6t|Hwaet|Funzionalit\\u00e0|Funktionalit\\u00e9it|Funktionalit\\u00e4t|Funkcja|Funkcionalnost|Funkcionalit\\u0101te|Funkcia|Fungsi|Functionaliteit|Func\\u021bionalitate|Func\\u0163ionalitate|Functionalitate|Funcionalitat|Funcionalidade|Fonctionnalit\\u00e9|Fitur|F\\u012b\\u010da|Feature|Eiginleiki|Egenskap|Egenskab|Caracter\\u00edstica|Caracteristica|Business Need|Aspekt|Arwedd|Ahoy matey!|Ability):/))return a.allowScenario=\n!0,a.allowBackground=!0,a.allowPlaceholders=!1,a.allowSteps=!1,a.allowMultilineArgument=!1,a.inKeywordLine=!0,\"keyword\";if(!a.inKeywordLine&&a.allowBackground&&b.match(/(\\u80cc\\u666f|\\ubc30\\uacbd|\\u0e41\\u0e19\\u0e27\\u0e04\\u0e34\\u0e14|\\u0cb9\\u0cbf\\u0ca8\\u0ccd\\u0ca8\\u0cc6\\u0cb2\\u0cc6|\\u0c28\\u0c47\\u0c2a\\u0c25\\u0c4d\\u0c2f\\u0c02|\\u0a2a\\u0a3f\\u0a1b\\u0a4b\\u0a15\\u0a5c|\\u092a\\u0943\\u0937\\u094d\\u0920\\u092d\\u0942\\u092e\\u093f|\\u0632\\u0645\\u06cc\\u0646\\u0647|\\u0627\\u0644\\u062e\\u0644\\u0641\\u064a\\u0629|\\u05e8\\u05e7\\u05e2|\\u0422\\u0430\\u0440\\u0438\\u0445|\\u041f\\u0440\\u0435\\u0434\\u044b\\u0441\\u0442\\u043e\\u0440\\u0438\\u044f|\\u041f\\u0440\\u0435\\u0434\\u0438\\u0441\\u0442\\u043e\\u0440\\u0438\\u044f|\\u041f\\u043e\\u0437\\u0430\\u0434\\u0438\\u043d\\u0430|\\u041f\\u0435\\u0440\\u0435\\u0434\\u0443\\u043c\\u043e\\u0432\\u0430|\\u041e\\u0441\\u043d\\u043e\\u0432\\u0430|\\u041a\\u043e\\u043d\\u0442\\u0435\\u043a\\u0441\\u0442|\\u041a\\u0435\\u0440\\u0435\\u0448|\\u03a5\\u03c0\\u03cc\\u03b2\\u03b1\\u03b8\\u03c1\\u03bf|Za\\u0142o\\u017cenia|Yo\\-ho\\-ho|Tausta|Taust|Situ\\u0101cija|Rerefons|Pozadina|Pozadie|Pozad\\u00ed|Osnova|Latar Belakang|Kontext|Konteksts|Kontekstas|Kontekst|H\\u00e1tt\\u00e9r|Hannergrond|Grundlage|Ge\\u00e7mi\\u015f|Fundo|Fono|First off|Dis is what went down|Dasar|Contexto|Contexte|Context|Contesto|Cen\\u00e1rio de Fundo|Cenario de Fundo|Cefndir|B\\u1ed1i c\\u1ea3nh|Bakgrunnur|Bakgrunn|Bakgrund|Baggrund|Background|B4|Antecedents|Antecedentes|\\u00c6r|Aer|Achtergrond):/))return a.allowPlaceholders=\n!1,a.allowSteps=!0,a.allowBackground=!1,a.allowMultilineArgument=!1,a.inKeywordLine=!0,\"keyword\";if(!a.inKeywordLine&&a.allowScenario&&b.match(/(\\u5834\\u666f\\u5927\\u7db1|\\u573a\\u666f\\u5927\\u7eb2|\\u5287\\u672c\\u5927\\u7db1|\\u5267\\u672c\\u5927\\u7eb2|\\u30c6\\u30f3\\u30d7\\u30ec|\\u30b7\\u30ca\\u30ea\\u30aa\\u30c6\\u30f3\\u30d7\\u30ec\\u30fc\\u30c8|\\u30b7\\u30ca\\u30ea\\u30aa\\u30c6\\u30f3\\u30d7\\u30ec|\\u30b7\\u30ca\\u30ea\\u30aa\\u30a2\\u30a6\\u30c8\\u30e9\\u30a4\\u30f3|\\uc2dc\\ub098\\ub9ac\\uc624 \\uac1c\\uc694|\\u0e2a\\u0e23\\u0e38\\u0e1b\\u0e40\\u0e2b\\u0e15\\u0e38\\u0e01\\u0e32\\u0e23\\u0e13\\u0e4c|\\u0e42\\u0e04\\u0e23\\u0e07\\u0e2a\\u0e23\\u0e49\\u0e32\\u0e07\\u0e02\\u0e2d\\u0e07\\u0e40\\u0e2b\\u0e15\\u0e38\\u0e01\\u0e32\\u0e23\\u0e13\\u0e4c|\\u0cb5\\u0cbf\\u0cb5\\u0cb0\\u0ca3\\u0cc6|\\u0c15\\u0c25\\u0c28\\u0c02|\\u0a2a\\u0a1f\\u0a15\\u0a25\\u0a3e \\u0a30\\u0a42\\u0a2a \\u0a30\\u0a47\\u0a16\\u0a3e|\\u0a2a\\u0a1f\\u0a15\\u0a25\\u0a3e \\u0a22\\u0a3e\\u0a02\\u0a1a\\u0a3e|\\u092a\\u0930\\u093f\\u0926\\u0943\\u0936\\u094d\\u092f \\u0930\\u0942\\u092a\\u0930\\u0947\\u0916\\u093e|\\u0633\\u064a\\u0646\\u0627\\u0631\\u064a\\u0648 \\u0645\\u062e\\u0637\\u0637|\\u0627\\u0644\\u06af\\u0648\\u06cc \\u0633\\u0646\\u0627\\u0631\\u06cc\\u0648|\\u05ea\\u05d1\\u05e0\\u05d9\\u05ea \\u05ea\\u05e8\\u05d7\\u05d9\\u05e9|\\u0421\\u0446\\u0435\\u043d\\u0430\\u0440\\u0438\\u0439\\u043d\\u044b\\u04a3 \\u0442\\u04e9\\u0437\\u0435\\u043b\\u0435\\u0448\\u0435|\\u0421\\u0446\\u0435\\u043d\\u0430\\u0440\\u0438\\u0439 \\u0441\\u0442\\u0440\\u0443\\u043a\\u0442\\u0443\\u0440\\u0430\\u0441\\u0438|\\u0421\\u0442\\u0440\\u0443\\u043a\\u0442\\u0443\\u0440\\u0430 \\u0441\\u0446\\u0435\\u043d\\u0430\\u0440\\u0456\\u044e|\\u0421\\u0442\\u0440\\u0443\\u043a\\u0442\\u0443\\u0440\\u0430 \\u0441\\u0446\\u0435\\u043d\\u0430\\u0440\\u0438\\u044f|\\u0421\\u0442\\u0440\\u0443\\u043a\\u0442\\u0443\\u0440\\u0430 \\u0441\\u0446\\u0435\\u043d\\u0430\\u0440\\u0438\\u0458\\u0430|\\u0421\\u043a\\u0438\\u0446\\u0430|\\u0420\\u0430\\u043c\\u043a\\u0430 \\u043d\\u0430 \\u0441\\u0446\\u0435\\u043d\\u0430\\u0440\\u0438\\u0439|\\u041a\\u043e\\u043d\\u0446\\u0435\\u043f\\u0442|\\u03a0\\u03b5\\u03c1\\u03b9\\u03b3\\u03c1\\u03b1\\u03c6\\u03ae \\u03a3\\u03b5\\u03bd\\u03b1\\u03c1\\u03af\\u03bf\\u03c5|Wharrimean is|Template Situai|Template Senario|Template Keadaan|Tapausaihio|Szenariogrundriss|Szablon scenariusza|Swa hw\\u00e6r swa|Swa hwaer swa|Struktura scenarija|Structur\\u0103 scenariu|Structura scenariu|Skica|Skenario konsep|Shiver me timbers|Senaryo tasla\\u011f\\u0131|Schema dello scenario|Scenariomall|Scenariomal|Scenario Template|Scenario Outline|Scenario Amlinellol|Scen\\u0101rijs p\\u0113c parauga|Scenarijaus \\u0161ablonas|Reckon it's like|Raamstsenaarium|Plang vum Szenario|Plan du Sc\\u00e9nario|Plan du sc\\u00e9nario|Osnova sc\\u00e9n\\u00e1\\u0159e|Osnova Scen\\u00e1ra|N\\u00e1\\u010drt Scen\\u00e1ru|N\\u00e1\\u010drt Sc\\u00e9n\\u00e1\\u0159e|N\\u00e1\\u010drt Scen\\u00e1ra|MISHUN SRSLY|Menggariskan Senario|L\\u00fdsing D\\u00e6ma|L\\u00fdsing Atbur\\u00f0ar\\u00e1sar|Konturo de la scenaro|Koncept|Khung t\\u00ecnh hu\\u1ed1ng|Khung k\\u1ecbch b\\u1ea3n|Forgat\\u00f3k\\u00f6nyv v\\u00e1zlat|Esquema do Cen\\u00e1rio|Esquema do Cenario|Esquema del escenario|Esquema de l'escenari|Esbozo do escenario|Delinea\\u00e7\\u00e3o do Cen\\u00e1rio|Delineacao do Cenario|All y'all|Abstrakt Scenario|Abstract Scenario):/))return a.allowPlaceholders=\n!0,a.allowSteps=!0,a.allowMultilineArgument=!1,a.inKeywordLine=!0,\"keyword\";if(a.allowScenario&&b.match(/(\\u4f8b\\u5b50|\\u4f8b|\\u30b5\\u30f3\\u30d7\\u30eb|\\uc608|\\u0e0a\\u0e38\\u0e14\\u0e02\\u0e2d\\u0e07\\u0e40\\u0e2b\\u0e15\\u0e38\\u0e01\\u0e32\\u0e23\\u0e13\\u0e4c|\\u0e0a\\u0e38\\u0e14\\u0e02\\u0e2d\\u0e07\\u0e15\\u0e31\\u0e27\\u0e2d\\u0e22\\u0e48\\u0e32\\u0e07|\\u0c89\\u0ca6\\u0cbe\\u0cb9\\u0cb0\\u0ca3\\u0cc6\\u0c97\\u0cb3\\u0cc1|\\u0c09\\u0c26\\u0c3e\\u0c39\\u0c30\\u0c23\\u0c32\\u0c41|\\u0a09\\u0a26\\u0a3e\\u0a39\\u0a30\\u0a28\\u0a3e\\u0a02|\\u0909\\u0926\\u093e\\u0939\\u0930\\u0923|\\u0646\\u0645\\u0648\\u0646\\u0647 \\u0647\\u0627|\\u0627\\u0645\\u062b\\u0644\\u0629|\\u05d3\\u05d5\\u05d2\\u05de\\u05d0\\u05d5\\u05ea|\\u04ae\\u0440\\u043d\\u04d9\\u043a\\u043b\\u04d9\\u0440|\\u0421\\u0446\\u0435\\u043d\\u0430\\u0440\\u0438\\u0458\\u0438|\\u041f\\u0440\\u0438\\u043c\\u0435\\u0440\\u044b|\\u041f\\u0440\\u0438\\u043c\\u0435\\u0440\\u0438|\\u041f\\u0440\\u0438\\u043a\\u043b\\u0430\\u0434\\u0438|\\u041c\\u0438\\u0441\\u043e\\u043b\\u043b\\u0430\\u0440|\\u041c\\u0438\\u0441\\u0430\\u043b\\u043b\\u0430\\u0440|\\u03a3\\u03b5\\u03bd\\u03ac\\u03c1\\u03b9\\u03b1|\\u03a0\\u03b1\\u03c1\\u03b1\\u03b4\\u03b5\\u03af\\u03b3\\u03bc\\u03b1\\u03c4\\u03b1|You'll wanna|Voorbeelden|Variantai|Tapaukset|Se \\u00fee|Se the|Se \\u00f0e|Scenarios|Scenariji|Scenarijai|Przyk\\u0142ady|Primjeri|Primeri|P\\u0159\\u00edklady|Pr\\u00edklady|Piem\\u0113ri|P\\u00e9ld\\u00e1k|Pavyzd\\u017eiai|Paraugs|\\u00d6rnekler|Juhtumid|Exemplos|Exemples|Exemple|Exempel|EXAMPLZ|Examples|Esempi|Enghreifftiau|Ekzemploj|Eksempler|Ejemplos|D\\u1eef li\\u1ec7u|Dead men tell no tales|D\\u00e6mi|Contoh|Cen\\u00e1rios|Cenarios|Beispiller|Beispiele|Atbur\\u00f0ar\\u00e1sir):/))return a.allowPlaceholders=\n!1,a.allowSteps=!0,a.allowBackground=!1,a.allowMultilineArgument=!0,\"keyword\";if(!a.inKeywordLine&&a.allowScenario&&b.match(/(\\u5834\\u666f|\\u573a\\u666f|\\u5287\\u672c|\\u5267\\u672c|\\u30b7\\u30ca\\u30ea\\u30aa|\\uc2dc\\ub098\\ub9ac\\uc624|\\u0e40\\u0e2b\\u0e15\\u0e38\\u0e01\\u0e32\\u0e23\\u0e13\\u0e4c|\\u0c95\\u0ca5\\u0cbe\\u0cb8\\u0cbe\\u0cb0\\u0cbe\\u0c82\\u0cb6|\\u0c38\\u0c28\\u0c4d\\u0c28\\u0c3f\\u0c35\\u0c47\\u0c36\\u0c02|\\u0a2a\\u0a1f\\u0a15\\u0a25\\u0a3e|\\u092a\\u0930\\u093f\\u0926\\u0943\\u0936\\u094d\\u092f|\\u0633\\u064a\\u0646\\u0627\\u0631\\u064a\\u0648|\\u0633\\u0646\\u0627\\u0631\\u06cc\\u0648|\\u05ea\\u05e8\\u05d7\\u05d9\\u05e9|\\u0421\\u0446\\u0435\\u043d\\u0430\\u0440\\u0456\\u0439|\\u0421\\u0446\\u0435\\u043d\\u0430\\u0440\\u0438\\u043e|\\u0421\\u0446\\u0435\\u043d\\u0430\\u0440\\u0438\\u0439|\\u041f\\u0440\\u0438\\u043c\\u0435\\u0440|\\u03a3\\u03b5\\u03bd\\u03ac\\u03c1\\u03b9\\u03bf|T\\u00ecnh hu\\u1ed1ng|The thing of it is|Tapaus|Szenario|Swa|Stsenaarium|Skenario|Situai|Senaryo|Senario|Scenaro|Scenariusz|Scenariu|Sc\\u00e9nario|Scenario|Scenarijus|Scen\\u0101rijs|Scenarij|Scenarie|Sc\\u00e9n\\u00e1\\u0159|Scen\\u00e1r|Primer|MISHUN|K\\u1ecbch b\\u1ea3n|Keadaan|Heave to|Forgat\\u00f3k\\u00f6nyv|Escenario|Escenari|Cen\\u00e1rio|Cenario|Awww, look mate|Atbur\\u00f0ar\\u00e1s):/))return a.allowPlaceholders=\n!1,a.allowSteps=!0,a.allowBackground=!1,a.allowMultilineArgument=!1,a.inKeywordLine=!0,\"keyword\";if(!a.inKeywordLine&&a.allowSteps&&b.match(/(\\u90a3\\u9ebc|\\u90a3\\u4e48|\\u800c\\u4e14|\\u7576|\\u5f53|\\u5e76\\u4e14|\\u540c\\u6642|\\u540c\\u65f6|\\u524d\\u63d0|\\u5047\\u8bbe|\\u5047\\u8a2d|\\u5047\\u5b9a|\\u5047\\u5982|\\u4f46\\u662f|\\u4f46\\u3057|\\u4e26\\u4e14|\\u3082\\u3057|\\u306a\\u3089\\u3070|\\u305f\\u3060\\u3057|\\u3057\\u304b\\u3057|\\u304b\\u3064|\\ud558\\uc9c0\\ub9cc|\\uc870\\uac74|\\uba3c\\uc800|\\ub9cc\\uc77c|\\ub9cc\\uc57d|\\ub2e8|\\uadf8\\ub9ac\\uace0|\\uadf8\\ub7ec\\uba74|\\u0e41\\u0e25\\u0e30 |\\u0e40\\u0e21\\u0e37\\u0e48\\u0e2d |\\u0e41\\u0e15\\u0e48 |\\u0e14\\u0e31\\u0e07\\u0e19\\u0e31\\u0e49\\u0e19 |\\u0e01\\u0e33\\u0e2b\\u0e19\\u0e14\\u0e43\\u0e2b\\u0e49 |\\u0cb8\\u0ccd\\u0ca5\\u0cbf\\u0ca4\\u0cbf\\u0caf\\u0ca8\\u0ccd\\u0ca8\\u0cc1 |\\u0cae\\u0ca4\\u0ccd\\u0ca4\\u0cc1 |\\u0ca8\\u0cbf\\u0cd5\\u0ca1\\u0cbf\\u0ca6 |\\u0ca8\\u0c82\\u0ca4\\u0cb0 |\\u0c86\\u0ca6\\u0cb0\\u0cc6 |\\u0c2e\\u0c30\\u0c3f\\u0c2f\\u0c41 |\\u0c1a\\u0c46\\u0c2a\\u0c4d\\u0c2a\\u0c2c\\u0c21\\u0c3f\\u0c28\\u0c26\\u0c3f |\\u0c15\\u0c3e\\u0c28\\u0c3f |\\u0c08 \\u0c2a\\u0c30\\u0c3f\\u0c38\\u0c4d\\u0c25\\u0c3f\\u0c24\\u0c3f\\u0c32\\u0c4b |\\u0c05\\u0c2a\\u0c4d\\u0c2a\\u0c41\\u0c21\\u0c41 |\\u0a2a\\u0a30 |\\u0a24\\u0a26 |\\u0a1c\\u0a47\\u0a15\\u0a30 |\\u0a1c\\u0a3f\\u0a35\\u0a47\\u0a02 \\u0a15\\u0a3f |\\u0a1c\\u0a26\\u0a4b\\u0a02 |\\u0a05\\u0a24\\u0a47 |\\u092f\\u0926\\u093f |\\u092a\\u0930\\u0928\\u094d\\u0924\\u0941 |\\u092a\\u0930 |\\u0924\\u092c |\\u0924\\u0926\\u093e |\\u0924\\u0925\\u093e |\\u091c\\u092c |\\u091a\\u0942\\u0902\\u0915\\u093f |\\u0915\\u093f\\u0928\\u094d\\u0924\\u0941 |\\u0915\\u0926\\u093e |\\u0914\\u0930 |\\u0905\\u0917\\u0930 |\\u0648 |\\u0647\\u0646\\u06af\\u0627\\u0645\\u06cc |\\u0645\\u062a\\u0649 |\\u0644\\u0643\\u0646 |\\u0639\\u0646\\u062f\\u0645\\u0627 |\\u062b\\u0645 |\\u0628\\u0641\\u0631\\u0636 |\\u0628\\u0627 \\u0641\\u0631\\u0636 |\\u0627\\u0645\\u0627 |\\u0627\\u0630\\u0627\\u064b |\\u0622\\u0646\\u06af\\u0627\\u0647 |\\u05db\\u05d0\\u05e9\\u05e8 |\\u05d5\\u05d2\\u05dd |\\u05d1\\u05d4\\u05d9\\u05e0\\u05ea\\u05df |\\u05d0\\u05d6\\u05d9 |\\u05d0\\u05d6 |\\u05d0\\u05d1\\u05dc |\\u042f\\u043a\\u0449\\u043e |\\u04ba\\u04d9\\u043c |\\u0423\\u043d\\u0434\\u0430 |\\u0422\\u043e\\u0434\\u0456 |\\u0422\\u043e\\u0433\\u0434\\u0430 |\\u0422\\u043e |\\u0422\\u0430\\u043a\\u0436\\u0435 |\\u0422\\u0430 |\\u041f\\u0443\\u0441\\u0442\\u044c |\\u041f\\u0440\\u0438\\u043f\\u0443\\u0441\\u0442\\u0438\\u043c\\u043e, \\u0449\\u043e |\\u041f\\u0440\\u0438\\u043f\\u0443\\u0441\\u0442\\u0438\\u043c\\u043e |\\u041e\\u043d\\u0434\\u0430 |\\u041d\\u043e |\\u041d\\u0435\\u0445\\u0430\\u0439 |\\u041d\\u04d9\\u0442\\u0438\\u0497\\u04d9\\u0434\\u04d9 |\\u041b\\u0435\\u043a\\u0438\\u043d |\\u041b\\u04d9\\u043a\\u0438\\u043d |\\u041a\\u043e\\u043b\\u0438 |\\u041a\\u043e\\u0433\\u0434\\u0430 |\\u041a\\u043e\\u0433\\u0430\\u0442\\u043e |\\u041a\\u0430\\u0434\\u0430 |\\u041a\\u0430\\u0434 |\\u041a \\u0442\\u043e\\u043c\\u0443 \\u0436\\u0435 |\\u0406 |\\u0418 |\\u0417\\u0430\\u0434\\u0430\\u0442\\u043e |\\u0417\\u0430\\u0434\\u0430\\u0442\\u0438 |\\u0417\\u0430\\u0434\\u0430\\u0442\\u0435 |\\u0415\\u0441\\u043b\\u0438 |\\u0414\\u043e\\u043f\\u0443\\u0441\\u0442\\u0438\\u043c |\\u0414\\u0430\\u043d\\u043e |\\u0414\\u0430\\u0434\\u0435\\u043d\\u043e |\\u0412\\u04d9 |\\u0412\\u0430 |\\u0411\\u0438\\u0440\\u043e\\u043a |\\u04d8\\u043c\\u043c\\u0430 |\\u04d8\\u0439\\u0442\\u0438\\u043a |\\u04d8\\u0433\\u04d9\\u0440 |\\u0410\\u043c\\u043c\\u043e |\\u0410\\u043b\\u0438 |\\u0410\\u043b\\u0435 |\\u0410\\u0433\\u0430\\u0440 |\\u0410 \\u0442\\u0430\\u043a\\u043e\\u0436 |\\u0410 |\\u03a4\\u03cc\\u03c4\\u03b5 |\\u038c\\u03c4\\u03b1\\u03bd |\\u039a\\u03b1\\u03b9 |\\u0394\\u03b5\\u03b4\\u03bf\\u03bc\\u03ad\\u03bd\\u03bf\\u03c5 |\\u0391\\u03bb\\u03bb\\u03ac |\\u00deurh |\\u00deegar |\\u00dea \\u00fee |\\u00de\\u00e1 |\\u00dea |Zatati |Zak\\u0142adaj\\u0105c |Zadato |Zadate |Zadano |Zadani |Zadan |Za p\\u0159edpokladu |Za predpokladu |Youse know when youse got |Youse know like when |Yna |Yeah nah |Y'know |Y |Wun |Wtedy |When y'all |When |Wenn |WEN |wann |Ve |V\\u00e0 |Und |Un |ugeholl |Too right |Thurh |Th\\u00ec |Then y'all |Then |Tha the |Tha |Tetapi |Tapi |Tak |Tada |Tad |Stel |Soit |Siis |\\u0218i |\\u015ei |Si |Sed |Se |S\\u00e5 |Quando |Quand |Quan |Pryd |Potom |Pokud |Pokia\\u013e |Per\\u00f2 |Pero |Pak |Oraz |Onda |Ond |Oletetaan |Og |Och |O zaman |Niin |Nh\\u01b0ng |N\\u00e4r |N\\u00e5r |Mutta |Men |Mas |Maka |Majd |Maj\\u0105c |Mais |Maar |m\\u00e4 |Ma |Lorsque |Lorsqu'|Logo |Let go and haul |Kun |Kuid |Kui |Kiedy |Khi |Ketika |Kemudian |Ke\\u010f |Kdy\\u017e |Kaj |Kai |Kada |Kad |Je\\u017celi |Je\\u015bli |Ja |It's just unbelievable |Ir |I CAN HAZ |I |Ha |Givun |Givet |Given y'all |Given |Gitt |Gegeven |Gegeben seien |Gegeben sei |Gdy |Gangway! |Fakat |\\u00c9tant donn\\u00e9s |Etant donn\\u00e9s |\\u00c9tant donn\\u00e9es |Etant donn\\u00e9es |\\u00c9tant donn\\u00e9e |Etant donn\\u00e9e |\\u00c9tant donn\\u00e9 |Etant donn\\u00e9 |Et |\\u00c9s |Entonces |Ent\\u00f3n |Ent\\u00e3o |Entao |En |E\\u011fer ki |Ef |Eeldades |E |\\u00d0urh |Duota |Dun |Donita\\u0135o |Donat |Donada |Do |Diyelim ki |Diberi |Dengan |Den youse gotta |DEN |De |Dato |Da\\u021bi fiind |Da\\u0163i fiind |Dati fiind |Dati |Date fiind |Date |Data |Dat fiind |Dar |Dann |dann |Dan |Dados |Dado |Dadas |Dada |\\u00d0a \\u00f0e |\\u00d0a |Cuando |Cho |Cando |C\\u00e2nd |Cand |Cal |But y'all |But at the end of the day I reckon |BUT |But |Buh |Blimey! |Bi\\u1ebft |Bet |Bagi |Aye |awer |Avast! |Atunci |Atesa |At\\u00e8s |Apabila |Anrhegedig a |Angenommen |And y'all |And |AN |An |an |Amikor |Amennyiben |Ama |Als |Alors |Allora |Ali |Aleshores |Ale |Akkor |Ak |Adott |Ac |Aber |A z\\u00e1rove\\u0148 |A tie\\u017e |A taktie\\u017e |A tak\\u00e9 |A |a |7 |\\* )/))return a.inStep=\n!0,a.allowPlaceholders=!0,a.allowMultilineArgument=!0,a.inKeywordLine=!0,\"keyword\";if(b.match(/\"[^\"]*\"?/))return\"string\";if(a.allowPlaceholders&&b.match(/<[^>]*>?/))return\"variable\";b.next();b.eatWhile(/[^@\"<#]/);return null}}});c.defineMIME(\"text/x-feature\",\"gherkin\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/go/go.js",
    "content": "'use strict';(function(f){\"object\"==typeof exports&&\"object\"==typeof module?f(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],f):f(CodeMirror)})(function(f){f.defineMode(\"go\",function(f){function g(a,c){var b=a.next();if('\"'==b||\"'\"==b||\"`\"==b)return c.tokenize=q(b),c.tokenize(a,c);if(/[\\d\\.]/.test(b))return\".\"==b?a.match(/^[0-9]+([eE][\\-+]?[0-9]+)?/):\"0\"==b?a.match(/^[xX][0-9a-fA-F]+/)||a.match(/^0[0-7]+/):a.match(/^[0-9]*\\.?[0-9]*([eE][\\-+]?[0-9]+)?/),\n\"number\";if(/[\\[\\]{}\\(\\),;\\:\\.]/.test(b))return e=b,null;if(\"/\"==b){if(a.eat(\"*\"))return c.tokenize=k,k(a,c);if(a.eat(\"/\"))return a.skipToEnd(),\"comment\"}if(l.test(b))return a.eatWhile(l),\"operator\";a.eatWhile(/[\\w\\$_\\xa1-\\uffff]/);a=a.current();if(r.propertyIsEnumerable(a)){if(\"case\"==a||\"default\"==a)e=\"case\";return\"keyword\"}return t.propertyIsEnumerable(a)?\"atom\":\"variable\"}function q(a){return function(c,b){for(var d=!1,e,f=!1;null!=(e=c.next());){if(e==a&&!d){f=!0;break}d=!d&&\"`\"!=a&&\"\\\\\"==e}if(f||\n!d&&\"`\"!=a)b.tokenize=g;return\"string\"}}function k(a,c){for(var b=!1,d;d=a.next();){if(\"/\"==d&&b){c.tokenize=g;break}b=\"*\"==d}return\"comment\"}function m(a,c,b,d,e){this.indented=a;this.column=c;this.type=b;this.align=d;this.prev=e}function h(a,c,b){return a.context=new m(a.indented,c,b,null,a.context)}function n(a){if(a.context.prev){var c=a.context.type;if(\")\"==c||\"]\"==c||\"}\"==c)a.indented=a.context.indented;return a.context=a.context.prev}}var p=f.indentUnit,r={\"break\":!0,\"case\":!0,chan:!0,\"const\":!0,\n\"continue\":!0,\"default\":!0,defer:!0,\"else\":!0,fallthrough:!0,\"for\":!0,func:!0,go:!0,\"goto\":!0,\"if\":!0,\"import\":!0,\"interface\":!0,map:!0,\"package\":!0,range:!0,\"return\":!0,select:!0,struct:!0,\"switch\":!0,type:!0,\"var\":!0,bool:!0,\"byte\":!0,complex64:!0,complex128:!0,float32:!0,float64:!0,int8:!0,int16:!0,int32:!0,int64:!0,string:!0,uint8:!0,uint16:!0,uint32:!0,uint64:!0,\"int\":!0,uint:!0,uintptr:!0,error:!0},t={\"true\":!0,\"false\":!0,iota:!0,nil:!0,append:!0,cap:!0,close:!0,complex:!0,copy:!0,imag:!0,len:!0,\nmake:!0,\"new\":!0,panic:!0,print:!0,println:!0,real:!0,recover:!0},l=/[+\\-*&^%:=<>!|\\/]/,e;return{startState:function(a){return{tokenize:null,context:new m((a||0)-p,0,\"top\",!1),indented:0,startOfLine:!0}},token:function(a,c){var b=c.context;a.sol()&&(null==b.align&&(b.align=!1),c.indented=a.indentation(),c.startOfLine=!0,\"case\"==b.type&&(b.type=\"}\"));if(a.eatSpace())return null;e=null;var d=(c.tokenize||g)(a,c);if(\"comment\"==d)return d;null==b.align&&(b.align=!0);\"{\"==e?h(c,a.column(),\"}\"):\"[\"==e?\nh(c,a.column(),\"]\"):\"(\"==e?h(c,a.column(),\")\"):\"case\"==e?b.type=\"case\":\"}\"==e&&\"}\"==b.type?n(c):e==b.type&&n(c);c.startOfLine=!1;return d},indent:function(a,c){if(a.tokenize!=g&&null!=a.tokenize)return 0;var b=a.context,d=c&&c.charAt(0);if(\"case\"==b.type&&/^(?:case|default)\\b/.test(c))return a.context.type=\"}\",b.indented;a=d==b.type;return b.align?b.column+(a?0:1):b.indented+(a?0:p)},electricChars:\"{}):\",fold:\"brace\",blockCommentStart:\"/*\",blockCommentEnd:\"*/\",lineComment:\"//\"}});f.defineMIME(\"text/x-go\",\n\"go\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/groovy/groovy.js",
    "content": "'use strict';(function(f){\"object\"==typeof exports&&\"object\"==typeof module?f(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],f):f(CodeMirror)})(function(f){f.defineMode(\"groovy\",function(f){function h(a){var b={};a=a.split(\" \");for(var c=0;c<a.length;++c)b[a[c]]=!0;return b}function l(a,b){var c=a.next();if('\"'==c||\"'\"==c)return n(c,a,b);if(/[\\[\\]{}\\(\\),;\\:\\.]/.test(c))return e=c,null;if(/\\d/.test(c))return a.eatWhile(/[\\w\\.]/),a.eat(/eE/)&&\n(a.eat(/\\+\\-/),a.eatWhile(/\\d/)),\"number\";if(\"/\"==c){if(a.eat(\"*\"))return b.tokenize.push(p),p(a,b);if(a.eat(\"/\"))return a.skipToEnd(),\"comment\";if(m(b.lastToken,!1))return n(c,a,b)}if(\"-\"==c&&a.eat(\">\"))return e=\"->\",null;if(/[+\\-*&%=<>!?|\\/~]/.test(c))return a.eatWhile(/[+\\-*&%=<>|~]/),\"operator\";a.eatWhile(/[\\w\\$_]/);if(\"@\"==c)return a.eatWhile(/[\\w\\$_\\.]/),\"meta\";if(\".\"==b.lastToken)return\"property\";if(a.eat(\":\"))return e=\"proplabel\",\"property\";a=a.current();return r.propertyIsEnumerable(a)?\"atom\":\nt.propertyIsEnumerable(a)?(u.propertyIsEnumerable(a)?e=\"newstatement\":v.propertyIsEnumerable(a)&&(e=\"standalone\"),\"keyword\"):\"variable\"}function n(a,b,c){function d(c,b){for(var d=!1,f,g=!e;null!=(f=c.next());){if(f==a&&!d){if(!e)break;if(c.match(a+a)){g=!0;break}}if('\"'==a&&\"$\"==f&&!d&&c.eat(\"{\"))return b.tokenize.push(w()),\"string\";d=!d&&\"\\\\\"==f}g&&b.tokenize.pop();return\"string\"}var e=!1;if(\"/\"!=a&&b.eat(a))if(b.eat(a))e=!0;else return\"string\";c.tokenize.push(d);return d(b,c)}function w(){function a(a,\nd){if(\"}\"==a.peek()){if(b--,0==b)return d.tokenize.pop(),d.tokenize[d.tokenize.length-1](a,d)}else\"{\"==a.peek()&&b++;return l(a,d)}var b=1;a.isBase=!0;return a}function p(a,b){for(var c=!1,d;d=a.next();){if(\"/\"==d&&c){b.tokenize.pop();break}c=\"*\"==d}return\"comment\"}function m(a,b){return!a||\"operator\"==a||\"->\"==a||/[\\.\\[\\{\\(,;:]/.test(a)||\"newstatement\"==a||\"keyword\"==a||\"proplabel\"==a||\"standalone\"==a&&!b}function q(a,b,c,d,e){this.indented=a;this.column=b;this.type=c;this.align=d;this.prev=e}function k(a,\nb,c){return a.context=new q(a.indented,b,c,null,a.context)}function g(a){var b=a.context.type;if(\")\"==b||\"]\"==b||\"}\"==b)a.indented=a.context.indented;return a.context=a.context.prev}var t=h(\"abstract as assert boolean break byte case catch char class const continue def default do double else enum extends final finally float for goto if implements import in instanceof int interface long native new package private protected public return short static strictfp super switch synchronized threadsafe throw throws transient try void volatile while\"),\nu=h(\"catch class do else finally for if switch try while enum interface def\"),v=h(\"return break continue\"),r=h(\"null true false this\"),e;l.isBase=!0;return{startState:function(a){return{tokenize:[l],context:new q((a||0)-f.indentUnit,0,\"top\",!1),indented:0,startOfLine:!0,lastToken:null}},token:function(a,b){var c=b.context;a.sol()&&(null==c.align&&(c.align=!1),b.indented=a.indentation(),b.startOfLine=!0,\"statement\"!=c.type||m(b.lastToken,!0)||(g(b),c=b.context));if(a.eatSpace())return null;e=null;\nvar d=b.tokenize[b.tokenize.length-1](a,b);if(\"comment\"==d)return d;null==c.align&&(c.align=!0);if(\";\"!=e&&\":\"!=e||\"statement\"!=c.type)if(\"->\"==e&&\"statement\"==c.type&&\"}\"==c.prev.type)g(b),b.context.align=!1;else if(\"{\"==e)k(b,a.column(),\"}\");else if(\"[\"==e)k(b,a.column(),\"]\");else if(\"(\"==e)k(b,a.column(),\")\");else if(\"}\"==e){for(;\"statement\"==c.type;)c=g(b);for(\"}\"==c.type&&(c=g(b));\"statement\"==c.type;)c=g(b)}else e==c.type?g(b):(\"}\"==c.type||\"top\"==c.type||\"statement\"==c.type&&\"newstatement\"==\ne)&&k(b,a.column(),\"statement\");else g(b);b.startOfLine=!1;b.lastToken=e||d;return d},indent:function(a,b){if(!a.tokenize[a.tokenize.length-1].isBase)return 0;b=b&&b.charAt(0);var c=a.context;\"statement\"!=c.type||m(a.lastToken,!0)||(c=c.prev);a=b==c.type;return\"statement\"==c.type?c.indented+(\"{\"==b?0:f.indentUnit):c.align?c.column+(a?0:1):c.indented+(a?0:f.indentUnit)},electricChars:\"{}\",closeBrackets:{triples:\"'\\\"\"},fold:\"brace\"}});f.defineMIME(\"text/x-groovy\",\"groovy\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/haml/haml.js",
    "content": "'use strict';(function(d){\"object\"==typeof exports&&\"object\"==typeof module?d(require(\"../../lib/codemirror\"),require(\"../htmlmixed/htmlmixed\"),require(\"../ruby/ruby\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\",\"../htmlmixed/htmlmixed\",\"../ruby/ruby\"],d):d(CodeMirror)})(function(d){d.defineMode(\"haml\",function(k){function l(b){return function(a,c){return a.peek()==b&&1==c.rubyState.tokenize.length?(a.next(),c.tokenize=f,\"closeAttributeTag\"):e(a,c)}}function e(b,a){return b.match(\"-#\")?\n(b.skipToEnd(),\"comment\"):g.token(b,a.rubyState)}function f(b,a){var c=b.peek();if(\"comment\"==a.previousToken.style&&a.indented>a.previousToken.indented)return b.skipToEnd(),\"commentLine\";if(a.startOfLine){if(\"!\"==c&&b.match(\"!!\"))return b.skipToEnd(),\"tag\";if(b.match(/^%[\\w:#\\.]+=/))return a.tokenize=e,\"hamlTag\";if(b.match(/^%[\\w:]+/))return\"hamlTag\";if(\"/\"==c)return b.skipToEnd(),\"comment\"}if(a.startOfLine||\"hamlTag\"==a.previousToken.style)if(\"#\"==c||\".\"==c)return b.match(/[\\w-#\\.]*/),\"hamlAttribute\";\nif(a.startOfLine&&!b.match(\"--\\x3e\",!1)&&(\"=\"==c||\"-\"==c))return a.tokenize=e,a.tokenize(b,a);if(\"hamlTag\"==a.previousToken.style||\"closeAttributeTag\"==a.previousToken.style||\"hamlAttribute\"==a.previousToken.style){if(\"(\"==c)return a.tokenize=l(\")\"),a.tokenize(b,a);if(\"{\"==c&&!b.match(/^\\{%.*/))return a.tokenize=l(\"}\"),a.tokenize(b,a)}return h.token(b,a.htmlState)}var h=d.getMode(k,{name:\"htmlmixed\"}),g=d.getMode(k,\"ruby\");return{startState:function(){var b=d.startState(h),a=d.startState(g);return{htmlState:b,\nrubyState:a,indented:0,previousToken:{style:null,indented:0},tokenize:f}},copyState:function(b){return{htmlState:d.copyState(h,b.htmlState),rubyState:d.copyState(g,b.rubyState),indented:b.indented,previousToken:b.previousToken,tokenize:b.tokenize}},token:function(b,a){b.sol()&&(a.indented=b.indentation(),a.startOfLine=!0);if(b.eatSpace())return null;var c=a.tokenize(b,a);a.startOfLine=!1;c&&\"commentLine\"!=c&&(a.previousToken={style:c,indented:a.indented});if(b.eol()&&a.tokenize==e){b.backUp(1);var d=\nb.peek();b.next();d&&\",\"!=d&&(a.tokenize=f)}\"hamlTag\"==c?c=\"tag\":\"commentLine\"==c?c=\"comment\":\"hamlAttribute\"==c?c=\"attribute\":\"closeAttributeTag\"==c&&(c=null);return c}}},\"htmlmixed\",\"ruby\");d.defineMIME(\"text/x-haml\",\"haml\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/handlebars/handlebars.js",
    "content": "'use strict';(function(a){\"object\"==typeof exports&&\"object\"==typeof module?a(require(\"../../lib/codemirror\"),require(\"../../addon/mode/simple\"),require(\"../../addon/mode/multiplex\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\",\"../../addon/mode/simple\",\"../../addon/mode/multiplex\"],a):a(CodeMirror)})(function(a){a.defineSimpleMode(\"handlebars-tags\",{start:[{regex:/\\{\\{!--/,push:\"dash_comment\",token:\"comment\"},{regex:/\\{\\{!/,push:\"comment\",token:\"comment\"},{regex:/\\{\\{/,push:\"handlebars\",\ntoken:\"tag\"}],handlebars:[{regex:/\\}\\}/,pop:!0,token:\"tag\"},{regex:/\"(?:[^\\\\\"]|\\\\.)*\"?/,token:\"string\"},{regex:/'(?:[^\\\\']|\\\\.)*'?/,token:\"string\"},{regex:/>|[#\\/]([A-Za-z_]\\w*)/,token:\"keyword\"},{regex:/(?:else|this)\\b/,token:\"keyword\"},{regex:/\\d+/i,token:\"number\"},{regex:/=|~|@|true|false/,token:\"atom\"},{regex:/(?:\\.\\.\\/)*(?:[A-Za-z_][\\w\\.]*)+/,token:\"variable-2\"}],dash_comment:[{regex:/--\\}\\}/,pop:!0,token:\"comment\"},{regex:/./,token:\"comment\"}],comment:[{regex:/\\}\\}/,pop:!0,token:\"comment\"},\n{regex:/./,token:\"comment\"}]});a.defineMode(\"handlebars\",function(c,b){var d=a.getMode(c,\"handlebars-tags\");return b&&b.base?a.multiplexingMode(a.getMode(c,b.base),{open:\"{{\",close:\"}}\",mode:d,parseDelimiters:!0}):d});a.defineMIME(\"text/x-handlebars-template\",\"handlebars\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/haskell/haskell.js",
    "content": "'use strict';(function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],e):e(CodeMirror)})(function(e){e.defineMode(\"haskell\",function(e,t){function g(a,c,b){c(b);return b(a,c)}function f(a,c){if(a.eatWhile(l))return null;var b=a.next();if(u.test(b)){if(\"{\"==b&&a.eat(\"-\")){var d=\"comment\";a.eat(\"#\")&&(d=\"meta\");return g(a,c,m(d,1))}return null}if(\"'\"==b)return a.eat(\"\\\\\"),a.next(),a.eat(\"'\")?\n\"string\":\"error\";if('\"'==b)return g(a,c,n);if(v.test(b))return a.eatWhile(p),a.eat(\".\")?\"qualifier\":\"variable-2\";if(w.test(b))return a.eatWhile(p),\"variable\";if(h.test(b)){if(\"0\"==b){if(a.eat(/[xX]/))return a.eatWhile(x),\"integer\";if(a.eat(/[oO]/))return a.eatWhile(y),\"number\"}a.eatWhile(h);d=\"number\";a.match(/^\\.\\d+/)&&(d=\"number\");a.eat(/[eE]/)&&(d=\"number\",a.eat(/[-+]/),a.eatWhile(h));return d}if(\".\"==b&&a.eat(\".\"))return\"keyword\";if(k.test(b)){if(\"-\"==b&&a.eat(/-/)&&(a.eatWhile(/-/),!a.eat(k)))return a.skipToEnd(),\n\"comment\";d=\"variable\";\":\"==b&&(d=\"variable-2\");a.eatWhile(k);return d}return\"error\"}function m(a,c){return 0==c?f:function(b,d){for(var e=c;!b.eol();){var q=b.next();if(\"{\"==q&&b.eat(\"-\"))++e;else if(\"-\"==q&&b.eat(\"}\")&&(--e,0==e))return d(f),a}d(m(a,e));return a}}function n(a,c){for(;!a.eol();){var b=a.next();if('\"'==b)return c(f),\"string\";if(\"\\\\\"==b){if(a.eol()||a.eat(l))return c(z),\"string\";a.eat(\"&\")||a.next()}}c(f);return\"error\"}function z(a,c){if(a.eat(\"\\\\\"))return g(a,c,n);a.next();c(f);return\"error\"}\nvar w=/[a-z_]/,v=/[A-Z]/,h=/\\d/,x=/[0-9A-Fa-f]/,y=/[0-7]/,p=/[a-z_A-Z0-9'\\xa1-\\uffff]/,k=/[-!#$%&*+.\\/<=>?@\\\\^|~:]/,u=/[(),;[\\]`{}]/,l=/[ \\t\\v\\f]/,r=function(){function a(a){return function(){for(var b=0;b<arguments.length;b++)c[arguments[b]]=a}}var c={};a(\"keyword\")(\"case\",\"class\",\"data\",\"default\",\"deriving\",\"do\",\"else\",\"foreign\",\"if\",\"import\",\"in\",\"infix\",\"infixl\",\"infixr\",\"instance\",\"let\",\"module\",\"newtype\",\"of\",\"then\",\"type\",\"where\",\"_\");a(\"keyword\")(\"..\",\":\",\"::\",\"=\",\"\\\\\",'\"',\"<-\",\"->\",\"@\",\"~\",\n\"=>\");a(\"builtin\")(\"!!\",\"$!\",\"$\",\"&&\",\"+\",\"++\",\"-\",\".\",\"/\",\"/=\",\"<\",\"<=\",\"=<<\",\"==\",\">\",\">=\",\">>\",\">>=\",\"^\",\"^^\",\"||\",\"*\",\"**\");a(\"builtin\")(\"Bool\",\"Bounded\",\"Char\",\"Double\",\"EQ\",\"Either\",\"Enum\",\"Eq\",\"False\",\"FilePath\",\"Float\",\"Floating\",\"Fractional\",\"Functor\",\"GT\",\"IO\",\"IOError\",\"Int\",\"Integer\",\"Integral\",\"Just\",\"LT\",\"Left\",\"Maybe\",\"Monad\",\"Nothing\",\"Num\",\"Ord\",\"Ordering\",\"Rational\",\"Read\",\"ReadS\",\"Real\",\"RealFloat\",\"RealFrac\",\"Right\",\"Show\",\"ShowS\",\"String\",\"True\");a(\"builtin\")(\"abs\",\"acos\",\"acosh\",\n\"all\",\"and\",\"any\",\"appendFile\",\"asTypeOf\",\"asin\",\"asinh\",\"atan\",\"atan2\",\"atanh\",\"break\",\"catch\",\"ceiling\",\"compare\",\"concat\",\"concatMap\",\"const\",\"cos\",\"cosh\",\"curry\",\"cycle\",\"decodeFloat\",\"div\",\"divMod\",\"drop\",\"dropWhile\",\"either\",\"elem\",\"encodeFloat\",\"enumFrom\",\"enumFromThen\",\"enumFromThenTo\",\"enumFromTo\",\"error\",\"even\",\"exp\",\"exponent\",\"fail\",\"filter\",\"flip\",\"floatDigits\",\"floatRadix\",\"floatRange\",\"floor\",\"fmap\",\"foldl\",\"foldl1\",\"foldr\",\"foldr1\",\"fromEnum\",\"fromInteger\",\"fromIntegral\",\"fromRational\",\n\"fst\",\"gcd\",\"getChar\",\"getContents\",\"getLine\",\"head\",\"id\",\"init\",\"interact\",\"ioError\",\"isDenormalized\",\"isIEEE\",\"isInfinite\",\"isNaN\",\"isNegativeZero\",\"iterate\",\"last\",\"lcm\",\"length\",\"lex\",\"lines\",\"log\",\"logBase\",\"lookup\",\"map\",\"mapM\",\"mapM_\",\"max\",\"maxBound\",\"maximum\",\"maybe\",\"min\",\"minBound\",\"minimum\",\"mod\",\"negate\",\"not\",\"notElem\",\"null\",\"odd\",\"or\",\"otherwise\",\"pi\",\"pred\",\"print\",\"product\",\"properFraction\",\"putChar\",\"putStr\",\"putStrLn\",\"quot\",\"quotRem\",\"read\",\"readFile\",\"readIO\",\"readList\",\"readLn\",\n\"readParen\",\"reads\",\"readsPrec\",\"realToFrac\",\"recip\",\"rem\",\"repeat\",\"replicate\",\"return\",\"reverse\",\"round\",\"scaleFloat\",\"scanl\",\"scanl1\",\"scanr\",\"scanr1\",\"seq\",\"sequence\",\"sequence_\",\"show\",\"showChar\",\"showList\",\"showParen\",\"showString\",\"shows\",\"showsPrec\",\"significand\",\"signum\",\"sin\",\"sinh\",\"snd\",\"span\",\"splitAt\",\"sqrt\",\"subtract\",\"succ\",\"sum\",\"tail\",\"take\",\"takeWhile\",\"tan\",\"tanh\",\"toEnum\",\"toInteger\",\"toRational\",\"truncate\",\"uncurry\",\"undefined\",\"unlines\",\"until\",\"unwords\",\"unzip\",\"unzip3\",\"userError\",\n\"words\",\"writeFile\",\"zip\",\"zip3\",\"zipWith\",\"zipWith3\");var b=t.overrideKeywords;if(b)for(var d in b)b.hasOwnProperty(d)&&(c[d]=b[d]);return c}();return{startState:function(){return{f:f}},copyState:function(a){return{f:a.f}},token:function(a,c){var b=c.f(a,function(a){c.f=a});a=a.current();return r.hasOwnProperty(a)?r[a]:b},blockCommentStart:\"{-\",blockCommentEnd:\"-}\",lineComment:\"--\"}});e.defineMIME(\"text/x-haskell\",\"haskell\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/haskell-literate/haskell-literate.js",
    "content": "'use strict';(function(a){\"object\"==typeof exports&&\"object\"==typeof module?a(require(\"../../lib/codemirror\"),require(\"../haskell/haskell\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\",\"../haskell/haskell\"],a):a(CodeMirror)})(function(a){a.defineMode(\"haskell-literate\",function(e,d){var b=a.getMode(e,d&&d.base||\"haskell\");return{startState:function(){return{inCode:!1,baseState:a.startState(b)}},token:function(a,c){if(a.sol()&&(c.inCode=a.eat(\">\")))return\"meta\";if(c.inCode)return b.token(a,\nc.baseState);a.skipToEnd();return\"comment\"},innerMode:function(a){return a.inCode?{state:a.baseState,mode:b}:null}}},\"haskell\");a.defineMIME(\"text/x-literate-haskell\",\"haskell-literate\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/haxe/haxe.js",
    "content": "'use strict';(function(p){\"object\"==typeof exports&&\"object\"==typeof module?p(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],p):p(CodeMirror)})(function(p){p.defineMode(\"haxe\",function(f,q){function c(a){return{type:a,style:\"keyword\"}}function p(a,d){for(var b=!1,k;null!=(k=a.next());){if(k==d&&!b)return!0;b=!b&&\"\\\\\"==k}}function n(a,d,b){l=a;M=b;return d}function A(a,d){var b=a.next();if('\"'==b||\"'\"==b)return b=X(b),d.tokenize=b,b(a,d);if(/[\\[\\]{}\\(\\),;\\:\\.]/.test(b))return n(b);\nif(\"0\"==b&&a.eat(/x/i))return a.eatWhile(/[\\da-f]/i),n(\"number\",\"number\");if(/\\d/.test(b)||\"-\"==b&&a.eat(/\\d/))return a.match(/^\\d*(?:\\.\\d*(?!\\.))?(?:[eE][+\\-]?\\d+)?/),n(\"number\",\"number\");if(d.reAllowed&&\"~\"==b&&a.eat(/\\//))return p(a,\"/\"),a.eatWhile(/[gimsu]/),n(\"regexp\",\"string-2\");if(\"/\"==b){if(a.eat(\"*\"))return b=Y,d.tokenize=b,b(a,d);if(a.eat(\"/\"))return a.skipToEnd(),n(\"comment\",\"comment\");a.eatWhile(F);return n(\"operator\",null,a.current())}if(\"#\"==b)return a.skipToEnd(),n(\"conditional\",\"meta\");\nif(\"@\"==b)return a.eat(/:/),a.eatWhile(/[\\w_]/),n(\"metadata\",\"meta\");if(F.test(b))return a.eatWhile(F),n(\"operator\",null,a.current());if(/[A-Z]/.test(b))return a.eatWhile(/[\\w_<>]/),a=a.current(),n(\"type\",\"variable-3\",a);a.eatWhile(/[\\w_]/);a=a.current();return(b=N.propertyIsEnumerable(a)&&N[a])&&d.kwAllowed?n(b.type,b.style,a):n(\"variable\",\"variable\",a)}function X(a){return function(b,c){p(b,a)&&(c.tokenize=A);return n(\"string\",\"string\")}}function Y(a,b){for(var d=!1,k;k=a.next();){if(\"/\"==k&&d){b.tokenize=\nA;break}d=\"*\"==k}return n(\"comment\",\"comment\")}function O(a,b,c,k,g,f){this.indented=a;this.column=b;this.type=c;this.prev=g;this.info=f;null!=k&&(this.align=k)}function P(a){for(var b=g.state,c=b.importedtypes;c;c=c.next)if(c.name==a)return;b.importedtypes={name:a,next:b.importedtypes}}function t(){for(var a=arguments.length-1;0<=a;a--)g.cc.push(arguments[a])}function b(){t.apply(null,arguments);return!0}function Q(a,b){for(;b;b=b.next)if(b.name==a)return!0;return!1}function B(a){var b=g.state;b.context?\n(g.marked=\"def\",Q(a,b.localVars)||(b.localVars={name:a,next:b.localVars})):b.globalVars&&!Q(a,b.globalVars)&&(b.globalVars={name:a,next:b.globalVars})}function G(){g.state.context||(g.state.localVars=Z);g.state.context={prev:g.state.context,vars:g.state.localVars}}function C(){g.state.localVars=g.state.context.vars;g.state.context=g.state.context.prev}function h(a,b){var d=function(){var d=g.state;d.lexical=new O(d.indented,g.stream.column(),a,null,d.lexical,b)};d.lex=!0;return d}function e(){var a=\ng.state;a.lexical.prev&&(\")\"==a.lexical.type&&(a.indented=a.lexical.indented),a.lexical=a.lexical.prev)}function m(a){function d(c){return c==a?b():\";\"==a?t():b(d)}return d}function u(a){return\"@\"==a?b(R):\"var\"==a?b(h(\"vardef\"),H,m(\";\"),e):\"keyword a\"==a?b(h(\"form\"),r,u,e):\"keyword b\"==a?b(h(\"form\"),u,e):\"{\"==a?b(h(\"}\"),G,I,e,C):\";\"==a?b():\"attribute\"==a?b(S):\"function\"==a?b(x):\"for\"==a?b(h(\"form\"),m(\"(\"),h(\")\"),aa,m(\")\"),e,u,e):\"variable\"==a?b(h(\"stat\"),ba):\"switch\"==a?b(h(\"form\"),r,h(\"}\",\"switch\"),\nm(\"{\"),I,e,e):\"case\"==a?b(r,m(\":\")):\"default\"==a?b(m(\":\")):\"catch\"==a?b(h(\"form\"),G,m(\"(\"),T,m(\")\"),u,e,C):\"import\"==a?b(U,m(\";\")):\"typedef\"==a?b(ca):t(h(\"stat\"),r,m(\";\"),e)}function r(a){return V.hasOwnProperty(a)||\"type\"==a?b(v):\"function\"==a?b(x):\"keyword c\"==a?b(J):\"(\"==a?b(h(\")\"),J,m(\")\"),e,v):\"operator\"==a?b(r):\"[\"==a?b(h(\"]\"),w(J,\"]\"),e,v):\"{\"==a?b(h(\"}\"),w(da,\"}\"),e,v):b()}function J(a){return a.match(/[;\\}\\)\\],]/)?t():t(r)}function v(a,d){if(\"operator\"==a&&/\\+\\+|--/.test(d))return b(v);if(\"operator\"==\na||\":\"==a)return b(r);if(\";\"!=a){if(\"(\"==a)return b(h(\")\"),w(r,\")\"),e,v);if(\".\"==a)return b(ea,v);if(\"[\"==a)return b(h(\"]\"),r,m(\"]\"),e,v)}}function S(a){if(\"attribute\"==a)return b(S);if(\"function\"==a)return b(x);if(\"var\"==a)return b(H)}function R(a){if(\":\"==a||\"variable\"==a)return b(R);if(\"(\"==a)return b(h(\")\"),w(fa,\")\"),e,u)}function fa(a){if(\"variable\"==a)return b()}function U(a,d){if(\"variable\"==a&&/[A-Z]/.test(d.charAt(0)))return P(d),b();if(\"variable\"==a||\"property\"==a||\".\"==a||\"*\"==d)return b(U)}\nfunction ca(a,d){if(\"variable\"==a&&/[A-Z]/.test(d.charAt(0)))return P(d),b();if(\"type\"==a&&/[A-Z]/.test(d.charAt(0)))return b()}function ba(a){return\":\"==a?b(e,u):t(v,m(\";\"),e)}function ea(a){if(\"variable\"==a)return g.marked=\"property\",b()}function da(a){\"variable\"==a&&(g.marked=\"property\");if(V.hasOwnProperty(a))return b(m(\":\"),r)}function w(a,d){function c(k){return\",\"==k?b(a,c):k==d?b():b(m(d))}return function(k){return k==d?b():t(a,c)}}function I(a){return\"}\"==a?b():t(u,I)}function H(a,d){return\"variable\"==\na?(B(d),b(D,W)):b()}function W(a,d){if(\"=\"==d)return b(r,W);if(\",\"==a)return b(H)}function aa(a,d){return\"variable\"==a?(B(d),b(ga,r)):t()}function ga(a,d){if(\"in\"==d)return b()}function x(a,d){if(\"variable\"==a||\"type\"==a)return B(d),b(x);if(\"new\"==d)return b(x);if(\"(\"==a)return b(h(\")\"),G,w(T,\")\"),e,D,u,C)}function D(a){if(\":\"==a)return b(ha)}function ha(a){if(\"type\"==a||\"variable\"==a)return b();if(\"{\"==a)return b(h(\"}\"),w(ia,\"}\"),e)}function ia(a){if(\"variable\"==a)return b(D)}function T(a,d){if(\"variable\"==\na)return B(d),b(D)}var y=f.indentUnit;f=c(\"keyword a\");var K=c(\"keyword b\"),z=c(\"keyword c\"),ja=c(\"operator\"),L={type:\"atom\",style:\"atom\"},E={type:\"attribute\",style:\"attribute\"},l=c(\"typedef\"),N={\"if\":f,\"while\":f,\"else\":K,\"do\":K,\"try\":K,\"return\":z,\"break\":z,\"continue\":z,\"new\":z,\"throw\":z,\"var\":c(\"var\"),inline:E,\"static\":E,using:c(\"import\"),\"public\":E,\"private\":E,cast:c(\"cast\"),\"import\":c(\"import\"),macro:c(\"macro\"),\"function\":c(\"function\"),\"catch\":c(\"catch\"),untyped:c(\"untyped\"),callback:c(\"cb\"),\"for\":c(\"for\"),\n\"switch\":c(\"switch\"),\"case\":c(\"case\"),\"default\":c(\"default\"),\"in\":ja,never:c(\"property_access\"),trace:c(\"trace\"),\"class\":l,\"abstract\":l,\"enum\":l,\"interface\":l,typedef:l,\"extends\":l,\"implements\":l,dynamic:l,\"true\":L,\"false\":L,\"null\":L},F=/[+\\-*&%=<>!?|]/,M,V={atom:!0,number:!0,variable:!0,string:!0,regexp:!0},g={state:null,column:null,marked:null,cc:null},Z={name:\"this\",next:null};C.lex=!0;e.lex=!0;return{startState:function(a){a={tokenize:A,reAllowed:!0,kwAllowed:!0,cc:[],lexical:new O((a||0)-y,0,\n\"block\",!1),localVars:q.localVars,importedtypes:\"Int Float String Void Std Bool Dynamic Array\".split(\" \"),context:q.localVars&&{vars:q.localVars},indented:0};q.globalVars&&\"object\"==typeof q.globalVars&&(a.globalVars=q.globalVars);return a},token:function(a,b){a.sol()&&(b.lexical.hasOwnProperty(\"align\")||(b.lexical.align=!1),b.indented=a.indentation());if(a.eatSpace())return null;var d=b.tokenize(a,b);if(\"comment\"==l)return d;b.reAllowed=!(\"operator\"!=l&&\"keyword c\"!=l&&!l.match(/^[\\[{}\\(,;:]$/));\nb.kwAllowed=\".\"!=l;a:{var c=l,f=M,e=b.cc;g.state=b;g.stream=a;g.marked=null;g.cc=e;b.lexical.hasOwnProperty(\"align\")||(b.lexical.align=!0);for(;;)if((e.length?e.pop():u)(c,f)){for(;e.length&&e[e.length-1].lex;)e.pop()();if(g.marked){d=g.marked;break a}if(a=\"variable\"==c)b:{for(a=b.localVars;a;a=a.next)if(a.name==f){a=!0;break b}a=void 0}if(a){d=\"variable-2\";break a}if(c=\"variable\"==c)b:if(/[a-z]/.test(f.charAt(0)))c=!1;else{c=b.importedtypes.length;for(a=0;a<c;a++)if(b.importedtypes[a]==f){c=!0;break b}c=\nvoid 0}if(c){d=\"variable-3\";break a}break a}}return d},indent:function(a,b){if(a.tokenize!=A)return 0;var d=b&&b.charAt(0);a=a.lexical;\"stat\"==a.type&&\"}\"==d&&(a=a.prev);var c=a.type,e=d==c;return\"vardef\"==c?a.indented+4:\"form\"==c&&\"{\"==d?a.indented:\"stat\"==c||\"form\"==c?a.indented+y:\"switch\"!=a.info||e?a.align?a.column+(e?0:1):a.indented+(e?0:y):a.indented+(/^(?:case|default)\\b/.test(b)?y:2*y)},electricChars:\"{}\",blockCommentStart:\"/*\",blockCommentEnd:\"*/\",lineComment:\"//\"}});p.defineMIME(\"text/x-haxe\",\n\"haxe\");p.defineMode(\"hxml\",function(){return{startState:function(){return{define:!1,inString:!1}},token:function(f,q){var c=f.peek(),p=f.sol();if(\"#\"==c)return f.skipToEnd(),\"comment\";if(p&&\"-\"==c)return c=\"variable-2\",f.eat(/-/),\"-\"==f.peek()&&(f.eat(/-/),c=\"keyword a\"),\"D\"==f.peek()&&(f.eat(/[D]/),c=\"keyword c\",q.define=!0),f.eatWhile(/[A-Z]/i),c;c=f.peek();0==q.inString&&\"'\"==c&&(q.inString=!0,f.next());if(1==q.inString)return f.skipTo(\"'\")||f.skipToEnd(),\"'\"==f.peek()&&(f.next(),q.inString=!1),\n\"string\";f.next();return null},lineComment:\"#\"}});p.defineMIME(\"text/x-hxml\",\"hxml\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/htmlembedded/htmlembedded.js",
    "content": "'use strict';(function(a){\"object\"==typeof exports&&\"object\"==typeof module?a(require(\"../../lib/codemirror\"),require(\"../htmlmixed/htmlmixed\"),require(\"../../addon/mode/multiplex\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\",\"../htmlmixed/htmlmixed\",\"../../addon/mode/multiplex\"],a):a(CodeMirror)})(function(a){a.defineMode(\"htmlembedded\",function(c,b){return a.multiplexingMode(a.getMode(c,\"htmlmixed\"),{open:b.open||b.scriptStartRegex||\"<%\",close:b.close||b.scriptEndRegex||\n\"%>\",mode:a.getMode(c,b.scriptingModeSpec)})},\"htmlmixed\");a.defineMIME(\"application/x-ejs\",{name:\"htmlembedded\",scriptingModeSpec:\"javascript\"});a.defineMIME(\"application/x-aspx\",{name:\"htmlembedded\",scriptingModeSpec:\"text/x-csharp\"});a.defineMIME(\"application/x-jsp\",{name:\"htmlembedded\",scriptingModeSpec:\"text/x-java\"});a.defineMIME(\"application/x-erb\",{name:\"htmlembedded\",scriptingModeSpec:\"ruby\"})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/htmlmixed/htmlmixed.js",
    "content": "'use strict';(function(d){\"object\"==typeof exports&&\"object\"==typeof module?d(require(\"../../lib/codemirror\"),require(\"../xml/xml\"),require(\"../javascript/javascript\"),require(\"../css/css\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\",\"../xml/xml\",\"../javascript/javascript\",\"../css/css\"],d):d(CodeMirror)})(function(d){function p(f){var c=k[f];return c?c:k[f]=new RegExp(\"\\\\s+\"+f+\"\\\\s*=\\\\s*('|\\\")?([^'\\\"]+)('|\\\")?\\\\s*\")}function q(f,c){return(f=f.match(p(c)))?/^\\s*(.*?)\\s*$/.exec(f[2])[1]:\n\"\"}function l(f,c){for(var d in f)for(var g=c[d]||(c[d]=[]),h=f[d],e=h.length-1;0<=e;e--)g.unshift(h[e])}function r(d,c){for(var f=0;f<d.length;f++){var g=d[f];if(!g[0]||g[1].test(q(c,g[0])))return g[2]}}var t={script:[[\"lang\",/(javascript|babel)/i,\"javascript\"],[\"type\",/^(?:text|application)\\/(?:x-)?(?:java|ecma)script$|^$/i,\"javascript\"],[\"type\",/./,\"text/plain\"],[null,null,\"javascript\"]],style:[[\"lang\",/^css$/i,\"css\"],[\"type\",/^(text\\/)?(x-)?(stylesheet|css)$/i,\"css\"],[\"type\",/./,\"text/plain\"],\n[null,null,\"css\"]]},k={};d.defineMode(\"htmlmixed\",function(f,c){function k(a,b){var c=g.token(a,b.htmlState),e=/\\btag\\b/.test(c),m;if(e&&!/[<>\\s\\/]/.test(a.current())&&(m=b.htmlState.tagName&&b.htmlState.tagName.toLowerCase())&&h.hasOwnProperty(m))b.inTag=m+\" \";else if(b.inTag&&e&&/>$/.test(a.current())){e=/^([\\S]+) (.*)/.exec(b.inTag);b.inTag=null;a=\">\"==a.current()&&r(h[e[1]],e[2]);a=d.getMode(f,a);var l=new RegExp(\"^</s*\"+e[1]+\"s*>\",\"i\"),n=new RegExp(\"</s*\"+e[1]+\"s*>\",\"i\");b.token=function(a,b){if(a.match(l,\n!1))return b.token=k,b.localState=b.localMode=null;b=b.localMode.token(a,b.localState);var c=a.current(),d=c.search(n);-1<d?a.backUp(c.length-d):c.match(/<\\/?$/)&&(a.backUp(c.length),a.match(n,!1)||a.match(c));return b};b.localMode=a;b.localState=d.startState(a,g.indent(b.htmlState,\"\"))}else b.inTag&&(b.inTag+=a.current(),a.eol()&&(b.inTag+=\" \"));return c}var g=d.getMode(f,{name:\"xml\",htmlMode:!0,multilineTagIndentFactor:c.multilineTagIndentFactor,multilineTagIndentPastTag:c.multilineTagIndentPastTag}),\nh={},e=c&&c.tags;c=c&&c.scriptTypes;l(t,h);e&&l(e,h);if(c)for(e=c.length-1;0<=e;e--)h.script.unshift([\"type\",c[e].matches,c[e].mode]);return{startState:function(){var a=d.startState(g);return{token:k,inTag:null,localMode:null,localState:null,htmlState:a}},copyState:function(a){var b;a.localState&&(b=d.copyState(a.localMode,a.localState));return{token:a.token,inTag:a.inTag,localMode:a.localMode,localState:b,htmlState:d.copyState(g,a.htmlState)}},token:function(a,b){return b.token(a,b)},indent:function(a,\nb){return!a.localMode||/^\\s*<\\//.test(b)?g.indent(a.htmlState,b):a.localMode.indent?a.localMode.indent(a.localState,b):d.Pass},innerMode:function(a){return{state:a.localState||a.htmlState,mode:a.localMode||g}}}},\"xml\",\"javascript\",\"css\");d.defineMIME(\"text/html\",\"htmlmixed\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/http/http.js",
    "content": "'use strict';(function(c){\"object\"==typeof exports&&\"object\"==typeof module?c(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],c):c(CodeMirror)})(function(c){c.defineMode(\"http\",function(){function c(a,b){a.skipToEnd();b.cur=d;return\"error\"}function g(a,b){return a.match(/^HTTP\\/\\d\\.\\d/)?(b.cur=h,\"keyword\"):a.match(/^[A-Z]+/)&&/[ \\t]/.test(a.peek())?(b.cur=k,\"keyword\"):c(a,b)}function h(a,b){var e=a.match(/^\\d+/);if(!e)return c(a,b);b.cur=l;a=\nNumber(e[0]);return 100<=a&&200>a?\"positive informational\":200<=a&&300>a?\"positive success\":300<=a&&400>a?\"positive redirect\":400<=a&&500>a?\"negative client-error\":500<=a&&600>a?\"negative server-error\":\"error\"}function l(a,b){a.skipToEnd();b.cur=d;return null}function k(a,b){a.eatWhile(/\\S/);b.cur=m;return\"string-2\"}function m(a,b){return a.match(/^HTTP\\/\\d\\.\\d$/)?(b.cur=d,\"keyword\"):c(a,b)}function d(a){if(a.sol()&&!a.eat(/[ \\t]/)){if(a.match(/^.*?:/))return\"atom\";a.skipToEnd();return\"error\"}a.skipToEnd();\nreturn\"string\"}function f(a){a.skipToEnd();return null}return{token:function(a,b){var c=b.cur;return c!=d&&c!=f&&a.eatSpace()?null:c(a,b)},blankLine:function(a){a.cur=f},startState:function(){return{cur:g}}}});c.defineMIME(\"message/http\",\"http\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/idl/idl.js",
    "content": "'use strict';(function(b){\"object\"==typeof exports&&\"object\"==typeof module?b(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],b):b(CodeMirror)})(function(b){function c(a){return new RegExp(\"^((\"+a.join(\")|(\")+\"))\\\\b\",\"i\")}function f(a){if(a.eatSpace())return null;if(a.match(\";\"))return a.skipToEnd(),\"comment\";if(a.match(/^[0-9\\.+-]/,!1)&&(a.match(/^[+-]?0x[0-9a-fA-F]+/)||a.match(/^[+-]?\\d*\\.\\d+([EeDd][+-]?\\d+)?/)||a.match(/^[+-]?\\d+([EeDd][+-]?\\d+)?/)))return\"number\";\nif(a.match(/^\"([^\"]|(\"\"))*\"/)||a.match(/^'([^']|(''))*'/))return\"string\";if(a.match(g))return\"keyword\";if(a.match(h))return\"builtin\";if(a.match(k))return\"variable\";if(a.match(l)||a.match(m))return\"operator\";a.next();return null}var d=\"a_correlate abs acos adapt_hist_equal alog alog2 alog10 amoeba annotate app_user_dir app_user_dir_query arg_present array_equal array_indices arrow ascii_template asin assoc atan axis axis bandpass_filter bandreject_filter barplot bar_plot beseli beselj beselk besely beta biginteger bilinear bin_date binary_template bindgen binomial bit_ffs bit_population blas_axpy blk_con boolarr boolean boxplot box_cursor breakpoint broyden bubbleplot butterworth bytarr byte byteorder bytscl c_correlate calendar caldat call_external call_function call_method call_procedure canny catch cd cdf ceil chebyshev check_math chisqr_cvf chisqr_pdf choldc cholsol cindgen cir_3pnt clipboard close clust_wts cluster cluster_tree cmyk_convert code_coverage color_convert color_exchange color_quan color_range_map colorbar colorize_sample colormap_applicable colormap_gradient colormap_rotation colortable comfit command_line_args common compile_opt complex complexarr complexround compute_mesh_normals cond congrid conj constrained_min contour contour convert_coord convol convol_fft coord2to3 copy_lun correlate cos cosh cpu cramer createboxplotdata create_cursor create_struct create_view crossp crvlength ct_luminance cti_test cursor curvefit cv_coord cvttobm cw_animate cw_animate_getp cw_animate_load cw_animate_run cw_arcball cw_bgroup cw_clr_index cw_colorsel cw_defroi cw_field cw_filesel cw_form cw_fslider cw_light_editor cw_light_editor_get cw_light_editor_set cw_orient cw_palette_editor cw_palette_editor_get cw_palette_editor_set cw_pdmenu cw_rgbslider cw_tmpl cw_zoom db_exists dblarr dcindgen dcomplex dcomplexarr define_key define_msgblk define_msgblk_from_file defroi defsysv delvar dendro_plot dendrogram deriv derivsig determ device dfpmin diag_matrix dialog_dbconnect dialog_message dialog_pickfile dialog_printersetup dialog_printjob dialog_read_image dialog_write_image dictionary digital_filter dilate dindgen dissolve dist distance_measure dlm_load dlm_register doc_library double draw_roi edge_dog efont eigenql eigenvec ellipse elmhes emboss empty enable_sysrtn eof eos erase erf erfc erfcx erode errorplot errplot estimator_filter execute exit exp expand expand_path expint extrac extract_slice f_cvf f_pdf factorial fft file_basename file_chmod file_copy file_delete file_dirname file_expand_path file_gunzip file_gzip file_info file_lines file_link file_mkdir file_move file_poll_input file_readlink file_same file_search file_tar file_test file_untar file_unzip file_which file_zip filepath findgen finite fix flick float floor flow3 fltarr flush format_axis_values forward_function free_lun fstat fulstr funct function fv_test fx_root fz_roots gamma gamma_ct gauss_cvf gauss_pdf gauss_smooth gauss2dfit gaussfit gaussian_function gaussint get_drive_list get_dxf_objects get_kbrd get_login_info get_lun get_screen_size getenv getwindows greg2jul grib grid_input grid_tps grid3 griddata gs_iter h_eq_ct h_eq_int hanning hash hdf hdf5 heap_free heap_gc heap_nosave heap_refcount heap_save help hilbert hist_2d hist_equal histogram hls hough hqr hsv i18n_multibytetoutf8 i18n_multibytetowidechar i18n_utf8tomultibyte i18n_widechartomultibyte ibeta icontour iconvertcoord idelete identity idl_base64 idl_container idl_validname idlexbr_assistant idlitsys_createtool idlunit iellipse igamma igetcurrent igetdata igetid igetproperty iimage image image_cont image_statistics image_threshold imaginary imap indgen int_2d int_3d int_tabulated intarr interpol interpolate interval_volume invert ioctl iopen ir_filter iplot ipolygon ipolyline iputdata iregister ireset iresolve irotate isa isave iscale isetcurrent isetproperty ishft isocontour isosurface isurface itext itranslate ivector ivolume izoom journal json_parse json_serialize jul2greg julday keyword_set krig2d kurtosis kw_test l64indgen la_choldc la_cholmprove la_cholsol la_determ la_eigenproblem la_eigenql la_eigenvec la_elmhes la_gm_linear_model la_hqr la_invert la_least_square_equality la_least_squares la_linear_equation la_ludc la_lumprove la_lusol la_svd la_tridc la_trimprove la_triql la_trired la_trisol label_date label_region ladfit laguerre lambda lambdap lambertw laplacian least_squares_filter leefilt legend legendre linbcg lindgen linfit linkimage list ll_arc_distance lmfit lmgr lngamma lnp_test loadct locale_get logical_and logical_or logical_true lon64arr lonarr long long64 lsode lu_complex ludc lumprove lusol m_correlate machar make_array make_dll make_rt map mapcontinents mapgrid map_2points map_continents map_grid map_image map_patch map_proj_forward map_proj_image map_proj_info map_proj_init map_proj_inverse map_set matrix_multiply matrix_power max md_test mean meanabsdev mean_filter median memory mesh_clip mesh_decimate mesh_issolid mesh_merge mesh_numtriangles mesh_obj mesh_smooth mesh_surfacearea mesh_validate mesh_volume message min min_curve_surf mk_html_help modifyct moment morph_close morph_distance morph_gradient morph_hitormiss morph_open morph_thin morph_tophat multi n_elements n_params n_tags ncdf newton noise_hurl noise_pick noise_scatter noise_slur norm obj_class obj_destroy obj_hasmethod obj_isa obj_new obj_valid objarr on_error on_ioerror online_help openr openu openw oplot oploterr orderedhash p_correlate parse_url particle_trace path_cache path_sep pcomp plot plot3d plot plot_3dbox plot_field ploterr plots polar_contour polar_surface polyfill polyshade pnt_line point_lun polarplot poly poly_2d poly_area poly_fit polyfillv polygon polyline polywarp popd powell pref_commit pref_get pref_set prewitt primes print printf printd pro product profile profiler profiles project_vol ps_show_fonts psafm pseudo ptr_free ptr_new ptr_valid ptrarr pushd qgrid3 qhull qromb qromo qsimp query_* query_ascii query_bmp query_csv query_dicom query_gif query_image query_jpeg query_jpeg2000 query_mrsid query_pict query_png query_ppm query_srf query_tiff query_video query_wav r_correlate r_test radon randomn randomu ranks rdpix read readf read_ascii read_binary read_bmp read_csv read_dicom read_gif read_image read_interfile read_jpeg read_jpeg2000 read_mrsid read_pict read_png read_ppm read_spr read_srf read_sylk read_tiff read_video read_wav read_wave read_x11_bitmap read_xwd reads readu real_part rebin recall_commands recon3 reduce_colors reform region_grow register_cursor regress replicate replicate_inplace resolve_all resolve_routine restore retall return reverse rk4 roberts rot rotate round routine_filepath routine_info rs_test s_test save savgol scale3 scale3d scatterplot scatterplot3d scope_level scope_traceback scope_varfetch scope_varname search2d search3d sem_create sem_delete sem_lock sem_release set_plot set_shading setenv sfit shade_surf shade_surf_irr shade_volume shift shift_diff shmdebug shmmap shmunmap shmvar show3 showfont signum simplex sin sindgen sinh size skewness skip_lun slicer3 slide_image smooth sobel socket sort spawn sph_4pnt sph_scat spher_harm spl_init spl_interp spline spline_p sprsab sprsax sprsin sprstp sqrt standardize stddev stop strarr strcmp strcompress streamline streamline stregex stretch string strjoin strlen strlowcase strmatch strmessage strmid strpos strput strsplit strtrim struct_assign struct_hide strupcase surface surface surfr svdc svdfit svsol swap_endian swap_endian_inplace symbol systime t_cvf t_pdf t3d tag_names tan tanh tek_color temporary terminal_size tetra_clip tetra_surface tetra_volume text thin thread threed tic time_test2 timegen timer timestamp timestamptovalues tm_test toc total trace transpose tri_surf triangulate trigrid triql trired trisol truncate_lun ts_coef ts_diff ts_fcast ts_smooth tv tvcrs tvlct tvrd tvscl typename uindgen uint uintarr ul64indgen ulindgen ulon64arr ulonarr ulong ulong64 uniq unsharp_mask usersym value_locate variance vector vector_field vel velovect vert_t3d voigt volume voronoi voxel_proj wait warp_tri watershed wdelete wf_draw where widget_base widget_button widget_combobox widget_control widget_displaycontextmenu widget_draw widget_droplist widget_event widget_info widget_label widget_list widget_propertysheet widget_slider widget_tab widget_table widget_text widget_tree widget_tree_move widget_window wiener_filter window window write_bmp write_csv write_gif write_image write_jpeg write_jpeg2000 write_nrif write_pict write_png write_ppm write_spr write_srf write_sylk write_tiff write_video write_wav write_wave writeu wset wshow wtn wv_applet wv_cwt wv_cw_wavelet wv_denoise wv_dwt wv_fn_coiflet wv_fn_daubechies wv_fn_gaussian wv_fn_haar wv_fn_morlet wv_fn_paul wv_fn_symlet wv_import_data wv_import_wavelet wv_plot3d_wps wv_plot_multires wv_pwt wv_tool_denoise xbm_edit xdisplayfile xdxf xfont xinteranimate xloadct xmanager xmng_tmpl xmtool xobjview xobjview_rotate xobjview_write_image xpalette xpcolor xplot3d xregistered xroi xsq_test xsurface xvaredit xvolume xvolume_rotate xvolume_write_image xyouts zlib_compress zlib_uncompress zoom zoom_24\".split(\" \"),\nh=c(d),e=\"begin end endcase endfor endwhile endif endrep endforeach break case continue for foreach goto if then else repeat until switch while do pro function\".split(\" \"),g=c(e);b.registerHelper(\"hintWords\",\"idl\",d.concat(e));var k=/^[_a-z\\u00a1-\\uffff][_a-z0-9\\u00a1-\\uffff]*/i,l=/[+\\-*&=<>\\/@#~$]/,m=/(and|or|eq|lt|le|gt|ge|ne|not)/i;b.defineMode(\"idl\",function(){return{token:function(a){return f(a)}}});b.defineMIME(\"text/x-idl\",\"idl\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/javascript/javascript.js",
    "content": "'use strict';(function(p){\"object\"==typeof exports&&\"object\"==typeof module?p(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],p):p(CodeMirror)})(function(p){function fa(p,q,n){return/^(?:operator|sof|keyword c|case|new|[\\[{}\\(,;:]|=>)$/.test(q.lastType)||\"quasi\"==q.lastType&&/\\{\\s*$/.test(p.string.slice(0,p.pos-(n||0)))}p.defineMode(\"javascript\",function(sa,q){function n(a,c,b){E=a;M=b;return c}function y(a,c){var b=a.next();if('\"'==b||\"'\"==b)return c.tokenize=\nta(b),c.tokenize(a,c);if(\".\"==b&&a.match(/^\\d+(?:[eE][+\\-]?\\d+)?/))return n(\"number\",\"number\");if(\".\"==b&&a.match(\"..\"))return n(\"spread\",\"meta\");if(/[\\[\\]{}\\(\\),;\\:\\.]/.test(b))return n(b);if(\"=\"==b&&a.eat(\">\"))return n(\"=>\",\"operator\");if(\"0\"==b&&a.eat(/x/i))return a.eatWhile(/[\\da-f]/i),n(\"number\",\"number\");if(\"0\"==b&&a.eat(/o/i))return a.eatWhile(/[0-7]/i),n(\"number\",\"number\");if(\"0\"==b&&a.eat(/b/i))return a.eatWhile(/[01]/i),n(\"number\",\"number\");if(/\\d/.test(b))return a.match(/^\\d*(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/),\nn(\"number\",\"number\");if(\"/\"==b){if(a.eat(\"*\"))return c.tokenize=N,N(a,c);if(a.eat(\"/\"))return a.skipToEnd(),n(\"comment\",\"comment\");if(fa(a,c,1)){a:for(var e=c=!1;null!=(b=a.next());){if(!c){if(\"/\"==b&&!e)break a;\"[\"==b?e=!0:e&&\"]\"==b&&(e=!1)}c=!c&&\"\\\\\"==b}a.match(/^\\b(([gimyu])(?![gimyu]*\\2))+\\b/);return n(\"regexp\",\"string-2\")}a.eatWhile(O);return n(\"operator\",\"operator\",a.current())}if(\"`\"==b)return c.tokenize=U,U(a,c);if(\"#\"==b)return a.skipToEnd(),n(\"error\",\"error\");if(O.test(b))return a.eatWhile(O),\nn(\"operator\",\"operator\",a.current());if(V.test(b))return a.eatWhile(V),a=a.current(),(b=ga.propertyIsEnumerable(a)&&ga[a])&&\".\"!=c.lastType?n(b.type,b.style,a):n(\"variable\",\"variable\",a)}function ta(a){return function(c,b){var e=!1,k;if(P&&\"@\"==c.peek()&&c.match(ua))return b.tokenize=y,n(\"jsonld-keyword\",\"meta\");for(;null!=(k=c.next())&&(k!=a||e);)e=!e&&\"\\\\\"==k;e||(b.tokenize=y);return n(\"string\",\"string\")}}function N(a,c){for(var b=!1,e;e=a.next();){if(\"/\"==e&&b){c.tokenize=y;break}b=\"*\"==e}return n(\"comment\",\n\"comment\")}function U(a,c){for(var b=!1,e;null!=(e=a.next());){if(!b&&(\"`\"==e||\"$\"==e&&a.eat(\"{\"))){c.tokenize=y;break}b=!b&&\"\\\\\"==e}return n(\"quasi\",\"string-2\",a.current())}function W(a,c){c.fatArrowAt&&(c.fatArrowAt=null);var b=a.string.indexOf(\"=>\",a.start);if(!(0>b)){for(var e=0,d=!1,b=b-1;0<=b;--b){var z=a.string.charAt(b),f=\"([{}])\".indexOf(z);if(0<=f&&3>f){if(!e){++b;break}if(0==--e){\"(\"==z&&(d=!0);break}}else if(3<=f&&6>f)++e;else if(V.test(z))d=!0;else{if(/[\"'\\/]/.test(z))return;if(d&&!e){++b;\nbreak}}}d&&!e&&(c.fatArrowAt=b)}}function ha(a,b,d,e,f,z){this.indented=a;this.column=b;this.type=d;this.prev=f;this.info=z;null!=e&&(this.align=e)}function f(){for(var a=arguments.length-1;0<=a;a--)d.cc.push(arguments[a])}function b(){f.apply(null,arguments);return!0}function F(a){function b(b){for(;b;b=b.next)if(b.name==a)return!0;return!1}var k=d.state;d.marked=\"def\";k.context?b(k.localVars)||(k.localVars={name:a,next:k.localVars}):!b(k.globalVars)&&q.globalVars&&(k.globalVars={name:a,next:k.globalVars})}\nfunction G(){d.state.context={prev:d.state.context,vars:d.state.localVars};d.state.localVars=va}function H(){d.state.localVars=d.state.context.vars;d.state.context=d.state.context.prev}function l(a,b){var c=function(){var c=d.state,k=c.indented;if(\"stat\"==c.lexical.type)k=c.lexical.indented;else for(var f=c.lexical;f&&\")\"==f.type&&f.align;f=f.prev)k=f.indented;c.lexical=new ha(k,d.stream.column(),a,null,c.lexical,b)};c.lex=!0;return c}function g(){var a=d.state;a.lexical.prev&&(\")\"==a.lexical.type&&\n(a.indented=a.lexical.indented),a.lexical=a.lexical.prev)}function h(a){function c(d){return d==a?b():\";\"==a?f():b(c)}return c}function r(a,c){return\"var\"==a?b(l(\"vardef\",c.length),X,h(\";\"),g):\"keyword a\"==a?b(l(\"form\"),Y,r,g):\"keyword b\"==a?b(l(\"form\"),r,g):\"{\"==a?b(l(\"}\"),Q,g):\";\"==a?b():\"if\"==a?(\"else\"==d.state.lexical.info&&d.state.cc[d.state.cc.length-1]==g&&d.state.cc.pop()(),b(l(\"form\"),Y,r,g,ia)):\"function\"==a?b(w):\"for\"==a?b(l(\"form\"),wa,r,g):\"variable\"==a?b(l(\"stat\"),xa):\"switch\"==a?b(l(\"form\"),\nY,l(\"}\",\"switch\"),h(\"{\"),Q,g,g):\"case\"==a?b(m,h(\":\")):\"default\"==a?b(h(\":\")):\"catch\"==a?b(l(\"form\"),G,h(\"(\"),Z,h(\")\"),r,g,H):\"class\"==a?b(l(\"form\"),ya,g):\"export\"==a?b(l(\"stat\"),za,g):\"import\"==a?b(l(\"stat\"),Aa,g):\"module\"==a?b(l(\"form\"),u,l(\"}\"),h(\"{\"),Q,g,g):\"type\"==a?b(v,h(\"operator\"),v,h(\";\")):\"async\"==a?b(r):f(l(\"stat\"),m,h(\";\"),g)}function m(a){return ja(a,!1)}function t(a){return ja(a,!0)}function Y(a){return\"(\"!=a?f():b(l(\")\"),m,h(\")\"),g)}function ja(a,c){if(d.state.fatArrowAt==d.stream.start){var k=\nc?ka:la;if(\"(\"==a)return b(G,l(\")\"),x(u,\")\"),g,h(\"=>\"),k,H);if(\"variable\"==a)return f(G,u,h(\"=>\"),k,H)}k=c?I:A;return Ba.hasOwnProperty(a)?b(k):\"function\"==a?b(w,k):\"keyword c\"==a||\"async\"==a?b(c?Ca:aa):\"(\"==a?b(l(\")\"),aa,h(\")\"),g,k):\"operator\"==a||\"spread\"==a?b(c?t:m):\"[\"==a?b(l(\"]\"),Da,g,k):\"{\"==a?J(ba,\"}\",null,k):\"quasi\"==a?f(R,k):\"new\"==a?b(Ea(c)):b()}function aa(a){return a.match(/[;\\}\\)\\],]/)?f():f(m)}function Ca(a){return a.match(/[;\\}\\)\\],]/)?f():f(t)}function A(a,c){return\",\"==a?b(m):I(a,\nc,!1)}function I(a,c,d){var e=0==d?A:I,k=0==d?m:t;if(\"=>\"==a)return b(G,d?ka:la,H);if(\"operator\"==a)return/\\+\\+|--/.test(c)?b(e):\"?\"==c?b(m,h(\":\"),k):b(k);if(\"quasi\"==a)return f(R,e);if(\";\"!=a){if(\"(\"==a)return J(t,\")\",\"call\",e);if(\".\"==a)return b(Fa,e);if(\"[\"==a)return b(l(\"]\"),aa,h(\"]\"),g,e)}}function R(a,c){return\"quasi\"!=a?f():\"${\"!=c.slice(c.length-2)?b(R):b(m,Ga)}function Ga(a){if(\"}\"==a)return d.marked=\"string-2\",d.state.tokenize=U,b(R)}function la(a){W(d.stream,d.state);return f(\"{\"==a?r:\nm)}function ka(a){W(d.stream,d.state);return f(\"{\"==a?r:t)}function Ea(a){return function(c){return\".\"==c?b(a?Ha:Ia):f(a?t:m)}}function Ia(a,c){if(\"target\"==c)return d.marked=\"keyword\",b(A)}function Ha(a,c){if(\"target\"==c)return d.marked=\"keyword\",b(I)}function xa(a){return\":\"==a?b(g,r):f(A,h(\";\"),g)}function Fa(a){if(\"variable\"==a)return d.marked=\"property\",b()}function ba(a,c){if(\"async\"==a)return d.marked=\"property\",b(ba);if(\"variable\"==a||\"keyword\"==d.style)return d.marked=\"property\",\"get\"==c||\n\"set\"==c?b(Ja):b(B);if(\"number\"==a||\"string\"==a)return d.marked=P?\"property\":d.style+\" property\",b(B);if(\"jsonld-keyword\"==a)return b(B);if(\"modifier\"==a)return b(ba);if(\"[\"==a)return b(m,h(\"]\"),B);if(\"spread\"==a)return b(m);if(\":\"==a)return f(B)}function Ja(a){if(\"variable\"!=a)return f(B);d.marked=\"property\";return b(w)}function B(a){if(\":\"==a)return b(t);if(\"(\"==a)return f(w)}function x(a,c){function k(e,g){return\",\"==e?(e=d.state.lexical,\"call\"==e.info&&(e.pos=(e.pos||0)+1),b(function(b,e){return b==\nc||e==c?f():f(a)},k)):e==c||g==c?b():b(h(c))}return function(e,d){return e==c||d==c?b():f(a,k)}}function J(a,c,k){for(var e=3;e<arguments.length;e++)d.cc.push(arguments[e]);return b(l(c,k),x(a,c),g)}function Q(a){return\"}\"==a?b():f(r,Q)}function S(a,c){if(K){if(\":\"==a)return b(v);if(\"?\"==c)return b(S)}}function Ka(a,c){if(\"=\"==c)return b(t)}function v(a){if(\"variable\"==a)return d.marked=\"variable-3\",b(ca);if(\"{\"==a)return b(x(ma,\"}\"));if(\"(\"==a)return b(x(na,\")\"),La)}function La(a){if(\"=>\"==a)return b(v)}\nfunction ma(a){if(\"variable\"==a||\"keyword\"==d.style)return d.marked=\"property\",b(ma);if(\":\"==a)return b(v)}function na(a){if(\"variable\"==a)return b(na);if(\":\"==a)return b(v)}function ca(a,c){if(\"<\"==c)return b(x(v,\">\"),ca);if(\"[\"==a)return b(h(\"]\"),ca)}function X(){return f(u,S,da,Ma)}function u(a,c){if(\"modifier\"==a)return b(u);if(\"variable\"==a)return F(c),b();if(\"spread\"==a)return b(u);if(\"[\"==a)return J(u,\"]\");if(\"{\"==a)return J(Na,\"}\")}function Na(a,c){if(\"variable\"==a&&!d.stream.match(/^\\s*:/,\n!1))return F(c),b(da);\"variable\"==a&&(d.marked=\"property\");return\"spread\"==a?b(u):\"}\"==a?f():b(h(\":\"),u,da)}function da(a,c){if(\"=\"==c)return b(t)}function Ma(a){if(\",\"==a)return b(X)}function ia(a,c){if(\"keyword b\"==a&&\"else\"==c)return b(l(\"form\",\"else\"),r,g)}function wa(a){if(\"(\"==a)return b(l(\")\"),Oa,h(\")\"),g)}function Oa(a){return\"var\"==a?b(X,h(\";\"),T):\";\"==a?b(T):\"variable\"==a?b(Pa):f(m,h(\";\"),T)}function Pa(a,c){return\"in\"==c||\"of\"==c?(d.marked=\"keyword\",b(m)):b(A,T)}function T(a,c){return\";\"==\na?b(oa):\"in\"==c||\"of\"==c?(d.marked=\"keyword\",b(m)):f(m,h(\";\"),oa)}function oa(a){\")\"!=a&&b(m)}function w(a,c){if(\"*\"==c)return d.marked=\"keyword\",b(w);if(\"variable\"==a)return F(c),b(w);if(\"(\"==a)return b(G,l(\")\"),x(Z,\")\"),g,S,r,H)}function Z(a){return\"spread\"==a?b(Z):f(u,S,Ka)}function ya(a,c){if(\"variable\"==a)return F(c),b(pa)}function pa(a,c){if(\"extends\"==c)return b(K?v:m,pa);if(\"{\"==a)return b(l(\"}\"),L,g)}function L(a,c){if(\"variable\"==a||\"keyword\"==d.style){if((\"static\"==c||\"get\"==c||\"set\"==\nc||K&&(\"public\"==c||\"private\"==c||\"protected\"==c))&&d.stream.match(/^\\s+[\\w$\\xa1-\\uffff]/,!1))return d.marked=\"keyword\",b(L);d.marked=\"property\";return b(K?Qa:w,L)}if(\"*\"==c)return d.marked=\"keyword\",b(L);if(\";\"==a)return b(L);if(\"}\"==a)return b()}function Qa(a){return\":\"==a?b(v):f(w)}function za(a,c){return\"*\"==c?(d.marked=\"keyword\",b(qa,h(\";\"))):\"default\"==c?(d.marked=\"keyword\",b(m,h(\";\"))):f(r)}function Aa(a){return\"string\"==a?b():f(ea,qa)}function ea(a,c){if(\"{\"==a)return J(ea,\"}\");\"variable\"==\na&&F(c);\"*\"==c&&(d.marked=\"keyword\");return b(Ra)}function Ra(a,c){if(\"as\"==c)return d.marked=\"keyword\",b(ea)}function qa(a,c){if(\"from\"==c)return d.marked=\"keyword\",b(m)}function Da(a){return\"]\"==a?b():f(x(t,\"]\"))}var C=sa.indentUnit,ra=q.statementIndent,P=q.jsonld,D=q.json||P,K=q.typescript,V=q.wordCharacters||/[\\w$\\xa1-\\uffff]/,ga=function(){function a(a){return{type:a,style:\"keyword\"}}var b=a(\"keyword a\"),d=a(\"keyword b\"),e=a(\"keyword c\"),f=a(\"operator\"),g={type:\"atom\",style:\"atom\"},b={\"if\":a(\"if\"),\n\"while\":b,\"with\":b,\"else\":d,\"do\":d,\"try\":d,\"finally\":d,\"return\":e,\"break\":e,\"continue\":e,\"new\":a(\"new\"),\"delete\":e,\"throw\":e,\"debugger\":e,\"var\":a(\"var\"),\"const\":a(\"var\"),let:a(\"var\"),\"function\":a(\"function\"),\"catch\":a(\"catch\"),\"for\":a(\"for\"),\"switch\":a(\"switch\"),\"case\":a(\"case\"),\"default\":a(\"default\"),\"in\":f,\"typeof\":f,\"instanceof\":f,\"true\":g,\"false\":g,\"null\":g,undefined:g,NaN:g,Infinity:g,\"this\":a(\"this\"),\"class\":a(\"class\"),\"super\":a(\"atom\"),yield:e,\"export\":a(\"export\"),\"import\":a(\"import\"),\"extends\":e,\nawait:e,async:a(\"async\")};if(K){var d={type:\"variable\",style:\"variable-3\"},e={\"interface\":a(\"class\"),\"implements\":e,namespace:e,module:a(\"module\"),\"enum\":a(\"module\"),type:a(\"type\"),\"public\":a(\"modifier\"),\"private\":a(\"modifier\"),\"protected\":a(\"modifier\"),\"abstract\":a(\"modifier\"),as:f,string:d,number:d,\"boolean\":d,any:d},h;for(h in e)b[h]=e[h]}return b}(),O=/[+\\-*&%=<>!?|~^]/,ua=/^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)\"/,E,M,Ba={atom:!0,number:!0,variable:!0,\nstring:!0,regexp:!0,\"this\":!0,\"jsonld-keyword\":!0},d={state:null,column:null,marked:null,cc:null},va={name:\"this\",next:{name:\"arguments\"}};g.lex=!0;return{startState:function(a){a={tokenize:y,lastType:\"sof\",cc:[],lexical:new ha((a||0)-C,0,\"block\",!1),localVars:q.localVars,context:q.localVars&&{vars:q.localVars},indented:a||0};q.globalVars&&\"object\"==typeof q.globalVars&&(a.globalVars=q.globalVars);return a},token:function(a,b){a.sol()&&(b.lexical.hasOwnProperty(\"align\")||(b.lexical.align=!1),b.indented=\na.indentation(),W(a,b));if(b.tokenize!=N&&a.eatSpace())return null;var c=b.tokenize(a,b);if(\"comment\"==E)return c;b.lastType=\"operator\"!=E||\"++\"!=M&&\"--\"!=M?E:\"incdec\";a:{var e=E,f=M,g=b.cc;d.state=b;d.stream=a;d.marked=null;d.cc=g;d.style=c;b.lexical.hasOwnProperty(\"align\")||(b.lexical.align=!0);for(;;)if((g.length?g.pop():D?m:r)(e,f)){for(;g.length&&g[g.length-1].lex;)g.pop()();if(d.marked){c=d.marked;break a}if(a=\"variable\"==e)b:{for(a=b.localVars;a;a=a.next)if(a.name==f){a=!0;break b}for(b=b.context;b;b=\nb.prev)for(a=b.vars;a;a=a.next)if(a.name==f){a=!0;break b}a=void 0}if(a){c=\"variable-2\";break a}break a}}return c},indent:function(a,b){if(a.tokenize==N)return p.Pass;if(a.tokenize!=y)return 0;var c=b&&b.charAt(0),e=a.lexical,d;if(!/^\\s*else\\b/.test(b))for(var f=a.cc.length-1;0<=f;--f){var h=a.cc[f];if(h==g)e=e.prev;else if(h!=ia)break}for(;!(\"stat\"!=e.type&&\"form\"!=e.type||\"}\"!=c&&(!(d=a.cc[a.cc.length-1])||d!=A&&d!=I||/^[,\\.=+\\-*:?[\\(]/.test(b)));)e=e.prev;ra&&\")\"==e.type&&\"stat\"==e.prev.type&&\n(e=e.prev);d=e.type;f=c==d;return\"vardef\"==d?e.indented+(\"operator\"==a.lastType||\",\"==a.lastType?e.info+1:0):\"form\"==d&&\"{\"==c?e.indented:\"form\"==d?e.indented+C:\"stat\"==d?(c=e.indented,a=\"operator\"==a.lastType||\",\"==a.lastType||O.test(b.charAt(0))||/[,.]/.test(b.charAt(0)),c+(a?ra||C:0)):\"switch\"!=e.info||f||0==q.doubleIndentSwitch?e.align?e.column+(f?0:1):e.indented+(f?0:C):e.indented+(/^(?:case|default)\\b/.test(b)?C:2*C)},electricInput:/^\\s*(?:case .*?:|default:|\\{|\\})$/,blockCommentStart:D?null:\n\"/*\",blockCommentEnd:D?null:\"*/\",lineComment:D?null:\"//\",fold:\"brace\",closeBrackets:\"()[]{}''\\\"\\\"``\",helperType:D?\"json\":\"javascript\",jsonldMode:P,jsonMode:D,expressionAllowed:fa,skipExpression:function(a){var b=a.cc[a.cc.length-1];b!=m&&b!=t||a.cc.pop()}}});p.registerHelper(\"wordChars\",\"javascript\",/[\\w$]/);p.defineMIME(\"text/javascript\",\"javascript\");p.defineMIME(\"text/ecmascript\",\"javascript\");p.defineMIME(\"application/javascript\",\"javascript\");p.defineMIME(\"application/x-javascript\",\"javascript\");\np.defineMIME(\"application/ecmascript\",\"javascript\");p.defineMIME(\"application/json\",{name:\"javascript\",json:!0});p.defineMIME(\"application/x-json\",{name:\"javascript\",json:!0});p.defineMIME(\"application/ld+json\",{name:\"javascript\",jsonld:!0});p.defineMIME(\"text/typescript\",{name:\"javascript\",typescript:!0});p.defineMIME(\"application/typescript\",{name:\"javascript\",typescript:!0})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/jinja2/jinja2.js",
    "content": "'use strict';(function(c){\"object\"==typeof exports&&\"object\"==typeof module?c(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],c):c(CodeMirror)})(function(c){c.defineMode(\"jinja2\",function(){function c(a,b){var c=a.peek();if(b.incomment)return a.skipTo(\"#}\")?(a.eatWhile(/\\#|}/),b.incomment=!1):a.skipToEnd(),\"comment\";if(b.intag){if(b.operator){b.operator=!1;if(a.match(d))return\"atom\";if(a.match(e))return\"number\"}if(b.sign){b.sign=!1;if(a.match(d))return\"atom\";\nif(a.match(e))return\"number\"}if(b.instring)return c==b.instring&&(b.instring=!1),a.next(),\"string\";if(\"'\"==c||'\"'==c)return b.instring=c,a.next(),\"string\";if(a.match(b.intag+\"}\")||a.eat(\"-\")&&a.match(b.intag+\"}\"))return b.intag=!1,\"tag\";if(a.match(g))return b.operator=!0,\"operator\";if(a.match(h))b.sign=!0;else if(a.eat(\" \")||a.sol()){if(a.match(f))return\"keyword\";if(a.match(d))return\"atom\";if(a.match(e))return\"number\";a.sol()&&a.next()}else a.next();return\"variable\"}if(a.eat(\"{\")){if(a.eat(\"#\"))return b.incomment=\n!0,a.skipTo(\"#}\")?(a.eatWhile(/\\#|}/),b.incomment=!1):a.skipToEnd(),\"comment\";if(c=a.eat(/\\{|%/))return b.intag=c,\"{\"==c&&(b.intag=\"}\"),a.eat(\"-\"),\"tag\"}a.next()}var f=\"and as block endblock by cycle debug else elif extends filter endfilter firstof for endfor if endif ifchanged endifchanged ifequal endifequal ifnotequal endifnotequal in include load not now or parsed regroup reversed spaceless endspaceless ssi templatetag openblock closeblock openvariable closevariable openbrace closebrace opencomment closecomment widthratio url with endwith get_current_language trans endtrans noop blocktrans endblocktrans get_available_languages get_current_language_bidi plural\".split(\" \"),\ng=/^[+\\-*&%=<>!?|~^]/,h=/^[:\\[\\(\\{]/,d=[\"true\",\"false\"],e=/^(\\d[+\\-\\*\\/])?\\d+(\\.\\d+)?/,f=new RegExp(\"((\"+f.join(\")|(\")+\"))\\\\b\"),d=new RegExp(\"((\"+d.join(\")|(\")+\"))\\\\b\");return{startState:function(){return{tokenize:c}},token:function(a,b){return b.tokenize(a,b)}}})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/jsx/jsx.js",
    "content": "'use strict';(function(d){\"object\"==typeof exports&&\"object\"==typeof module?d(require(\"../../lib/codemirror\"),require(\"../xml/xml\"),require(\"../javascript/javascript\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\",\"../xml/xml\",\"../javascript/javascript\"],d):d(CodeMirror)})(function(d){function l(d,l,n,p){this.state=d;this.mode=l;this.depth=n;this.prev=p}function q(e){return new l(d.copyState(e.mode,e.state),e.mode,e.depth,e.prev&&q(e.prev))}d.defineMode(\"jsx\",function(e,m){function n(a){var c=\na.tagName;a.tagName=null;var b=g.indent(a,\"\");a.tagName=c;return b}function p(a,c){if(c.context.mode==g)return r(a,c,c.context);var b=c.context;if(\"<\"==a.peek()&&h.expressionAllowed(a,b.state))h.skipExpression(b.state),c.context=new l(d.startState(g,h.indent(b.state,\"\")),g,0,c.context),c=null;else{var e=h.token(a,b.state);e||null==b.depth||(a=a.current(),\"{\"==a?b.depth++:\"}\"==a&&0==--b.depth&&(c.context=c.context.prev));c=e}return c}function r(a,c,b){if(2==b.depth)return a.match(/^.*?\\*\\//)?b.depth=\n1:a.skipToEnd(),\"comment\";if(\"{\"==a.peek()){g.skipAttribute(b.state);var k=n(b.state),f=b.state.context;if(f&&a.match(/^[^>]*>\\s*$/,!1)){for(;f.prev&&!f.startOfLine;)f=f.prev;f.startOfLine?k-=e.indentUnit:b.prev.state.lexical&&(k=b.prev.state.lexical.indented)}else 1==b.depth&&(k+=e.indentUnit);c.context=new l(d.startState(h,k),h,0,c.context);return null}if(1==b.depth){if(\"<\"==a.peek())return g.skipAttribute(b.state),c.context=new l(d.startState(g,n(b.state)),g,0,c.context),null;if(a.match(\"//\"))return a.skipToEnd(),\n\"comment\";if(a.match(\"/*\"))return b.depth=2,p(a,c)}var k=g.token(a,b.state),f=a.current(),m;/\\btag\\b/.test(k)?/>$/.test(f)?b.state.context?b.depth=0:c.context=c.context.prev:/^</.test(f)&&(b.depth=1):!k&&-1<(m=f.indexOf(\"{\"))&&a.backUp(f.length-m);return k}var g=d.getMode(e,{name:\"xml\",allowMissing:!0,multilineTagIndentPastTag:!1}),h=d.getMode(e,m&&m.base||\"javascript\");return{startState:function(){return{context:new l(d.startState(h),h)}},copyState:function(a){return{context:q(a.context)}},token:p,\nindent:function(a,c,b){return a.context.mode.indent(a.context.state,c,b)},innerMode:function(a){return a.context}}},\"xml\",\"javascript\");d.defineMIME(\"text/jsx\",\"jsx\");d.defineMIME(\"text/typescript-jsx\",{name:\"jsx\",base:{name:\"javascript\",typescript:!0}})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/julia/julia.js",
    "content": "'use strict';(function(f){\"object\"==typeof exports&&\"object\"==typeof module?f(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],f):f(CodeMirror)})(function(f){f.defineMode(\"julia\",function(f,l){function g(b,a){\"undefined\"===typeof a&&(a=\"\\\\b\");return new RegExp(\"^((\"+b.join(\")|(\")+\"))\"+a)}function h(b){return 0==b.scopes.length?null:b.scopes[b.scopes.length-1]}function k(b,a){if(b.match(/^#=/,!1))return a.tokenize=q,a.tokenize(b,a);var d=a.leavingExpr;\nb.sol()&&(d=!1);a.leavingExpr=!1;if(d&&b.match(/^'+/)||b.match(/^\\.{2,3}/))return\"operator\";if(b.eatSpace())return null;var c=b.peek();if(\"#\"===c)return b.skipToEnd(),\"comment\";\"[\"===c&&a.scopes.push(\"[\");\"(\"===c&&a.scopes.push(\"(\");var e=h(a);\"[\"==e&&\"]\"===c&&(a.scopes.pop(),a.leavingExpr=!0);\"(\"==e&&\")\"===c&&(a.scopes.pop(),a.leavingExpr=!0);var f;\"[\"!=h(a)&&(f=b.match(r,!1))&&a.scopes.push(f);\"[\"!=h(a)&&b.match(t,!1)&&a.scopes.pop();if(\"[\"==h(a)){if(\"end\"==a.lastToken&&b.match(/^:/))return\"operator\";\nif(b.match(/^end/))return\"number\"}if(b.match(/^=>/))return\"operator\";if(b.match(/^[0-9\\.]/,!1)&&(c=RegExp(/^im\\b/),e=!1,b.match(/^\\d*\\.(?!\\.)\\d*([Eef][\\+\\-]?\\d+)?/i)&&(e=!0),b.match(/^\\d+\\.(?!\\.)\\d*/)&&(e=!0),b.match(/^\\.\\d+/)&&(e=!0),b.match(/^0x\\.[0-9a-f]+p[\\+\\-]?\\d+/i)&&(e=!0),b.match(/^0x[0-9a-f]+/i)&&(e=!0),b.match(/^0b[01]+/i)&&(e=!0),b.match(/^0o[0-7]+/i)&&(e=!0),b.match(/^[1-9]\\d*(e[\\+\\-]?\\d+)?/)&&(e=!0),b.match(/^0(?![\\dx])/i)&&(e=!0),e))return b.match(c),a.leavingExpr=!0,\"number\";if(b.match(/^<:/))return\"operator\";\nif(b.match(u)||!d&&b.match(v)||b.match(/:\\./)||b.match(/^{[^}]*}(?=\\()/))return\"builtin\";if(b.match(w))return\"operator\";if(b.match(/^'/))return a.tokenize=x,a.tokenize(b,a);if(b.match(y))return a.tokenize=z(b.current()),a.tokenize(b,a);if(b.match(m))return\"meta\";if(b.match(A))return null;if(b.match(B))return\"keyword\";if(b.match(C))return\"builtin\";d=a.isDefinition||\"function\"==a.lastToken||\"macro\"==a.lastToken||\"type\"==a.lastToken||\"immutable\"==a.lastToken;if(b.match(n)){if(d){if(\".\"===b.peek())return a.isDefinition=\n!0,\"variable\";a.isDefinition=!1;return\"def\"}if(b.match(/^({[^}]*})*\\(/,!1))return p(b,a);a.leavingExpr=!0;return\"variable\"}b.next();return\"error\"}function p(b,a){var d=b.match(/^(\\(\\s*)/);d&&(0>a.firstParenPos&&(a.firstParenPos=a.scopes.length),a.scopes.push(\"(\"),a.charsAdvanced+=d[1].length);if(\"(\"==h(a)&&b.match(/^\\)/)&&(a.scopes.pop(),a.charsAdvanced+=1,a.scopes.length<=a.firstParenPos))return d=b.match(/^\\s*?=(?!=)/,!1),b.backUp(a.charsAdvanced),a.firstParenPos=-1,a.charsAdvanced=0,d?\"def\":\"builtin\";\nif(b.match(/^$/g,!1)){for(b.backUp(a.charsAdvanced);a.scopes.length>a.firstParenPos;)a.scopes.pop();a.firstParenPos=-1;a.charsAdvanced=0;return\"builtin\"}a.charsAdvanced+=b.match(/^([^()]*)/)[1].length;return p(b,a)}function q(b,a){b.match(/^#=/)&&a.weakScopes++;b.match(/.*?(?=(#=|=#))/)||b.skipToEnd();b.match(/^=#/)&&(a.weakScopes--,0==a.weakScopes&&(a.tokenize=k));return\"comment\"}function x(b,a){var d=!1,c;if(b.match(D))d=!0;else if(c=b.match(/\\\\u([a-f0-9]{1,4})(?=')/i)){if(c=parseInt(c[1],16),55295>=\nc||57344<=c)d=!0,b.next()}else if(c=b.match(/\\\\U([A-Fa-f0-9]{5,8})(?=')/))c=parseInt(c[1],16),1114111>=c&&(d=!0,b.next());if(d)return a.leavingExpr=!0,a.tokenize=k,\"string\";b.match(/^[^']+(?=')/)||b.skipToEnd();b.match(/^'/)&&(a.tokenize=k);return\"error\"}function z(b){function a(a,c){for(;!a.eol();)if(a.eatWhile(/[^\"\\\\]/),a.eat(\"\\\\\"))a.next();else if(a.match(b)){c.tokenize=k;c.leavingExpr=!0;break}else a.eat(/[\"]/);return\"string\"}for(;0<=\"bruv\".indexOf(b.charAt(0).toLowerCase());)b=b.substr(1);a.isString=\n!0;return a}var w=l.operators||/^\\.?[|&^\\\\%*+\\-<>!=\\/]=?|\\?|~|:|\\$|\\.[<>]|<<=?|>>>?=?|\\.[<>=]=|->?|\\/\\/|\\bin\\b(?!\\()|[\\u2208\\u2209](?!\\()/,A=l.delimiters||/^[;,()[\\]{}]/,n=l.identifiers||/^[_A-Za-z\\u00A1-\\uFFFF][\\w\\u00A1-\\uFFFF]*!*/,y=/^(`|\"{3}|([brv]?\"))/,D=g([\"\\\\\\\\[0-7]{1,3}\",\"\\\\\\\\x[A-Fa-f0-9]{1,2}\",\"\\\\\\\\[abfnrtv0%?'\\\"\\\\\\\\]\",\"([^\\\\u0027\\\\u005C\\\\uD800-\\\\uDFFF]|[\\\\uD800-\\\\uDFFF][\\\\uDC00-\\\\uDFFF])\"],\"'\"),B=g(\"if else elseif while for begin let end do try catch finally return break continue global local const export import importall using function macro module baremodule type immutable quote typealias abstract bitstype\".split(\" \")),\nC=g([\"true\",\"false\",\"nothing\",\"NaN\",\"Inf\"]),r=g(\"begin function type immutable let macro for while quote if else elseif try finally catch do\".split(\" \")),t=g([\"end\",\"else\",\"elseif\",\"catch\",\"finally\"]),m=/^@[_A-Za-z][\\w]*/,v=/^:[_A-Za-z\\u00A1-\\uFFFF][\\w\\u00A1-\\uFFFF]*!*/,u=/^::[^,;\"{()=$\\s]+({[^}]*}+)*/;return{startState:function(){return{tokenize:k,scopes:[],weakScopes:0,lastToken:null,leavingExpr:!1,isDefinition:!1,charsAdvanced:0,firstParenPos:-1}},token:function(b,a){var d=a.tokenize(b,a),c=b.current();\nc&&d&&(a.lastToken=c);\".\"===c&&(d=b.match(n,!1)||b.match(m,!1)||b.match(/\\(/,!1)?\"operator\":\"error\");return d},indent:function(b,a){var d=0;if(\"]\"==a||\")\"==a||\"end\"==a||\"else\"==a||\"elseif\"==a||\"catch\"==a||\"finally\"==a)d=-1;return(b.scopes.length+d)*f.indentUnit},electricInput:/(end|else(if)?|catch|finally)$/,lineComment:\"#\",fold:\"indent\"}});f.defineMIME(\"text/x-julia\",\"julia\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/livescript/livescript.js",
    "content": "'use strict';(function(b){\"object\"==typeof exports&&\"object\"==typeof module?b(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],b):b(CodeMirror)})(function(b){b.defineMode(\"livescript\",function(){var a=function(c,a){var d=a.next||\"start\";a.next=a.next;var b=f[d];if(b.splice){for(d=0;d<b.length;++d){var e=b[d];if(e.regex&&c.match(e.regex))return a.next=e.next||a.next,e.token}c.next();return\"error\"}if(c.match(e=f[d])){if(e.regex&&c.match(e.regex))return a.next=\ne.next,e.token;c.next();return\"error\"}c.next();return\"error\"};return{startState:function(){return{next:\"start\",lastToken:{style:null,indent:0,content:\"\"}}},token:function(c,b){for(;c.pos==c.start;)var d=a(c,b);b.lastToken={style:d,indent:c.indentation(),content:c.current()};return d.replace(/\\./g,\" \")},indent:function(a){var b=a.lastToken.indent;a.lastToken.content.match(l)&&(b+=2);return b}}});var l=/(?:[({[=:]|[-~]>|\\b(?:e(?:lse|xport)|d(?:o|efault)|t(?:ry|hen)|finally|import(?:\\s*all)?|const|var|let|new|catch(?:\\s*(?![\\d\\s])[$\\w\\xAA-\\uFFDC](?:(?!\\s)[$\\w\\xAA-\\uFFDC]|-[A-Za-z])*)?))\\s*$/,\na={token:\"string\",regex:\".+\"},f={start:[{token:\"comment.doc\",regex:\"/\\\\*\",next:\"comment\"},{token:\"comment\",regex:\"#.*\"},{token:\"keyword\",regex:\"(?:t(?:h(?:is|row|en)|ry|ypeof!?)|c(?:on(?:tinue|st)|a(?:se|tch)|lass)|i(?:n(?:stanceof)?|mp(?:ort(?:\\\\s+all)?|lements)|[fs])|d(?:e(?:fault|lete|bugger)|o)|f(?:or(?:\\\\s+own)?|inally|unction)|s(?:uper|witch)|e(?:lse|x(?:tends|port)|val)|a(?:nd|rguments)|n(?:ew|ot)|un(?:less|til)|w(?:hile|ith)|o[fr]|return|break|let|var|loop)(?![$\\\\w]|-[A-Za-z]|\\\\s*:(?![:=]))\"},\n{token:\"constant.language\",regex:\"(?:true|false|yes|no|on|off|null|void|undefined)(?![$\\\\w]|-[A-Za-z]|\\\\s*:(?![:=]))\"},{token:\"invalid.illegal\",regex:\"(?:p(?:ackage|r(?:ivate|otected)|ublic)|i(?:mplements|nterface)|enum|static|yield)(?![$\\\\w]|-[A-Za-z]|\\\\s*:(?![:=]))\"},{token:\"language.support.class\",regex:\"(?:R(?:e(?:gExp|ferenceError)|angeError)|S(?:tring|yntaxError)|E(?:rror|valError)|Array|Boolean|Date|Function|Number|Object|TypeError|URIError)(?![$\\\\w]|-[A-Za-z]|\\\\s*:(?![:=]))\"},{token:\"language.support.function\",\nregex:\"(?:is(?:NaN|Finite)|parse(?:Int|Float)|Math|JSON|(?:en|de)codeURI(?:Component)?)(?![$\\\\w]|-[A-Za-z]|\\\\s*:(?![:=]))\"},{token:\"variable.language\",regex:\"(?:t(?:hat|il|o)|f(?:rom|allthrough)|it|by|e)(?![$\\\\w]|-[A-Za-z]|\\\\s*:(?![:=]))\"},{token:\"identifier\",regex:\"(?![\\\\d\\\\s])[$\\\\w\\\\xAA-\\\\uFFDC](?:(?!\\\\s)[$\\\\w\\\\xAA-\\\\uFFDC]|-[A-Za-z])*\\\\s*:(?![:=])\"},{token:\"variable\",regex:\"(?![\\\\d\\\\s])[$\\\\w\\\\xAA-\\\\uFFDC](?:(?!\\\\s)[$\\\\w\\\\xAA-\\\\uFFDC]|-[A-Za-z])*\"},{token:\"keyword.operator\",regex:\"(?:\\\\.{3}|\\\\s+\\\\?)\"},\n{token:\"keyword.variable\",regex:\"(?:@+|::|\\\\.\\\\.)\",next:\"key\"},{token:\"keyword.operator\",regex:\"\\\\.\\\\s*\",next:\"key\"},{token:\"string\",regex:\"\\\\\\\\\\\\S[^\\\\s,;)}\\\\]]*\"},{token:\"string.doc\",regex:\"'''\",next:\"qdoc\"},{token:\"string.doc\",regex:'\"\"\"',next:\"qqdoc\"},{token:\"string\",regex:\"'\",next:\"qstring\"},{token:\"string\",regex:'\"',next:\"qqstring\"},{token:\"string\",regex:\"`\",next:\"js\"},{token:\"string\",regex:\"<\\\\[\",next:\"words\"},{token:\"string.regex\",regex:\"//\",next:\"heregex\"},{token:\"string.regex\",regex:\"\\\\/(?:[^[\\\\/\\\\n\\\\\\\\]*(?:(?:\\\\\\\\.|\\\\[[^\\\\]\\\\n\\\\\\\\]*(?:\\\\\\\\.[^\\\\]\\\\n\\\\\\\\]*)*\\\\])[^[\\\\/\\\\n\\\\\\\\]*)*)\\\\/[gimy$]{0,4}\",\nnext:\"key\"},{token:\"constant.numeric\",regex:\"(?:0x[\\\\da-fA-F][\\\\da-fA-F_]*|(?:[2-9]|[12]\\\\d|3[0-6])r[\\\\da-zA-Z][\\\\da-zA-Z_]*|(?:\\\\d[\\\\d_]*(?:\\\\.\\\\d[\\\\d_]*)?|\\\\.\\\\d[\\\\d_]*)(?:e[+-]?\\\\d[\\\\d_]*)?[\\\\w$]*)\"},{token:\"lparen\",regex:\"[({[]\"},{token:\"rparen\",regex:\"[)}\\\\]]\",next:\"key\"},{token:\"keyword.operator\",regex:\"\\\\S+\"},{token:\"text\",regex:\"\\\\s+\"}],heregex:[{token:\"string.regex\",regex:\".*?//[gimy$?]{0,4}\",next:\"start\"},{token:\"string.regex\",regex:\"\\\\s*#{\"},{token:\"comment.regex\",regex:\"\\\\s+(?:#.*)?\"},\n{token:\"string.regex\",regex:\"\\\\S+\"}],key:[{token:\"keyword.operator\",regex:\"[.?@!]+\"},{token:\"identifier\",regex:\"(?![\\\\d\\\\s])[$\\\\w\\\\xAA-\\\\uFFDC](?:(?!\\\\s)[$\\\\w\\\\xAA-\\\\uFFDC]|-[A-Za-z])*\",next:\"start\"},{token:\"text\",regex:\"\",next:\"start\"}],comment:[{token:\"comment.doc\",regex:\".*?\\\\*/\",next:\"start\"},{token:\"comment.doc\",regex:\".+\"}],qdoc:[{token:\"string\",regex:\".*?'''\",next:\"key\"},a],qqdoc:[{token:\"string\",regex:'.*?\"\"\"',next:\"key\"},a],qstring:[{token:\"string\",regex:\"[^\\\\\\\\']*(?:\\\\\\\\.[^\\\\\\\\']*)*'\",next:\"key\"},\na],qqstring:[{token:\"string\",regex:'[^\\\\\\\\\"]*(?:\\\\\\\\.[^\\\\\\\\\"]*)*\"',next:\"key\"},a],js:[{token:\"string\",regex:\"[^\\\\\\\\`]*(?:\\\\\\\\.[^\\\\\\\\`]*)*`\",next:\"key\"},a],words:[{token:\"string\",regex:\".*?\\\\]>\",next:\"key\"},a]},g;for(g in f)if(a=f[g],a.splice)for(var h=0,m=a.length;h<m;++h){var k=a[h];\"string\"===typeof k.regex&&(f[g][h].regex=new RegExp(\"^\"+k.regex))}else\"string\"===typeof k.regex&&(f[g].regex=new RegExp(\"^\"+a.regex));b.defineMIME(\"text/x-livescript\",\"livescript\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/lua/lua.js",
    "content": "'use strict';(function(d){\"object\"==typeof exports&&\"object\"==typeof module?d(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],d):d(CodeMirror)})(function(d){d.defineMode(\"lua\",function(d,l){function e(a){return new RegExp(\"^(?:\"+a.join(\"|\")+\")$\",\"i\")}function h(a){for(var b=0;a.eat(\"=\");)++b;a.eat(\"[\");return b}function g(a,b){var c=a.next();if(\"-\"==c&&a.eat(\"-\")){if(a.eat(\"[\")&&a.eat(\"[\"))return(b.cur=k(h(a),\"comment\"))(a,b);a.skipToEnd();return\"comment\"}return'\"'==\nc||\"'\"==c?(b.cur=m(c))(a,b):\"[\"==c&&/[\\[=]/.test(a.peek())?(b.cur=k(h(a),\"string\"))(a,b):/\\d/.test(c)?(a.eatWhile(/[\\w.%]/),\"number\"):/[\\w_]/.test(c)?(a.eatWhile(/[\\w\\\\\\-_.]/),\"variable\"):null}function k(a,b){return function(c,d){for(var f=null,e;null!=(e=c.next());)if(null==f)\"]\"==e&&(f=0);else if(\"=\"==e)++f;else if(\"]\"==e&&f==a){d.cur=g;break}else f=null;return b}}function m(a){return function(b,c){for(var d=!1,e;null!=(e=b.next())&&(e!=a||d);)d=!d&&\"\\\\\"==e;d||(c.cur=g);return\"string\"}}var n=d.indentUnit,\np=e(l.specials||[]),q=e(\"_G _VERSION assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall coroutine.create coroutine.resume coroutine.running coroutine.status coroutine.wrap coroutine.yield debug.debug debug.getfenv debug.gethook debug.getinfo debug.getlocal debug.getmetatable debug.getregistry debug.getupvalue debug.setfenv debug.sethook debug.setlocal debug.setmetatable debug.setupvalue debug.traceback close flush lines read seek setvbuf write io.close io.flush io.input io.lines io.open io.output io.popen io.read io.stderr io.stdin io.stdout io.tmpfile io.type io.write math.abs math.acos math.asin math.atan math.atan2 math.ceil math.cos math.cosh math.deg math.exp math.floor math.fmod math.frexp math.huge math.ldexp math.log math.log10 math.max math.min math.modf math.pi math.pow math.rad math.random math.randomseed math.sin math.sinh math.sqrt math.tan math.tanh os.clock os.date os.difftime os.execute os.exit os.getenv os.remove os.rename os.setlocale os.time os.tmpname package.cpath package.loaded package.loaders package.loadlib package.path package.preload package.seeall string.byte string.char string.dump string.find string.format string.gmatch string.gsub string.len string.lower string.match string.rep string.reverse string.sub string.upper table.concat table.insert table.maxn table.remove table.sort\".split(\" \")),\nr=e(\"and break elseif false nil not or return true function end if then else do while repeat until for in local\".split(\" \")),t=e(\"function if repeat do \\\\( {\".split(\" \")),u=e([\"end\",\"until\",\"\\\\)\",\"}\"]),v=/^(?:end|until|\\)|}|else|elseif)/i;return{startState:function(a){return{basecol:a||0,indentDepth:0,cur:g}},token:function(a,b){if(a.eatSpace())return null;var c=b.cur(a,b);a=a.current();\"variable\"==c&&(r.test(a)?c=\"keyword\":q.test(a)?c=\"builtin\":p.test(a)&&(c=\"variable-2\"));\"comment\"!=c&&\"string\"!=\nc&&(t.test(a)?++b.indentDepth:u.test(a)&&--b.indentDepth);return c},indent:function(a,b){b=v.test(b);return a.basecol+n*(a.indentDepth-(b?1:0))},lineComment:\"--\",blockCommentStart:\"--[[\",blockCommentEnd:\"]]\"}});d.defineMIME(\"text/x-lua\",\"lua\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/markdown/markdown.js",
    "content": "'use strict';(function(h){\"object\"==typeof exports&&\"object\"==typeof module?h(require(\"../../lib/codemirror\"),require(\"../xml/xml\"),require(\"../meta\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\",\"../xml/xml\",\"../meta\"],h):h(CodeMirror)})(function(h){h.defineMode(\"markdown\",function(v,c){function r(b,a,c){a.f=a.inline=c;return c(b,a)}function t(b){return!b||!/\\S/.test(b.string)}function w(b){b.linkTitle=!1;b.em=!1;b.strong=!1;b.strikethrough=!1;b.quote=0;b.indentedCode=!1;\nx&&b.f==u&&(b.f=m,b.block=p);b.trailingSpace=0;b.trailingSpaceNewLine=!1;b.prevLine=b.thisLine;return b.thisLine=null}function p(b,a){var e=b.sol(),g=!1!==a.list,l=a.indentedCode;a.indentedCode=!1;g&&(0<=a.indentationDiff?(4>a.indentationDiff&&(a.indentation-=a.indentationDiff),a.list=null):a.list=0<a.indentation?null:!1);var k=null;if(4<=a.indentationDiff)return b.skipToEnd(),l||t(a.prevLine)?(a.indentation-=4,a.indentedCode=!0,f.code):null;if(b.eatSpace())return null;if((k=b.match(E))&&6>=k[1].length)return a.header=\nk[1].length,c.highlightFormatting&&(a.formatting=\"header\"),a.f=a.inline,d(a);if(t(a.prevLine)||a.quote||g||l||!(k=b.match(F))){if(b.eat(\">\"))return a.quote=e?1:a.quote+1,c.highlightFormatting&&(a.formatting=\"quote\"),b.eatSpace(),d(a);if(\"[\"===b.peek())return r(b,a,G);if(b.match(H,!0))return a.hr=!0,f.hr;if((t(a.prevLine)||g)&&(b.match(y,!1)||b.match(z,!1))){b.match(y,!0)?e=\"ul\":(b.match(z,!0),e=\"ol\");a.indentation=b.column()+b.current().length;for(a.list=!0;a.listStack&&b.column()<a.listStack[a.listStack.length-\n1];)a.listStack.pop();a.listStack.push(a.indentation);c.taskLists&&b.match(A,!1)&&(a.taskList=!0);a.f=a.inline;c.highlightFormatting&&(a.formatting=[\"list\",\"list-\"+e]);return d(a)}if(c.fencedCodeBlocks&&(k=b.match(I,!0)))return a.fencedChars=k[1],b=k[2],h.findModeByName&&(e=h.findModeByName(b))&&(b=e.mime||e.mimes[0]),b=h.getMode(v,b),a.localMode=\"null\"==b.name?null:b,a.localMode&&(a.localState=h.startState(a.localMode)),a.f=a.block=J,c.highlightFormatting&&(a.formatting=\"code-block\"),a.code=-1,d(a)}else return a.header=\n\"=\"==k[0].charAt(0)?1:2,c.highlightFormatting&&(a.formatting=\"header\"),a.f=a.inline,d(a);return r(b,a,a.inline)}function u(b,a){var c=n.token(b,a.htmlState);if(!x){var d=h.innerMode(n,a.htmlState);if(\"xml\"==d.mode.name&&null===d.state.tagStart&&!d.state.context&&d.state.tokenize.isInText||a.md_inside&&-1<b.current().indexOf(\">\"))a.f=m,a.block=p,a.htmlState=null}return c}function J(b,a){if(a.fencedChars&&b.match(a.fencedChars,!1))return a.localMode=a.localState=null,a.f=a.block=K,null;if(a.localMode)return a.localMode.token(b,\na.localState);b.skipToEnd();return f.code}function K(b,a){b.match(a.fencedChars);a.block=p;a.f=m;a.fencedChars=null;c.highlightFormatting&&(a.formatting=\"code-block\");a.code=1;b=d(a);a.code=0;return b}function d(b){var a=[];if(b.formatting){a.push(f.formatting);\"string\"===typeof b.formatting&&(b.formatting=[b.formatting]);for(var e=0;e<b.formatting.length;e++)a.push(f.formatting+\"-\"+b.formatting[e]),\"header\"===b.formatting[e]&&a.push(f.formatting+\"-\"+b.formatting[e]+\"-\"+b.header),\"quote\"===b.formatting[e]&&\n(!c.maxBlockquoteDepth||c.maxBlockquoteDepth>=b.quote?a.push(f.formatting+\"-\"+b.formatting[e]+\"-\"+b.quote):a.push(\"error\"))}if(b.taskOpen)return a.push(\"meta\"),a.length?a.join(\" \"):null;if(b.taskClosed)return a.push(\"property\"),a.length?a.join(\" \"):null;b.linkHref?a.push(f.linkHref,\"url\"):(b.strong&&a.push(f.strong),b.em&&a.push(f.em),b.strikethrough&&a.push(f.strikethrough),b.linkText&&a.push(f.linkText),b.code&&a.push(f.code),b.image&&a.push(f.image),b.imageAltText&&a.push(f.imageAltText,\"link\"),\nb.imageMarker&&a.push(f.imageMarker));b.header&&a.push(f.header,f.header+\"-\"+b.header);b.quote&&(a.push(f.quote),!c.maxBlockquoteDepth||c.maxBlockquoteDepth>=b.quote?a.push(f.quote+\"-\"+b.quote):a.push(f.quote+\"-\"+c.maxBlockquoteDepth));!1!==b.list&&((e=(b.listStack.length-1)%3)?1===e?a.push(f.list2):a.push(f.list3):a.push(f.list1));b.trailingSpaceNewLine?a.push(\"trailing-space-new-line\"):b.trailingSpace&&a.push(\"trailing-space-\"+(b.trailingSpace%2?\"a\":\"b\"));return a.length?a.join(\" \"):null}function L(b,\na){if(b.match(M,!0))return d(a)}function m(b,a){var e=a.text(b,a);if(\"undefined\"!==typeof e)return e;if(a.list)return a.list=null,d(a);if(a.taskList)return\"x\"!==b.match(A,!0)[1]?a.taskOpen=!0:a.taskClosed=!0,c.highlightFormatting&&(a.formatting=\"task\"),a.taskList=!1,d(a);a.taskOpen=!1;a.taskClosed=!1;if(a.header&&b.match(/^#+$/,!0))return c.highlightFormatting&&(a.formatting=\"header\"),d(a);var e=b.sol(),g=b.next();if(a.linkTitle){a.linkTitle=!1;var l=g;\"(\"===g&&(l=\")\");l=(l+\"\").replace(/([.?*+^$[\\]\\\\(){}|-])/g,\n\"\\\\$1\");if(b.match(new RegExp(\"^\\\\s*(?:[^\"+l+\"\\\\\\\\]+|\\\\\\\\\\\\\\\\|\\\\\\\\.)\"+l),!0))return f.linkHref}if(\"`\"===g){e=a.formatting;c.highlightFormatting&&(a.formatting=\"code\");b.eatWhile(\"`\");b=b.current().length;if(0==a.code)return a.code=b,d(a);if(b==a.code)return b=d(a),a.code=0,b;a.formatting=e;return d(a)}if(a.code)return d(a);if(\"\\\\\"===g&&(b.next(),c.highlightFormatting))return b=d(a),a=f.formatting+\"-escape\",b?b+\" \"+a:a;if(\"!\"===g&&b.match(/\\[[^\\]]*\\] ?(?:\\(|\\[)/,!1))return a.imageMarker=!0,a.image=\n!0,c.highlightFormatting&&(a.formatting=\"image\"),d(a);if(\"[\"===g&&a.imageMarker)return a.imageMarker=!1,a.imageAltText=!0,c.highlightFormatting&&(a.formatting=\"image\"),d(a);if(\"]\"===g&&a.imageAltText)return c.highlightFormatting&&(a.formatting=\"image\"),b=d(a),a.imageAltText=!1,a.image=!1,a.inline=a.f=B,b;if(\"[\"===g&&b.match(/[^\\]]*\\](\\(.*\\)| ?\\[.*?\\])/,!1)&&!a.image)return a.linkText=!0,c.highlightFormatting&&(a.formatting=\"link\"),d(a);if(\"]\"===g&&a.linkText&&b.match(/\\(.*?\\)| ?\\[.*?\\]/,!1))return c.highlightFormatting&&\n(a.formatting=\"link\"),b=d(a),a.linkText=!1,a.inline=a.f=B,b;if(\"<\"===g&&b.match(/^(https?|ftps?):\\/\\/(?:[^\\\\>]|\\\\.)+>/,!1))return a.f=a.inline=C,c.highlightFormatting&&(a.formatting=\"link\"),b=d(a),(b?b+\" \":\"\")+f.linkInline;if(\"<\"===g&&b.match(/^[^> \\\\]+@(?:[^\\\\>]|\\\\.)+>/,!1))return a.f=a.inline=C,c.highlightFormatting&&(a.formatting=\"link\"),b=d(a),(b?b+\" \":\"\")+f.linkEmail;if(\"<\"===g&&b.match(/^(!--|\\w)/,!1))return e=b.string.indexOf(\">\",b.pos),-1!=e&&(e=b.string.substring(b.start,e),/markdown\\s*=\\s*('|\"){0,1}1('|\"){0,1}/.test(e)&&\n(a.md_inside=!0)),b.backUp(1),a.htmlState=h.startState(n),e=u,a.f=a.block=e,e(b,a);if(\"<\"===g&&b.match(/^\\/\\w*?>/))return a.md_inside=!1,\"tag\";l=!1;if(!c.underscoresBreakWords&&\"_\"===g&&\"_\"!==b.peek()&&b.match(/(\\w)/,!1)){var k=b.pos-2;0<=k&&(k=b.string.charAt(k),\"_\"!==k&&k.match(/(\\w)/,!1)&&(l=!0))}if(\"*\"===g||\"_\"===g&&!l){if(!e||\" \"!==b.peek()){if(a.strong===g&&b.eat(g))return c.highlightFormatting&&(a.formatting=\"strong\"),b=d(a),a.strong=!1,b;if(!a.strong&&b.eat(g))return a.strong=g,c.highlightFormatting&&\n(a.formatting=\"strong\"),d(a);if(a.em===g)return c.highlightFormatting&&(a.formatting=\"em\"),b=d(a),a.em=!1,b;if(!a.em)return a.em=g,c.highlightFormatting&&(a.formatting=\"em\"),d(a)}}else if(\" \"===g&&(b.eat(\"*\")||b.eat(\"_\"))){if(\" \"===b.peek())return d(a);b.backUp(1)}if(c.strikethrough)if(\"~\"===g&&b.eatWhile(g)){if(a.strikethrough)return c.highlightFormatting&&(a.formatting=\"strikethrough\"),b=d(a),a.strikethrough=!1,b;if(b.match(/^[^\\s]/,!1))return a.strikethrough=!0,c.highlightFormatting&&(a.formatting=\n\"strikethrough\"),d(a)}else if(\" \"===g&&b.match(/^~~/,!0)){if(\" \"===b.peek())return d(a);b.backUp(2)}\" \"===g&&(b.match(/ +$/,!1)?a.trailingSpace++:a.trailingSpace&&(a.trailingSpaceNewLine=!0));return d(a)}function C(b,a){if(\">\"===b.next())return a.f=a.inline=m,c.highlightFormatting&&(a.formatting=\"link\"),b=d(a),(b?b+\" \":\"\")+f.linkInline;b.match(/^[^>]+/,!0);return f.linkInline}function B(b,a){if(b.eatSpace())return null;b=b.next();return\"(\"===b||\"[\"===b?(a.f=a.inline=N(\"(\"===b?\")\":\"]\",0),c.highlightFormatting&&\n(a.formatting=\"link-string\"),a.linkHref=!0,d(a)):\"error\"}function N(b){return function(a,e){if(a.next()===b)return e.f=e.inline=m,c.highlightFormatting&&(e.formatting=\"link-string\"),a=d(e),e.linkHref=!1,a;a.match(O[b]);e.linkHref=!0;return d(e)}}function G(b,a){return b.match(/^([^\\]\\\\]|\\\\.)*\\]:/,!1)?(a.f=P,b.next(),c.highlightFormatting&&(a.formatting=\"link\"),a.linkText=!0,d(a)):r(b,a,m)}function P(b,a){if(b.match(/^\\]:/,!0))return a.f=a.inline=Q,c.highlightFormatting&&(a.formatting=\"link\"),b=d(a),\na.linkText=!1,b;b.match(/^([^\\]\\\\]|\\\\.)+/,!0);return f.linkText}function Q(b,a){if(b.eatSpace())return null;b.match(/^[^\\s]+/,!0);void 0===b.peek()?a.linkTitle=!0:b.match(/^(?:\\s+(?:\"(?:[^\"\\\\]|\\\\\\\\|\\\\.)+\"|'(?:[^'\\\\]|\\\\\\\\|\\\\.)+'|\\((?:[^)\\\\]|\\\\\\\\|\\\\.)+\\)))?/,!0);a.f=a.inline=m;return f.linkHref+\" url\"}var n=h.getMode(v,\"text/html\"),x=\"null\"==n.name;void 0===c.highlightFormatting&&(c.highlightFormatting=!1);void 0===c.maxBlockquoteDepth&&(c.maxBlockquoteDepth=0);void 0===c.underscoresBreakWords&&(c.underscoresBreakWords=\n!0);void 0===c.taskLists&&(c.taskLists=!1);void 0===c.strikethrough&&(c.strikethrough=!1);void 0===c.tokenTypeOverrides&&(c.tokenTypeOverrides={});var f={header:\"header\",code:\"comment\",quote:\"quote\",list1:\"variable-2\",list2:\"variable-3\",list3:\"keyword\",hr:\"hr\",image:\"image\",imageAltText:\"image-alt-text\",imageMarker:\"image-marker\",formatting:\"formatting\",linkInline:\"link\",linkEmail:\"link\",linkText:\"link\",linkHref:\"string\",em:\"em\",strong:\"strong\",strikethrough:\"strikethrough\"},q;for(q in f)f.hasOwnProperty(q)&&\nc.tokenTypeOverrides[q]&&(f[q]=c.tokenTypeOverrides[q]);var H=/^([*\\-_])(?:\\s*\\1){2,}\\s*$/,y=/^[*\\-+]\\s+/,z=/^[0-9]+([.)])\\s+/,A=/^\\[(x| )\\](?=\\s)/,E=c.allowAtxHeaderWithoutSpace?/^(#+)/:/^(#+)(?: |$)/,F=/^ *(?:\\={1,}|-{1,})\\s*$/,M=/^[^#!\\[\\]*_\\\\<>` \"'(~]+/,I=new RegExp(\"^(\"+(!0===c.fencedCodeBlocks?\"~~~+|```+\":c.fencedCodeBlocks)+\")[ \\\\t]*([\\\\w+#-]*)\"),O={\")\":/^(?:[^\\\\\\(\\)]|\\\\.|\\((?:[^\\\\\\(\\)]|\\\\.)*\\))*?(?=\\))/,\"]\":/^(?:[^\\\\\\[\\]]|\\\\.|\\[(?:[^\\\\\\[\\\\]]|\\\\.)*\\])*?(?=\\])/},D={startState:function(){return{f:p,\nprevLine:null,thisLine:null,block:p,htmlState:null,indentation:0,inline:m,text:L,formatting:!1,linkText:!1,linkHref:!1,linkTitle:!1,code:0,em:!1,strong:!1,header:0,hr:!1,taskList:!1,list:!1,listStack:[],quote:0,trailingSpace:0,trailingSpaceNewLine:!1,strikethrough:!1,fencedChars:null}},copyState:function(b){return{f:b.f,prevLine:b.prevLine,thisLine:b.thisLine,block:b.block,htmlState:b.htmlState&&h.copyState(n,b.htmlState),indentation:b.indentation,localMode:b.localMode,localState:b.localMode?h.copyState(b.localMode,\nb.localState):null,inline:b.inline,text:b.text,formatting:!1,linkTitle:b.linkTitle,code:b.code,em:b.em,strong:b.strong,strikethrough:b.strikethrough,header:b.header,hr:b.hr,taskList:b.taskList,list:b.list,listStack:b.listStack.slice(0),quote:b.quote,indentedCode:b.indentedCode,trailingSpace:b.trailingSpace,trailingSpaceNewLine:b.trailingSpaceNewLine,md_inside:b.md_inside,fencedChars:b.fencedChars}},token:function(b,a){a.formatting=!1;if(b!=a.thisLine){var c=a.header||a.hr;a.header=0;a.hr=!1;if(b.match(/^\\s*$/,\n!0)||c){w(a);if(!c)return null;a.prevLine=null}a.prevLine=a.thisLine;a.thisLine=b;a.taskList=!1;a.trailingSpace=0;a.trailingSpaceNewLine=!1;a.f=a.block;c=b.match(/^\\s*/,!0)[0].replace(/\\t/g,\"    \").length;a.indentationDiff=Math.min(c-a.indentation,4);a.indentation+=a.indentationDiff;if(0<c)return null}return a.f(b,a)},innerMode:function(b){return b.block==u?{state:b.htmlState,mode:n}:b.localState?{state:b.localState,mode:b.localMode}:{state:b,mode:D}},blankLine:w,getType:d,fold:\"markdown\"};return D},\n\"xml\");h.defineMIME(\"text/x-markdown\",\"markdown\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/mathematica/mathematica.js",
    "content": "'use strict';(function(c){\"object\"==typeof exports&&\"object\"==typeof module?c(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],c):c(CodeMirror)})(function(c){c.defineMode(\"mathematica\",function(c,n){function f(a,b){var d;d=a.next();if('\"'===d)return b.tokenize=g,b.tokenize(a,b);if(\"(\"===d&&a.eat(\"*\"))return b.commentLevel++,b.tokenize=h,b.tokenize(a,b);a.backUp(1);if(a.match(k,!0,!1)||a.match(l,!0,!1))return\"number\";if(a.match(/(?:In|Out)\\[[0-9]*\\]/,\n!0,!1))return\"atom\";if(a.match(/([a-zA-Z\\$]+(?:`?[a-zA-Z0-9\\$])*::usage)/,!0,!1))return\"meta\";if(a.match(/([a-zA-Z\\$]+(?:`?[a-zA-Z0-9\\$])*::[a-zA-Z\\$][a-zA-Z0-9\\$]*):?/,!0,!1))return\"string-2\";if(a.match(/([a-zA-Z\\$][a-zA-Z0-9\\$]*\\s*:)(?:(?:[a-zA-Z\\$][a-zA-Z0-9\\$]*)|(?:[^:=>~@\\^\\&\\*\\)\\[\\]'\\?,\\|])).*/,!0,!1)||a.match(/[a-zA-Z\\$][a-zA-Z0-9\\$]*_+[a-zA-Z\\$][a-zA-Z0-9\\$]*/,!0,!1)||a.match(/[a-zA-Z\\$][a-zA-Z0-9\\$]*_+/,!0,!1)||a.match(/_+[a-zA-Z\\$][a-zA-Z0-9\\$]*/,!0,!1))return\"variable-2\";if(a.match(/\\\\\\[[a-zA-Z\\$][a-zA-Z0-9\\$]*\\]/,\n!0,!1))return\"variable-3\";if(a.match(/(?:\\[|\\]|{|}|\\(|\\))/,!0,!1))return\"bracket\";if(a.match(/(?:#[a-zA-Z\\$][a-zA-Z0-9\\$]*|#+[0-9]?)/,!0,!1))return\"variable-2\";if(a.match(m,!0,!1))return\"keyword\";if(a.match(/(?:\\\\|\\+|\\-|\\*|\\/|,|;|\\.|:|@|~|=|>|<|&|\\||_|`|'|\\^|\\?|!|%)/,!0,!1))return\"operator\";a.next();return\"error\"}function g(a,b){for(var d,c=!1,e=!1;null!=(d=a.next());){if('\"'===d&&!e){c=!0;break}e=!e&&\"\\\\\"===d}c&&!e&&(b.tokenize=f);return\"string\"}function h(a,b){for(var d,c;0<b.commentLevel&&null!=\n(c=a.next());)\"(\"===d&&\"*\"===c&&b.commentLevel++,\"*\"===d&&\")\"===c&&b.commentLevel--,d=c;0>=b.commentLevel&&(b.tokenize=f);return\"comment\"}var k=/(?:(?:\\d+)(?:\\^\\^(?:\\.\\w+|\\w+\\.\\w*|\\w+)(?:`(?:`?(?:\\.\\d+|\\d+\\.\\d*|\\d+))?)?(?:\\*\\^[+-]?\\d+)?))/,l=/(?:(?:\\.\\d+|\\d+\\.\\d*|\\d+)(?:`(?:`?(?:\\.\\d+|\\d+\\.\\d*|\\d+))?)?(?:\\*\\^[+-]?\\d+)?)/,m=/(?:`?)(?:[a-zA-Z\\$][a-zA-Z0-9\\$]*)(?:`(?:[a-zA-Z\\$][a-zA-Z0-9\\$]*))*(?:`?)/;return{startState:function(){return{tokenize:f,commentLevel:0}},token:function(a,b){return a.eatSpace()?\nnull:b.tokenize(a,b)},blockCommentStart:\"(*\",blockCommentEnd:\"*)\"}});c.defineMIME(\"text/x-mathematica\",{name:\"mathematica\"})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/mbox/mbox.js",
    "content": "'use strict';(function(c){\"object\"==typeof exports&&\"object\"==typeof module?c(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],c):c(CodeMirror)})(function(c){function g(b,a){if(b.sol()){a.inSeparator=!1;if(a.inHeader&&b.match(h))return null;a.inHeader=!1;a.header=null;if(b.match(k))return a.inHeaders=!0,a.inSeparator=!0,\"atom\";var d,c=!1;if((d=b.match(l))||(c=!0,d=b.match(m)))return a.inHeaders=!0,a.inHeader=!0,a.emailPermitted=c,a.header=d[1],\n\"atom\";if(a.inHeaders&&(d=b.match(n)))return a.inHeader=!0,a.emailPermitted=!0,a.header=d[1],\"atom\";a.inHeaders=!1;b.skipToEnd();return null}if(a.inSeparator){if(b.match(p))return\"link\";if(b.match(q))return\"atom\";b.skipToEnd();return\"atom\"}if(a.inHeader){d=\"Subject\"===a.header?\"header\":\"string\";if(a.emailPermitted){if(b.match(r))return d+\" link\";if(b.match(t))return d}b.skipToEnd();return d}b.skipToEnd();return null}var e=\"From Sender Reply-To To Cc Bcc Message-ID In-Reply-To References Resent-From Resent-Sender Resent-To Resent-Cc Resent-Bcc Resent-Message-ID Return-Path Received\".split(\" \"),\nf=[\"Date\",\"Subject\",\"Comments\",\"Keywords\",\"Resent-Date\"];c.registerHelper(\"hintWords\",\"mbox\",e.concat(f));var h=/^[ \\t]/,k=/^From /,m=new RegExp(\"^(\"+e.join(\"|\")+\"): \"),l=new RegExp(\"^(\"+f.join(\"|\")+\"): \"),n=/^[^:]+:/,p=/^[^ ]+@[^ ]+/,q=/^.*?(?=[^ ]+?@[^ ]+)/,r=/^<.*?>/,t=/^.*?(?=<.*>)/;c.defineMode(\"mbox\",function(){return{startState:function(){return{inSeparator:!1,inHeader:!1,emailPermitted:!1,header:null,inHeaders:!1}},token:g,blankLine:function(b){b.inHeaders=b.inSeparator=b.inHeader=!1}}});\nc.defineMIME(\"application/mbox\",\"mbox\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/meta.js",
    "content": "'use strict';(function(b){\"object\"==typeof exports&&\"object\"==typeof module?b(require(\"../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../lib/codemirror\"],b):b(CodeMirror)})(function(b){b.modeInfo=[{name:\"APL\",mime:\"text/apl\",mode:\"apl\",ext:[\"dyalog\",\"apl\"]},{name:\"PGP\",mimes:[\"application/pgp\",\"application/pgp-keys\",\"application/pgp-signature\"],mode:\"asciiarmor\",ext:[\"pgp\"]},{name:\"ASN.1\",mime:\"text/x-ttcn-asn\",mode:\"asn.1\",ext:[\"asn\",\"asn1\"]},{name:\"Asterisk\",mime:\"text/x-asterisk\",\nmode:\"asterisk\",file:/^extensions\\.conf$/i},{name:\"Brainfuck\",mime:\"text/x-brainfuck\",mode:\"brainfuck\",ext:[\"b\",\"bf\"]},{name:\"C\",mime:\"text/x-csrc\",mode:\"clike\",ext:[\"c\",\"h\"]},{name:\"C++\",mime:\"text/x-c++src\",mode:\"clike\",ext:\"cpp c++ cc cxx hpp h++ hh hxx\".split(\" \"),alias:[\"cpp\"]},{name:\"Cobol\",mime:\"text/x-cobol\",mode:\"cobol\",ext:[\"cob\",\"cpy\"]},{name:\"C#\",mime:\"text/x-csharp\",mode:\"clike\",ext:[\"cs\"],alias:[\"csharp\"]},{name:\"Clojure\",mime:\"text/x-clojure\",mode:\"clojure\",ext:[\"clj\",\"cljc\",\"cljx\"]},\n{name:\"ClojureScript\",mime:\"text/x-clojurescript\",mode:\"clojure\",ext:[\"cljs\"]},{name:\"Closure Stylesheets (GSS)\",mime:\"text/x-gss\",mode:\"css\",ext:[\"gss\"]},{name:\"CMake\",mime:\"text/x-cmake\",mode:\"cmake\",ext:[\"cmake\",\"cmake.in\"],file:/^CMakeLists.txt$/},{name:\"CoffeeScript\",mime:\"text/x-coffeescript\",mode:\"coffeescript\",ext:[\"coffee\"],alias:[\"coffee\",\"coffee-script\"]},{name:\"Common Lisp\",mime:\"text/x-common-lisp\",mode:\"commonlisp\",ext:[\"cl\",\"lisp\",\"el\"],alias:[\"lisp\"]},{name:\"Cypher\",mime:\"application/x-cypher-query\",\nmode:\"cypher\",ext:[\"cyp\",\"cypher\"]},{name:\"Cython\",mime:\"text/x-cython\",mode:\"python\",ext:[\"pyx\",\"pxd\",\"pxi\"]},{name:\"Crystal\",mime:\"text/x-crystal\",mode:\"crystal\",ext:[\"cr\"]},{name:\"CSS\",mime:\"text/css\",mode:\"css\",ext:[\"css\"]},{name:\"CQL\",mime:\"text/x-cassandra\",mode:\"sql\",ext:[\"cql\"]},{name:\"D\",mime:\"text/x-d\",mode:\"d\",ext:[\"d\"]},{name:\"Dart\",mimes:[\"application/dart\",\"text/x-dart\"],mode:\"dart\",ext:[\"dart\"]},{name:\"diff\",mime:\"text/x-diff\",mode:\"diff\",ext:[\"diff\",\"patch\"]},{name:\"Django\",mime:\"text/x-django\",\nmode:\"django\"},{name:\"Dockerfile\",mime:\"text/x-dockerfile\",mode:\"dockerfile\",file:/^Dockerfile$/},{name:\"DTD\",mime:\"application/xml-dtd\",mode:\"dtd\",ext:[\"dtd\"]},{name:\"Dylan\",mime:\"text/x-dylan\",mode:\"dylan\",ext:[\"dylan\",\"dyl\",\"intr\"]},{name:\"EBNF\",mime:\"text/x-ebnf\",mode:\"ebnf\"},{name:\"ECL\",mime:\"text/x-ecl\",mode:\"ecl\",ext:[\"ecl\"]},{name:\"edn\",mime:\"application/edn\",mode:\"clojure\",ext:[\"edn\"]},{name:\"Eiffel\",mime:\"text/x-eiffel\",mode:\"eiffel\",ext:[\"e\"]},{name:\"Elm\",mime:\"text/x-elm\",mode:\"elm\",ext:[\"elm\"]},\n{name:\"Embedded Javascript\",mime:\"application/x-ejs\",mode:\"htmlembedded\",ext:[\"ejs\"]},{name:\"Embedded Ruby\",mime:\"application/x-erb\",mode:\"htmlembedded\",ext:[\"erb\"]},{name:\"Erlang\",mime:\"text/x-erlang\",mode:\"erlang\",ext:[\"erl\"]},{name:\"Factor\",mime:\"text/x-factor\",mode:\"factor\",ext:[\"factor\"]},{name:\"FCL\",mime:\"text/x-fcl\",mode:\"fcl\"},{name:\"Forth\",mime:\"text/x-forth\",mode:\"forth\",ext:[\"forth\",\"fth\",\"4th\"]},{name:\"Fortran\",mime:\"text/x-fortran\",mode:\"fortran\",ext:[\"f\",\"for\",\"f77\",\"f90\"]},{name:\"F#\",\nmime:\"text/x-fsharp\",mode:\"mllike\",ext:[\"fs\"],alias:[\"fsharp\"]},{name:\"Gas\",mime:\"text/x-gas\",mode:\"gas\",ext:[\"s\"]},{name:\"Gherkin\",mime:\"text/x-feature\",mode:\"gherkin\",ext:[\"feature\"]},{name:\"GitHub Flavored Markdown\",mime:\"text/x-gfm\",mode:\"gfm\",file:/^(readme|contributing|history).md$/i},{name:\"Go\",mime:\"text/x-go\",mode:\"go\",ext:[\"go\"]},{name:\"Groovy\",mime:\"text/x-groovy\",mode:\"groovy\",ext:[\"groovy\",\"gradle\"],file:/^Jenkinsfile$/},{name:\"HAML\",mime:\"text/x-haml\",mode:\"haml\",ext:[\"haml\"]},{name:\"Haskell\",\nmime:\"text/x-haskell\",mode:\"haskell\",ext:[\"hs\"]},{name:\"Haskell (Literate)\",mime:\"text/x-literate-haskell\",mode:\"haskell-literate\",ext:[\"lhs\"]},{name:\"Haxe\",mime:\"text/x-haxe\",mode:\"haxe\",ext:[\"hx\"]},{name:\"HXML\",mime:\"text/x-hxml\",mode:\"haxe\",ext:[\"hxml\"]},{name:\"ASP.NET\",mime:\"application/x-aspx\",mode:\"htmlembedded\",ext:[\"aspx\"],alias:[\"asp\",\"aspx\"]},{name:\"HTML\",mime:\"text/html\",mode:\"htmlmixed\",ext:[\"html\",\"htm\"],alias:[\"xhtml\"]},{name:\"HTTP\",mime:\"message/http\",mode:\"http\"},{name:\"IDL\",mime:\"text/x-idl\",\nmode:\"idl\",ext:[\"pro\"]},{name:\"Pug\",mime:\"text/x-pug\",mode:\"pug\",ext:[\"jade\",\"pug\"],alias:[\"jade\"]},{name:\"Java\",mime:\"text/x-java\",mode:\"clike\",ext:[\"java\"]},{name:\"Java Server Pages\",mime:\"application/x-jsp\",mode:\"htmlembedded\",ext:[\"jsp\"],alias:[\"jsp\"]},{name:\"JavaScript\",mimes:[\"text/javascript\",\"text/ecmascript\",\"application/javascript\",\"application/x-javascript\",\"application/ecmascript\"],mode:\"javascript\",ext:[\"js\"],alias:[\"ecmascript\",\"js\",\"node\"]},{name:\"JSON\",mimes:[\"application/json\",\"application/x-json\"],\nmode:\"javascript\",ext:[\"json\",\"map\"],alias:[\"json5\"]},{name:\"JSON-LD\",mime:\"application/ld+json\",mode:\"javascript\",ext:[\"jsonld\"],alias:[\"jsonld\"]},{name:\"JSX\",mime:\"text/jsx\",mode:\"jsx\",ext:[\"jsx\"]},{name:\"Jinja2\",mime:\"null\",mode:\"jinja2\"},{name:\"Julia\",mime:\"text/x-julia\",mode:\"julia\",ext:[\"jl\"]},{name:\"Kotlin\",mime:\"text/x-kotlin\",mode:\"clike\",ext:[\"kt\"]},{name:\"LESS\",mime:\"text/x-less\",mode:\"css\",ext:[\"less\"]},{name:\"LiveScript\",mime:\"text/x-livescript\",mode:\"livescript\",ext:[\"ls\"],alias:[\"ls\"]},\n{name:\"Lua\",mime:\"text/x-lua\",mode:\"lua\",ext:[\"lua\"]},{name:\"Markdown\",mime:\"text/x-markdown\",mode:\"markdown\",ext:[\"markdown\",\"md\",\"mkd\"]},{name:\"mIRC\",mime:\"text/mirc\",mode:\"mirc\"},{name:\"MariaDB SQL\",mime:\"text/x-mariadb\",mode:\"sql\"},{name:\"Mathematica\",mime:\"text/x-mathematica\",mode:\"mathematica\",ext:[\"m\",\"nb\"]},{name:\"Modelica\",mime:\"text/x-modelica\",mode:\"modelica\",ext:[\"mo\"]},{name:\"MUMPS\",mime:\"text/x-mumps\",mode:\"mumps\",ext:[\"mps\"]},{name:\"MS SQL\",mime:\"text/x-mssql\",mode:\"sql\"},{name:\"mbox\",\nmime:\"application/mbox\",mode:\"mbox\",ext:[\"mbox\"]},{name:\"MySQL\",mime:\"text/x-mysql\",mode:\"sql\"},{name:\"Nginx\",mime:\"text/x-nginx-conf\",mode:\"nginx\",file:/nginx.*\\.conf$/i},{name:\"NSIS\",mime:\"text/x-nsis\",mode:\"nsis\",ext:[\"nsh\",\"nsi\"]},{name:\"NTriples\",mime:\"text/n-triples\",mode:\"ntriples\",ext:[\"nt\"]},{name:\"Objective C\",mime:\"text/x-objectivec\",mode:\"clike\",ext:[\"m\",\"mm\"],alias:[\"objective-c\",\"objc\"]},{name:\"OCaml\",mime:\"text/x-ocaml\",mode:\"mllike\",ext:[\"ml\",\"mli\",\"mll\",\"mly\"]},{name:\"Octave\",mime:\"text/x-octave\",\nmode:\"octave\",ext:[\"m\"]},{name:\"Oz\",mime:\"text/x-oz\",mode:\"oz\",ext:[\"oz\"]},{name:\"Pascal\",mime:\"text/x-pascal\",mode:\"pascal\",ext:[\"p\",\"pas\"]},{name:\"PEG.js\",mime:\"null\",mode:\"pegjs\",ext:[\"jsonld\"]},{name:\"Perl\",mime:\"text/x-perl\",mode:\"perl\",ext:[\"pl\",\"pm\"]},{name:\"PHP\",mime:\"application/x-httpd-php\",mode:\"php\",ext:[\"php\",\"php3\",\"php4\",\"php5\",\"phtml\"]},{name:\"Pig\",mime:\"text/x-pig\",mode:\"pig\",ext:[\"pig\"]},{name:\"Plain Text\",mime:\"text/plain\",mode:\"null\",ext:\"txt text conf def list log\".split(\" \")},\n{name:\"PLSQL\",mime:\"text/x-plsql\",mode:\"sql\",ext:[\"pls\"]},{name:\"PowerShell\",mime:\"application/x-powershell\",mode:\"powershell\",ext:[\"ps1\",\"psd1\",\"psm1\"]},{name:\"Properties files\",mime:\"text/x-properties\",mode:\"properties\",ext:[\"properties\",\"ini\",\"in\"],alias:[\"ini\",\"properties\"]},{name:\"ProtoBuf\",mime:\"text/x-protobuf\",mode:\"protobuf\",ext:[\"proto\"]},{name:\"Python\",mime:\"text/x-python\",mode:\"python\",ext:[\"BUILD\",\"bzl\",\"py\",\"pyw\"],file:/^(BUCK|BUILD)$/},{name:\"Puppet\",mime:\"text/x-puppet\",mode:\"puppet\",\next:[\"pp\"]},{name:\"Q\",mime:\"text/x-q\",mode:\"q\",ext:[\"q\"]},{name:\"R\",mime:\"text/x-rsrc\",mode:\"r\",ext:[\"r\"],alias:[\"rscript\"]},{name:\"reStructuredText\",mime:\"text/x-rst\",mode:\"rst\",ext:[\"rst\"],alias:[\"rst\"]},{name:\"RPM Changes\",mime:\"text/x-rpm-changes\",mode:\"rpm\"},{name:\"RPM Spec\",mime:\"text/x-rpm-spec\",mode:\"rpm\",ext:[\"spec\"]},{name:\"Ruby\",mime:\"text/x-ruby\",mode:\"ruby\",ext:[\"rb\"],alias:[\"jruby\",\"macruby\",\"rake\",\"rb\",\"rbx\"]},{name:\"Rust\",mime:\"text/x-rustsrc\",mode:\"rust\",ext:[\"rs\"]},{name:\"SAS\",mime:\"text/x-sas\",\nmode:\"sas\",ext:[\"sas\"]},{name:\"Sass\",mime:\"text/x-sass\",mode:\"sass\",ext:[\"sass\"]},{name:\"Scala\",mime:\"text/x-scala\",mode:\"clike\",ext:[\"scala\"]},{name:\"Scheme\",mime:\"text/x-scheme\",mode:\"scheme\",ext:[\"scm\",\"ss\"]},{name:\"SCSS\",mime:\"text/x-scss\",mode:\"css\",ext:[\"scss\"]},{name:\"Shell\",mime:\"text/x-sh\",mode:\"shell\",ext:[\"sh\",\"ksh\",\"bash\"],alias:[\"bash\",\"sh\",\"zsh\"],file:/^PKGBUILD$/},{name:\"Sieve\",mime:\"application/sieve\",mode:\"sieve\",ext:[\"siv\",\"sieve\"]},{name:\"Slim\",mimes:[\"text/x-slim\",\"application/x-slim\"],\nmode:\"slim\",ext:[\"slim\"]},{name:\"Smalltalk\",mime:\"text/x-stsrc\",mode:\"smalltalk\",ext:[\"st\"]},{name:\"Smarty\",mime:\"text/x-smarty\",mode:\"smarty\",ext:[\"tpl\"]},{name:\"Solr\",mime:\"text/x-solr\",mode:\"solr\"},{name:\"Soy\",mime:\"text/x-soy\",mode:\"soy\",ext:[\"soy\"],alias:[\"closure template\"]},{name:\"SPARQL\",mime:\"application/sparql-query\",mode:\"sparql\",ext:[\"rq\",\"sparql\"],alias:[\"sparul\"]},{name:\"Spreadsheet\",mime:\"text/x-spreadsheet\",mode:\"spreadsheet\",alias:[\"excel\",\"formula\"]},{name:\"SQL\",mime:\"text/x-sql\",\nmode:\"sql\",ext:[\"sql\"]},{name:\"Squirrel\",mime:\"text/x-squirrel\",mode:\"clike\",ext:[\"nut\"]},{name:\"Swift\",mime:\"text/x-swift\",mode:\"swift\",ext:[\"swift\"]},{name:\"sTeX\",mime:\"text/x-stex\",mode:\"stex\"},{name:\"LaTeX\",mime:\"text/x-latex\",mode:\"stex\",ext:[\"text\",\"ltx\"],alias:[\"tex\"]},{name:\"SystemVerilog\",mime:\"text/x-systemverilog\",mode:\"verilog\",ext:[\"v\"]},{name:\"Tcl\",mime:\"text/x-tcl\",mode:\"tcl\",ext:[\"tcl\"]},{name:\"Textile\",mime:\"text/x-textile\",mode:\"textile\",ext:[\"textile\"]},{name:\"TiddlyWiki \",mime:\"text/x-tiddlywiki\",\nmode:\"tiddlywiki\"},{name:\"Tiki wiki\",mime:\"text/tiki\",mode:\"tiki\"},{name:\"TOML\",mime:\"text/x-toml\",mode:\"toml\",ext:[\"toml\"]},{name:\"Tornado\",mime:\"text/x-tornado\",mode:\"tornado\"},{name:\"troff\",mime:\"text/troff\",mode:\"troff\",ext:\"123456789\".split(\"\")},{name:\"TTCN\",mime:\"text/x-ttcn\",mode:\"ttcn\",ext:[\"ttcn\",\"ttcn3\",\"ttcnpp\"]},{name:\"TTCN_CFG\",mime:\"text/x-ttcn-cfg\",mode:\"ttcn-cfg\",ext:[\"cfg\"]},{name:\"Turtle\",mime:\"text/turtle\",mode:\"turtle\",ext:[\"ttl\"]},{name:\"TypeScript\",mime:\"application/typescript\",\nmode:\"javascript\",ext:[\"ts\"],alias:[\"ts\"]},{name:\"Twig\",mime:\"text/x-twig\",mode:\"twig\"},{name:\"Web IDL\",mime:\"text/x-webidl\",mode:\"webidl\",ext:[\"webidl\"]},{name:\"VB.NET\",mime:\"text/x-vb\",mode:\"vb\",ext:[\"vb\"]},{name:\"VBScript\",mime:\"text/vbscript\",mode:\"vbscript\",ext:[\"vbs\"]},{name:\"Velocity\",mime:\"text/velocity\",mode:\"velocity\",ext:[\"vtl\"]},{name:\"Verilog\",mime:\"text/x-verilog\",mode:\"verilog\",ext:[\"v\"]},{name:\"VHDL\",mime:\"text/x-vhdl\",mode:\"vhdl\",ext:[\"vhd\",\"vhdl\"]},{name:\"XML\",mimes:[\"application/xml\",\n\"text/xml\"],mode:\"xml\",ext:[\"xml\",\"xsl\",\"xsd\"],alias:[\"rss\",\"wsdl\",\"xsd\"]},{name:\"XQuery\",mime:\"application/xquery\",mode:\"xquery\",ext:[\"xy\",\"xquery\"]},{name:\"Yacas\",mime:\"text/x-yacas\",mode:\"yacas\",ext:[\"ys\"]},{name:\"YAML\",mime:\"text/x-yaml\",mode:\"yaml\",ext:[\"yaml\",\"yml\"],alias:[\"yml\"]},{name:\"Z80\",mime:\"text/x-z80\",mode:\"z80\",ext:[\"z80\"]},{name:\"mscgen\",mime:\"text/x-mscgen\",mode:\"mscgen\",ext:[\"mscgen\",\"mscin\",\"msc\"]},{name:\"xu\",mime:\"text/x-xu\",mode:\"mscgen\",ext:[\"xu\"]},{name:\"msgenny\",mime:\"text/x-msgenny\",\nmode:\"mscgen\",ext:[\"msgenny\"]}];for(var f=0;f<b.modeInfo.length;f++){var g=b.modeInfo[f];g.mimes&&(g.mime=g.mimes[0])}b.findModeByMIME=function(c){c=c.toLowerCase();for(var d=0;d<b.modeInfo.length;d++){var a=b.modeInfo[d];if(a.mime==c)return a;if(a.mimes)for(var e=0;e<a.mimes.length;e++)if(a.mimes[e]==c)return a}};b.findModeByExtension=function(c){for(var d=0;d<b.modeInfo.length;d++){var a=b.modeInfo[d];if(a.ext)for(var e=0;e<a.ext.length;e++)if(a.ext[e]==c)return a}};b.findModeByFileName=function(c){for(var d=\n0;d<b.modeInfo.length;d++){var a=b.modeInfo[d];if(a.file&&a.file.test(c))return a}d=c.lastIndexOf(\".\");if(c=-1<d&&c.substring(d+1,c.length))return b.findModeByExtension(c)};b.findModeByName=function(c){c=c.toLowerCase();for(var d=0;d<b.modeInfo.length;d++){var a=b.modeInfo[d];if(a.name.toLowerCase()==c)return a;if(a.alias)for(var e=0;e<a.alias.length;e++)if(a.alias[e].toLowerCase()==c)return a}}});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/mirc/mirc.js",
    "content": "'use strict';(function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],e):e(CodeMirror)})(function(e){e.defineMIME(\"text/mirc\",\"mirc\");e.defineMode(\"mirc\",function(){function e(a){var b={};a=a.split(\" \");for(var d=0;d<a.length;++d)b[a[d]]=!0;return b}function f(a,b){var d=b.beforeParams;b.beforeParams=!1;var c=a.next();if(/[\\[\\]{}\\(\\),\\.]/.test(c))return\"(\"==c&&d?b.inParams=!0:\")\"==c&&(b.inParams=\n!1),null;if(/\\d/.test(c))return a.eatWhile(/[\\w\\.]/),\"number\";if(\"\\\\\"==c)return a.eat(\"\\\\\"),a.eat(/./),\"number\";if(\"/\"==c&&a.eat(\"*\"))return d=m,b.tokenize=d,d(a,b);if(\";\"==c&&a.match(/ *\\( *\\(/))return d=n,b.tokenize=d,d(a,b);if(\";\"!=c||b.inParams){if('\"'==c)return a.eat(/\"/),\"keyword\";if(\"$\"==c){a.eatWhile(/[$_a-z0-9A-Z\\.:]/);if(g&&g.propertyIsEnumerable(a.current().toLowerCase()))return\"keyword\";b.beforeParams=!0;return\"builtin\"}if(\"%\"==c)return a.eatWhile(/[^,^\\s^\\(^\\)]/),b.beforeParams=!0,\"string\";\nif(h.test(c))return a.eatWhile(h),\"operator\";a.eatWhile(/[\\w\\$_{}]/);a=a.current().toLowerCase();return k&&k.propertyIsEnumerable(a)?\"keyword\":l&&l.propertyIsEnumerable(a)?(b.beforeParams=!0,\"keyword\"):null}a.skipToEnd();return\"comment\"}function m(a,b){for(var d=!1,c;c=a.next();){if(\"/\"==c&&d){b.tokenize=f;break}d=\"*\"==c}return\"comment\"}function n(a,b){for(var d=0,c;c=a.next();){if(\";\"==c&&2==d){b.tokenize=f;break}\")\"==c?d++:\" \"!=c&&(d=0)}return\"meta\"}var g=e(\"$! $$ $& $? $+ $abook $abs $active $activecid $activewid $address $addtok $agent $agentname $agentstat $agentver $alias $and $anick $ansi2mirc $aop $appactive $appstate $asc $asctime $asin $atan $avoice $away $awaymsg $awaytime $banmask $base $bfind $binoff $biton $bnick $bvar $bytes $calc $cb $cd $ceil $chan $chanmodes $chantypes $chat $chr $cid $clevel $click $cmdbox $cmdline $cnick $color $com $comcall $comchan $comerr $compact $compress $comval $cos $count $cr $crc $creq $crlf $ctime $ctimer $ctrlenter $date $day $daylight $dbuh $dbuw $dccignore $dccport $dde $ddename $debug $decode $decompress $deltok $devent $dialog $did $didreg $didtok $didwm $disk $dlevel $dll $dllcall $dname $dns $duration $ebeeps $editbox $emailaddr $encode $error $eval $event $exist $feof $ferr $fgetc $file $filename $filtered $finddir $finddirn $findfile $findfilen $findtok $fline $floor $fopen $fread $fserve $fulladdress $fulldate $fullname $fullscreen $get $getdir $getdot $gettok $gmt $group $halted $hash $height $hfind $hget $highlight $hnick $hotline $hotlinepos $ial $ialchan $ibl $idle $iel $ifmatch $ignore $iif $iil $inelipse $ini $inmidi $inpaste $inpoly $input $inrect $inroundrect $insong $instok $int $inwave $ip $isalias $isbit $isdde $isdir $isfile $isid $islower $istok $isupper $keychar $keyrpt $keyval $knick $lactive $lactivecid $lactivewid $left $len $level $lf $line $lines $link $lock $lock $locked $log $logstamp $logstampfmt $longfn $longip $lower $ltimer $maddress $mask $matchkey $matchtok $md5 $me $menu $menubar $menucontext $menutype $mid $middir $mircdir $mircexe $mircini $mklogfn $mnick $mode $modefirst $modelast $modespl $mouse $msfile $network $newnick $nick $nofile $nopath $noqt $not $notags $notify $null $numeric $numok $oline $onpoly $opnick $or $ord $os $passivedcc $pic $play $pnick $port $portable $portfree $pos $prefix $prop $protect $puttok $qt $query $rand $r $rawmsg $read $readomo $readn $regex $regml $regsub $regsubex $remove $remtok $replace $replacex $reptok $result $rgb $right $round $scid $scon $script $scriptdir $scriptline $sdir $send $server $serverip $sfile $sha1 $shortfn $show $signal $sin $site $sline $snick $snicks $snotify $sock $sockbr $sockerr $sockname $sorttok $sound $sqrt $ssl $sreq $sslready $status $strip $str $stripped $syle $submenu $switchbar $tan $target $ticks $time $timer $timestamp $timestampfmt $timezone $tip $titlebar $toolbar $treebar $trust $ulevel $ulist $upper $uptime $url $usermode $v1 $v2 $var $vcmd $vcmdstat $vcmdver $version $vnick $vol $wid $width $wildsite $wildtok $window $wrap $xor\"),\nk=e(\"abook ajinvite alias aline ame amsg anick aop auser autojoin avoice away background ban bcopy beep bread break breplace bset btrunc bunset bwrite channel clear clearall cline clipboard close cnick color comclose comopen comreg continue copy creq ctcpreply ctcps dcc dccserver dde ddeserver debug dec describe dialog did didtok disable disconnect dlevel dline dll dns dqwindow drawcopy drawdot drawfill drawline drawpic drawrect drawreplace drawrot drawsave drawscroll drawtext ebeeps echo editbox emailaddr enable events exit fclose filter findtext finger firewall flash flist flood flush flushini font fopen fseek fsend fserve fullname fwrite ghide gload gmove gopts goto gplay gpoint gqreq groups gshow gsize gstop gtalk gunload hadd halt haltdef hdec hdel help hfree hinc hload hmake hop hsave ial ialclear ialmark identd if ignore iline inc invite iuser join kick linesep links list load loadbuf localinfo log mdi me menubar mkdir mnick mode msg nick noop notice notify omsg onotice part partall pdcc perform play playctrl pop protect pvoice qme qmsg query queryn quit raw reload remini remote remove rename renwin reseterror resetidle return rlevel rline rmdir run ruser save savebuf saveini say scid scon server set showmirc signam sline sockaccept sockclose socklist socklisten sockmark sockopen sockpause sockread sockrename sockudp sockwrite sound speak splay sreq strip switchbar timer timestamp titlebar tnick tokenize toolbar topic tray treebar ulist unload unset unsetall updatenl url uwho var vcadd vcmd vcrem vol while whois window winhelp write writeint if isalnum isalpha isaop isavoice isban ischan ishop isignore isin isincs isletter islower isnotify isnum ison isop isprotect isreg isupper isvoice iswm iswmcs elseif else goto menu nicklist status title icon size option text edit button check radio box scroll list combo link tab item\"),\nl=e(\"if elseif else and not or eq ne in ni for foreach while switch\"),h=/[+\\-*&%=<>!?^\\/\\|]/;return{startState:function(){return{tokenize:f,beforeParams:!1,inParams:!1}},token:function(a,b){return a.eatSpace()?null:b.tokenize(a,b)}}})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/mllike/mllike.js",
    "content": "'use strict';(function(b){\"object\"==typeof exports&&\"object\"==typeof module?b(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],b):b(CodeMirror)})(function(b){b.defineMode(\"mllike\",function(b,e){function f(a,c){var d=a.next();if('\"'===d)return c.tokenize=k,c.tokenize(a,c);if(\"(\"===d&&a.eat(\"*\"))return c.commentLevel++,c.tokenize=l,c.tokenize(a,c);if(\"~\"===d)return a.eatWhile(/\\w/),\"variable-2\";if(\"`\"===d)return a.eatWhile(/\\w/),\"quote\";if(\"/\"===\nd&&e.slashComments&&a.eat(\"/\"))return a.skipToEnd(),\"comment\";if(/\\d/.test(d))return a.eatWhile(/[\\d]/),a.eat(\".\")&&a.eatWhile(/[\\d]/),\"number\";if(/[+\\-*&%=<>!?|]/.test(d))return\"operator\";a.eatWhile(/\\w/);a=a.current();return g.hasOwnProperty(a)?g[a]:\"variable\"}function k(a,c){for(var d,b=!1,e=!1;null!=(d=a.next());){if('\"'===d&&!e){b=!0;break}e=!e&&\"\\\\\"===d}b&&!e&&(c.tokenize=f);return\"string\"}function l(a,c){for(var d,b;0<c.commentLevel&&null!=(b=a.next());)\"(\"===d&&\"*\"===b&&c.commentLevel++,\"*\"===\nd&&\")\"===b&&c.commentLevel--,d=b;0>=c.commentLevel&&(c.tokenize=f);return\"comment\"}var g={let:\"keyword\",rec:\"keyword\",\"in\":\"keyword\",of:\"keyword\",and:\"keyword\",\"if\":\"keyword\",then:\"keyword\",\"else\":\"keyword\",\"for\":\"keyword\",to:\"keyword\",\"while\":\"keyword\",\"do\":\"keyword\",done:\"keyword\",fun:\"keyword\",\"function\":\"keyword\",val:\"keyword\",type:\"keyword\",mutable:\"keyword\",match:\"keyword\",\"with\":\"keyword\",\"try\":\"keyword\",open:\"builtin\",ignore:\"builtin\",begin:\"keyword\",end:\"keyword\"};b=e.extraWords||{};for(var h in b)b.hasOwnProperty(h)&&\n(g[h]=e.extraWords[h]);return{startState:function(){return{tokenize:f,commentLevel:0}},token:function(a,b){return a.eatSpace()?null:b.tokenize(a,b)},blockCommentStart:\"(*\",blockCommentEnd:\"*)\",lineComment:e.slashComments?\"//\":null}});b.defineMIME(\"text/x-ocaml\",{name:\"mllike\",extraWords:{succ:\"keyword\",trace:\"builtin\",exit:\"builtin\",print_string:\"builtin\",print_endline:\"builtin\",\"true\":\"atom\",\"false\":\"atom\",raise:\"keyword\"}});b.defineMIME(\"text/x-fsharp\",{name:\"mllike\",extraWords:{\"abstract\":\"keyword\",\nas:\"keyword\",assert:\"keyword\",base:\"keyword\",\"class\":\"keyword\",\"default\":\"keyword\",delegate:\"keyword\",downcast:\"keyword\",downto:\"keyword\",elif:\"keyword\",exception:\"keyword\",extern:\"keyword\",\"finally\":\"keyword\",global:\"keyword\",inherit:\"keyword\",inline:\"keyword\",\"interface\":\"keyword\",internal:\"keyword\",lazy:\"keyword\",\"let!\":\"keyword\",member:\"keyword\",module:\"keyword\",namespace:\"keyword\",\"new\":\"keyword\",\"null\":\"keyword\",override:\"keyword\",\"private\":\"keyword\",\"public\":\"keyword\",\"return\":\"keyword\",\"return!\":\"keyword\",\nselect:\"keyword\",\"static\":\"keyword\",struct:\"keyword\",upcast:\"keyword\",use:\"keyword\",\"use!\":\"keyword\",val:\"keyword\",when:\"keyword\",yield:\"keyword\",\"yield!\":\"keyword\",List:\"builtin\",Seq:\"builtin\",Map:\"builtin\",Set:\"builtin\",\"int\":\"builtin\",string:\"builtin\",raise:\"builtin\",failwith:\"builtin\",not:\"builtin\",\"true\":\"builtin\",\"false\":\"builtin\"},slashComments:!0})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/modelica/modelica.js",
    "content": "'use strict';(function(g){\"object\"==typeof exports&&\"object\"==typeof module?g(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],g):g(CodeMirror)})(function(g){function e(c){var d={};c=c.split(\" \");for(var f=0;f<c.length;++f)d[c[f]]=!0;return d}g.defineMode(\"modelica\",function(c,d){function f(a,b){a.skipToEnd();b.tokenize=null;return\"comment\"}function n(a,b){for(var l=!1,c;c=a.next();){if(l&&\"/\"==c){b.tokenize=null;break}l=\"*\"==c}return\"comment\"}\nfunction k(a,b){for(var c=!1,d;null!=(d=a.next());){if('\"'==d&&!c){b.tokenize=null;b.sol=!1;break}c=!c&&\"\\\\\"==d}return\"string\"}function p(a,b){for(a.eatWhile(h);a.eat(h)||a.eat(m););a=a.current();!b.sol||\"package\"!=a&&\"model\"!=a&&\"when\"!=a&&\"connector\"!=a?b.sol&&\"end\"==a&&0<b.level&&b.level--:b.level++;b.tokenize=null;b.sol=!1;return q.propertyIsEnumerable(a)?\"keyword\":r.propertyIsEnumerable(a)?\"builtin\":t.propertyIsEnumerable(a)?\"atom\":\"variable\"}function u(a,b){for(;a.eat(/[^']/););b.tokenize=null;\nb.sol=!1;return a.eat(\"'\")?\"variable\":\"error\"}function e(a,b){a.eatWhile(h);a.eat(\".\")&&a.eatWhile(h);if(a.eat(\"e\")||a.eat(\"E\"))a.eat(\"-\")||a.eat(\"+\"),a.eatWhile(h);b.tokenize=null;b.sol=!1;return\"number\"}var v=c.indentUnit,q=d.keywords||{},r=d.builtin||{},t=d.atoms||{},w=/[;=\\(:\\),{}.*<>+\\-\\/^\\[\\]]/,x=/(:=|<=|>=|==|<>|\\.\\+|\\.\\-|\\.\\*|\\.\\/|\\.\\^)/,h=/[0-9]/,m=/[_a-zA-Z]/;return{startState:function(){return{tokenize:null,level:0,sol:!0}},token:function(a,b){if(null!=b.tokenize)return b.tokenize(a,b);\na.sol()&&(b.sol=!0);if(a.eatSpace())return b.tokenize=null;var c=a.next();if(\"/\"==c&&a.eat(\"/\"))b.tokenize=f;else if(\"/\"==c&&a.eat(\"*\"))b.tokenize=n;else{if(x.test(c+a.peek()))return a.next(),b.tokenize=null,\"operator\";if(w.test(c))return b.tokenize=null,\"operator\";if(m.test(c))b.tokenize=p;else if(\"'\"==c&&a.peek()&&\"'\"!=a.peek())b.tokenize=u;else if('\"'==c)b.tokenize=k;else if(h.test(c))b.tokenize=e;else return b.tokenize=null,\"error\"}return b.tokenize(a,b)},indent:function(a,b){if(null!=a.tokenize)return g.Pass;\na=a.level;/(algorithm)/.test(b)&&a--;/(equation)/.test(b)&&a--;/(initial algorithm)/.test(b)&&a--;/(initial equation)/.test(b)&&a--;/(end)/.test(b)&&a--;return 0<a?v*a:0},blockCommentStart:\"/*\",blockCommentEnd:\"*/\",lineComment:\"//\"}});(function(c,d){function f(c){if(c)for(var d in c)c.hasOwnProperty(d)&&e.push(d)}\"string\"==typeof c&&(c=[c]);var e=[];f(d.keywords);f(d.builtin);f(d.atoms);e.length&&(d.helperType=c[0],g.registerHelper(\"hintWords\",c[0],e));for(var k=0;k<c.length;++k)g.defineMIME(c[k],\nd)})([\"text/x-modelica\"],{name:\"modelica\",keywords:e(\"algorithm and annotation assert block break class connect connector constant constrainedby der discrete each else elseif elsewhen encapsulated end enumeration equation expandable extends external false final flow for function if import impure in initial inner input loop model not operator or outer output package parameter partial protected public pure record redeclare replaceable return stream then true type when while within\"),builtin:e(\"abs acos actualStream asin atan atan2 cardinality ceil cos cosh delay div edge exp floor getInstanceName homotopy inStream integer log log10 mod pre reinit rem semiLinear sign sin sinh spatialDistribution sqrt tan tanh\"),\natoms:e(\"Real Boolean Integer String\")})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/mscgen/mscgen.js",
    "content": "'use strict';(function(c){\"object\"==typeof exports&&\"object\"==typeof module?c(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],c):c(CodeMirror)})(function(c){function d(a){return new RegExp(\"\\\\b(\"+a.join(\"|\")+\")\\\\b\",\"i\")}function e(a){return new RegExp(\"(\"+a.join(\"|\")+\")\",\"i\")}function f(){return{inComment:!1,inString:!1,inAttributeList:!1,inScript:!1}}function g(a){return{inComment:a.inComment,inString:a.inString,inAttributeList:a.inAttributeList,\ninScript:a.inScript}}function h(a){return function(b,c){if(b.match(e(a.brackets),!0,!0))return\"bracket\";if(!c.inComment){if(b.match(/\\/\\*[^\\*\\/]*/,!0,!0))return c.inComment=!0,\"comment\";if(b.match(e(a.singlecomment),!0,!0))return b.skipToEnd(),\"comment\"}if(c.inComment)return b.match(/[^\\*\\/]*\\*\\//,!0,!0)?c.inComment=!1:b.skipToEnd(),\"comment\";if(!c.inString&&b.match(/\\\"(\\\\\\\"|[^\\\"])*/,!0,!0))return c.inString=!0,\"string\";if(c.inString)return b.match(/[^\\\"]*\\\"/,!0,!0)?c.inString=!1:b.skipToEnd(),\"string\";\nif(a.keywords&&b.match(d(a.keywords),!0,!0)||b.match(d(a.options),!0,!0)||b.match(d(a.arcsWords),!0,!0)||b.match(e(a.arcsOthers),!0,!0))return\"keyword\";if(a.operators&&b.match(e(a.operators),!0,!0))return\"operator\";if(!a.inAttributeList&&a.attributes&&b.match(/\\[/,!0,!0))return a.inAttributeList=!0,\"bracket\";if(a.inAttributeList){if(null!==a.attributes&&b.match(d(a.attributes),!0,!0))return\"attribute\";if(b.match(/]/,!0,!0))return a.inAttributeList=!1,\"bracket\"}b.next();return\"base\"}}var k={mscgen:{keywords:[\"msc\"],\noptions:[\"hscale\",\"width\",\"arcgradient\",\"wordwraparcs\"],attributes:\"label idurl id url linecolor linecolour textcolor textcolour textbgcolor textbgcolour arclinecolor arclinecolour arctextcolor arctextcolour arctextbgcolor arctextbgcolour arcskip\".split(\" \"),brackets:[\"\\\\{\",\"\\\\}\"],arcsWords:[\"note\",\"abox\",\"rbox\",\"box\"],arcsOthers:\"\\\\|\\\\|\\\\| \\\\.\\\\.\\\\. --- -- <-> == <<=>> <=> \\\\.\\\\. <<>> :: <:> -> =>> => >> :> <- <<= <= << <: x- -x\".split(\" \"),singlecomment:[\"//\",\"#\"],operators:[\"=\"]},xu:{keywords:[\"msc\"],\noptions:[\"hscale\",\"width\",\"arcgradient\",\"wordwraparcs\",\"watermark\"],attributes:\"label idurl id url linecolor linecolour textcolor textcolour textbgcolor textbgcolour arclinecolor arclinecolour arctextcolor arctextcolour arctextbgcolor arctextbgcolour arcskip\".split(\" \"),brackets:[\"\\\\{\",\"\\\\}\"],arcsWords:\"note abox rbox box alt else opt break par seq strict neg critical ignore consider assert loop ref exc\".split(\" \"),arcsOthers:\"\\\\|\\\\|\\\\| \\\\.\\\\.\\\\. --- -- <-> == <<=>> <=> \\\\.\\\\. <<>> :: <:> -> =>> => >> :> <- <<= <= << <: x- -x\".split(\" \"),\nsinglecomment:[\"//\",\"#\"],operators:[\"=\"]},msgenny:{keywords:null,options:[\"hscale\",\"width\",\"arcgradient\",\"wordwraparcs\",\"watermark\"],attributes:null,brackets:[\"\\\\{\",\"\\\\}\"],arcsWords:\"note abox rbox box alt else opt break par seq strict neg critical ignore consider assert loop ref exc\".split(\" \"),arcsOthers:\"\\\\|\\\\|\\\\| \\\\.\\\\.\\\\. --- -- <-> == <<=>> <=> \\\\.\\\\. <<>> :: <:> -> =>> => >> :> <- <<= <= << <: x- -x\".split(\" \"),singlecomment:[\"//\",\"#\"],operators:[\"=\"]}};c.defineMode(\"mscgen\",function(a,b){return{startState:f,\ncopyState:g,token:h(k[b&&b.language||\"mscgen\"]),lineComment:\"#\",blockCommentStart:\"/*\",blockCommentEnd:\"*/\"}});c.defineMIME(\"text/x-mscgen\",\"mscgen\");c.defineMIME(\"text/x-xu\",{name:\"mscgen\",language:\"xu\"});c.defineMIME(\"text/x-msgenny\",{name:\"mscgen\",language:\"msgenny\"})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/mumps/mumps.js",
    "content": "'use strict';(function(d){\"object\"==typeof exports&&\"object\"==typeof module?d(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],d):d(CodeMirror)})(function(d){d.defineMode(\"mumps\",function(){function d(a){return new RegExp(\"^((\"+a.join(\")|(\")+\"))\\\\b\",\"i\")}function e(a,b){a.sol()&&(b.label=!0,b.commandMode=0);var c=a.peek();if(\" \"==c||\"\\t\"==c)if(b.label=!1,0==b.commandMode)b.commandMode=1;else{if(0>b.commandMode||2==b.commandMode)b.commandMode=0}else\".\"!=\nc&&0<b.commandMode&&(b.commandMode=\":\"==c?-1:2);if(\"(\"===c||\"\\t\"===c)b.label=!1;if(\";\"===c)return a.skipToEnd(),\"comment\";if(a.match(/^[-+]?\\d+(\\.\\d+)?([eE][-+]?\\d+)?/))return\"number\";if('\"'==c){if(a.skipTo('\"'))return a.next(),\"string\";a.skipToEnd();return\"error\"}if(a.match(f)||a.match(g))return\"operator\";if(a.match(h))return null;if(k.test(c))return a.next(),\"bracket\";if(0<b.commandMode&&a.match(l))return\"variable-2\";if(a.match(m))return\"builtin\";if(a.match(n))return\"variable\";if(\"$\"===c||\"^\"===\nc)return a.next(),\"builtin\";if(\"@\"===c)return a.next(),\"string-2\";if(/[\\w%]/.test(c))return a.eatWhile(/[\\w%]/),\"variable\";a.next();return\"error\"}var g=/^[\\+\\-\\*/&#!_?\\\\<>=\\'\\[\\]]/,f=/^(('=)|(<=)|(>=)|('>)|('<)|([[)|(]])|(^$))/,h=/^[\\.,:]/,k=/[()]/,n=/^[%A-Za-z][A-Za-z0-9]*/,m=d(\"\\\\$ascii \\\\$char \\\\$data \\\\$ecode \\\\$estack \\\\$etrap \\\\$extract \\\\$find \\\\$fnumber \\\\$get \\\\$horolog \\\\$io \\\\$increment \\\\$job \\\\$justify \\\\$length \\\\$name \\\\$next \\\\$order \\\\$piece \\\\$qlength \\\\$qsubscript \\\\$query \\\\$quit \\\\$random \\\\$reverse \\\\$select \\\\$stack \\\\$test \\\\$text \\\\$translate \\\\$view \\\\$x \\\\$y \\\\$a \\\\$c \\\\$d \\\\$e \\\\$ec \\\\$es \\\\$et \\\\$f \\\\$fn \\\\$g \\\\$h \\\\$i \\\\$j \\\\$l \\\\$n \\\\$na \\\\$o \\\\$p \\\\$q \\\\$ql \\\\$qs \\\\$r \\\\$re \\\\$s \\\\$st \\\\$t \\\\$tr \\\\$v \\\\$z\".split(\" \")),\nl=d(\"break close do else for goto halt hang if job kill lock merge new open quit read set tcommit trollback tstart use view write xecute b c d e f g h i j k l m n o q r s tc tro ts u v w x\".split(\" \"));return{startState:function(){return{label:!1,commandMode:0}},token:function(a,b){a=e(a,b);return b.label?\"tag\":a}}});d.defineMIME(\"text/x-mumps\",\"mumps\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/nginx/nginx.js",
    "content": "'use strict';(function(d){\"object\"==typeof exports&&\"object\"==typeof module?d(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],d):d(CodeMirror)})(function(d){d.defineMode(\"nginx\",function(d){function k(a){var c={};a=a.split(\" \");for(var b=0;b<a.length;++b)c[a[b]]=!0;return c}function e(a,c){g=c;return a}function h(a,c){a.eatWhile(/[\\w\\$_]/);var b=a.current();if(n.propertyIsEnumerable(b))return\"keyword\";if(p.propertyIsEnumerable(b))return\"variable-2\";\nif(q.propertyIsEnumerable(b))return\"string-2\";b=a.next();if(\"@\"==b)return a.eatWhile(/[\\w\\\\\\-]/),e(\"meta\",a.current());if(\"/\"==b&&a.eat(\"*\"))return c.tokenize=l,l(a,c);if(\"<\"==b&&a.eat(\"!\"))return c.tokenize=m,m(a,c);if(\"=\"==b)e(null,\"compare\");else{if(\"~\"!=b&&\"|\"!=b||!a.eat(\"=\")){if('\"'==b||\"'\"==b)return c.tokenize=r(b),c.tokenize(a,c);if(\"#\"==b)return a.skipToEnd(),e(\"comment\",\"comment\");if(\"!\"==b)return a.match(/^\\s*\\w*/),e(\"keyword\",\"important\");if(/\\d/.test(b))return a.eatWhile(/[\\w.%]/),e(\"number\",\n\"unit\");if(/[,.+>*\\/]/.test(b))return e(null,\"select-op\");if(/[;{}:\\[\\]]/.test(b))return e(null,b);a.eatWhile(/[\\w\\\\\\-]/);return e(\"variable\",\"variable\")}return e(null,\"compare\")}}function l(a,c){for(var b=!1,f;null!=(f=a.next());){if(b&&\"/\"==f){c.tokenize=h;break}b=\"*\"==f}return e(\"comment\",\"comment\")}function m(a,c){for(var b=0,f;null!=(f=a.next());){if(2<=b&&\">\"==f){c.tokenize=h;break}b=\"-\"==f?b+1:0}return e(\"comment\",\"comment\")}function r(a){return function(c,b){for(var f=!1,d;null!=(d=c.next())&&\n(d!=a||f);)f=!f&&\"\\\\\"==d;f||(b.tokenize=h);return e(\"string\",\"string\")}}var n=k(\"break return rewrite set accept_mutex accept_mutex_delay access_log add_after_body add_before_body add_header addition_types aio alias allow ancient_browser ancient_browser_value auth_basic auth_basic_user_file auth_http auth_http_header auth_http_timeout autoindex autoindex_exact_size autoindex_localtime charset charset_types client_body_buffer_size client_body_in_file_only client_body_in_single_buffer client_body_temp_path client_body_timeout client_header_buffer_size client_header_timeout client_max_body_size connection_pool_size create_full_put_path daemon dav_access dav_methods debug_connection debug_points default_type degradation degrade deny devpoll_changes devpoll_events directio directio_alignment empty_gif env epoll_events error_log eventport_events expires fastcgi_bind fastcgi_buffer_size fastcgi_buffers fastcgi_busy_buffers_size fastcgi_cache fastcgi_cache_key fastcgi_cache_methods fastcgi_cache_min_uses fastcgi_cache_path fastcgi_cache_use_stale fastcgi_cache_valid fastcgi_catch_stderr fastcgi_connect_timeout fastcgi_hide_header fastcgi_ignore_client_abort fastcgi_ignore_headers fastcgi_index fastcgi_intercept_errors fastcgi_max_temp_file_size fastcgi_next_upstream fastcgi_param fastcgi_pass_header fastcgi_pass_request_body fastcgi_pass_request_headers fastcgi_read_timeout fastcgi_send_lowat fastcgi_send_timeout fastcgi_split_path_info fastcgi_store fastcgi_store_access fastcgi_temp_file_write_size fastcgi_temp_path fastcgi_upstream_fail_timeout fastcgi_upstream_max_fails flv geoip_city geoip_country google_perftools_profiles gzip gzip_buffers gzip_comp_level gzip_disable gzip_hash gzip_http_version gzip_min_length gzip_no_buffer gzip_proxied gzip_static gzip_types gzip_vary gzip_window if_modified_since ignore_invalid_headers image_filter image_filter_buffer image_filter_jpeg_quality image_filter_transparency imap_auth imap_capabilities imap_client_buffer index ip_hash keepalive_requests keepalive_timeout kqueue_changes kqueue_events large_client_header_buffers limit_conn limit_conn_log_level limit_rate limit_rate_after limit_req limit_req_log_level limit_req_zone limit_zone lingering_time lingering_timeout lock_file log_format log_not_found log_subrequest map_hash_bucket_size map_hash_max_size master_process memcached_bind memcached_buffer_size memcached_connect_timeout memcached_next_upstream memcached_read_timeout memcached_send_timeout memcached_upstream_fail_timeout memcached_upstream_max_fails merge_slashes min_delete_depth modern_browser modern_browser_value msie_padding msie_refresh multi_accept open_file_cache open_file_cache_errors open_file_cache_events open_file_cache_min_uses open_file_cache_valid open_log_file_cache output_buffers override_charset perl perl_modules perl_require perl_set pid pop3_auth pop3_capabilities port_in_redirect postpone_gzipping postpone_output protocol proxy proxy_bind proxy_buffer proxy_buffer_size proxy_buffering proxy_buffers proxy_busy_buffers_size proxy_cache proxy_cache_key proxy_cache_methods proxy_cache_min_uses proxy_cache_path proxy_cache_use_stale proxy_cache_valid proxy_connect_timeout proxy_headers_hash_bucket_size proxy_headers_hash_max_size proxy_hide_header proxy_ignore_client_abort proxy_ignore_headers proxy_intercept_errors proxy_max_temp_file_size proxy_method proxy_next_upstream proxy_pass_error_message proxy_pass_header proxy_pass_request_body proxy_pass_request_headers proxy_read_timeout proxy_redirect proxy_send_lowat proxy_send_timeout proxy_set_body proxy_set_header proxy_ssl_session_reuse proxy_store proxy_store_access proxy_temp_file_write_size proxy_temp_path proxy_timeout proxy_upstream_fail_timeout proxy_upstream_max_fails random_index read_ahead real_ip_header recursive_error_pages request_pool_size reset_timedout_connection resolver resolver_timeout rewrite_log rtsig_overflow_events rtsig_overflow_test rtsig_overflow_threshold rtsig_signo satisfy secure_link_secret send_lowat send_timeout sendfile sendfile_max_chunk server_name_in_redirect server_names_hash_bucket_size server_names_hash_max_size server_tokens set_real_ip_from smtp_auth smtp_capabilities smtp_client_buffer smtp_greeting_delay so_keepalive source_charset ssi ssi_ignore_recycled_buffers ssi_min_file_chunk ssi_silent_errors ssi_types ssi_value_length ssl ssl_certificate ssl_certificate_key ssl_ciphers ssl_client_certificate ssl_crl ssl_dhparam ssl_engine ssl_prefer_server_ciphers ssl_protocols ssl_session_cache ssl_session_timeout ssl_verify_client ssl_verify_depth starttls stub_status sub_filter sub_filter_once sub_filter_types tcp_nodelay tcp_nopush thread_stack_size timeout timer_resolution types_hash_bucket_size types_hash_max_size underscores_in_headers uninitialized_variable_warn use user userid userid_domain userid_expires userid_mark userid_name userid_p3p userid_path userid_service valid_referers variables_hash_bucket_size variables_hash_max_size worker_connections worker_cpu_affinity worker_priority worker_processes worker_rlimit_core worker_rlimit_nofile worker_rlimit_sigpending worker_threads working_directory xclient xml_entities xslt_stylesheet xslt_typesdrew@li229-23\"),\np=k(\"http mail events server types location upstream charset_map limit_except if geo map\"),q=k(\"include root server server_name listen internal proxy_pass memcached_pass fastcgi_pass try_files\"),t=d.indentUnit,g;return{startState:function(a){return{tokenize:h,baseIndent:a||0,stack:[]}},token:function(a,c){if(a.eatSpace())return null;g=null;a=c.tokenize(a,c);var b=c.stack[c.stack.length-1];\"hash\"==g&&\"rule\"==b?a=\"atom\":\"variable\"==a&&(\"rule\"==b?a=\"number\":b&&\"@media{\"!=b||(a=\"tag\"));\"rule\"==b&&/^[\\{\\};]$/.test(g)&&\nc.stack.pop();\"{\"==g?\"@media\"==b?c.stack[c.stack.length-1]=\"@media{\":c.stack.push(\"{\"):\"}\"==g?c.stack.pop():\"@media\"==g?c.stack.push(\"@media\"):\"{\"==b&&\"comment\"!=g&&c.stack.push(\"rule\");return a},indent:function(a,c){var b=a.stack.length;/^\\}/.test(c)&&(b-=\"rule\"==a.stack[a.stack.length-1]?2:1);return a.baseIndent+b*t},electricChars:\"}\"}});d.defineMIME(\"text/x-nginx-conf\",\"nginx\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/nsis/nsis.js",
    "content": "'use strict';(function(a){\"object\"==typeof exports&&\"object\"==typeof module?a(require(\"../../lib/codemirror\"),require(\"../../addon/mode/simple\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\",\"../../addon/mode/simple\"],a):a(CodeMirror)})(function(a){a.defineSimpleMode(\"nsis\",{start:[{regex:/(?:[+-]?)(?:0x[\\d,a-f]+)|(?:0o[0-7]+)|(?:0b[0,1]+)|(?:\\d+.?\\d*)/,token:\"number\"},{regex:/\"(?:[^\\\\\"]|\\\\.)*\"?/,token:\"string\"},{regex:/'(?:[^\\\\']|\\\\.)*'?/,token:\"string\"},{regex:/`(?:[^\\\\`]|\\\\.)*`?/,\ntoken:\"string\"},{regex:/(?:\\!(include|addincludedir|addplugindir|appendfile|cd|delfile|echo|error|execute|packhdr|finalize|getdllversion|system|tempfile|warning|verbose|define|undef|insertmacro|makensis|searchparse|searchreplace))\\b/,token:\"keyword\"},{regex:/(?:\\!(if(?:n?def)?|ifmacron?def|macro))\\b/,token:\"keyword\",indent:!0},{regex:/(?:\\!(else|endif|macroend))\\b/,token:\"keyword\",dedent:!0},{regex:/\\b(?:Abort|AddBrandingImage|AddSize|AllowRootDirInstall|AllowSkipFiles|AutoCloseWindow|BGFont|BGGradient|BrandingText|BringToFront|Call|CallInstDLL|Caption|ChangeUI|CheckBitmap|ClearErrors|CompletedText|ComponentText|CopyFiles|CRCCheck|CreateDirectory|CreateFont|CreateShortCut|Delete|DeleteINISec|DeleteINIStr|DeleteRegKey|DeleteRegValue|DetailPrint|DetailsButtonText|DirText|DirVar|DirVerify|EnableWindow|EnumRegKey|EnumRegValue|Exch|Exec|ExecShell|ExecWait|ExpandEnvStrings|File|FileBufSize|FileClose|FileErrorText|FileOpen|FileRead|FileReadByte|FileReadUTF16LE|FileReadWord|FileWriteUTF16LE|FileSeek|FileWrite|FileWriteByte|FileWriteWord|FindClose|FindFirst|FindNext|FindWindow|FlushINI|GetCurInstType|GetCurrentAddress|GetDlgItem|GetDLLVersion|GetDLLVersionLocal|GetErrorLevel|GetFileTime|GetFileTimeLocal|GetFullPathName|GetFunctionAddress|GetInstDirError|GetLabelAddress|GetTempFileName|Goto|HideWindow|Icon|IfAbort|IfErrors|IfFileExists|IfRebootFlag|IfSilent|InitPluginsDir|InstallButtonText|InstallColors|InstallDir|InstallDirRegKey|InstProgressFlags|InstType|InstTypeGetText|InstTypeSetText|IntCmp|IntCmpU|IntFmt|IntOp|IsWindow|LangString|LicenseBkColor|LicenseData|LicenseForceSelection|LicenseLangString|LicenseText|LoadLanguageFile|LockWindow|LogSet|LogText|ManifestDPIAware|ManifestSupportedOS|MessageBox|MiscButtonText|Name|Nop|OutFile|Page|PageCallbacks|Pop|Push|Quit|ReadEnvStr|ReadINIStr|ReadRegDWORD|ReadRegStr|Reboot|RegDLL|Rename|RequestExecutionLevel|ReserveFile|Return|RMDir|SearchPath|SectionGetFlags|SectionGetInstTypes|SectionGetSize|SectionGetText|SectionIn|SectionSetFlags|SectionSetInstTypes|SectionSetSize|SectionSetText|SendMessage|SetAutoClose|SetBrandingImage|SetCompress|SetCompressor|SetCompressorDictSize|SetCtlColors|SetCurInstType|SetDatablockOptimize|SetDateSave|SetDetailsPrint|SetDetailsView|SetErrorLevel|SetErrors|SetFileAttributes|SetFont|SetOutPath|SetOverwrite|SetPluginUnload|SetRebootFlag|SetRegView|SetShellVarContext|SetSilent|ShowInstDetails|ShowUninstDetails|ShowWindow|SilentInstall|SilentUnInstall|Sleep|SpaceTexts|StrCmp|StrCmpS|StrCpy|StrLen|SubCaption|Unicode|UninstallButtonText|UninstallCaption|UninstallIcon|UninstallSubCaption|UninstallText|UninstPage|UnRegDLL|Var|VIAddVersionKey|VIFileVersion|VIProductVersion|WindowIcon|WriteINIStr|WriteRegBin|WriteRegDWORD|WriteRegExpandStr|WriteRegStr|WriteUninstaller|XPStyle)\\b/,\ntoken:\"keyword\"},{regex:/\\b(?:Function|PageEx|Section(?:Group)?)\\b/,token:\"keyword\",indent:!0},{regex:/\\b(?:(Function|PageEx|Section(?:Group)?)End)\\b/,token:\"keyword\",dedent:!0},{regex:/\\b(?:ARCHIVE|FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_NORMAL|FILE_ATTRIBUTE_OFFLINE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_TEMPORARY|HIDDEN|HKCC|HKCR|HKCU|HKDD|HKEY_CLASSES_ROOT|HKEY_CURRENT_CONFIG|HKEY_CURRENT_USER|HKEY_DYN_DATA|HKEY_LOCAL_MACHINE|HKEY_PERFORMANCE_DATA|HKEY_USERS|HKLM|HKPD|HKU|IDABORT|IDCANCEL|IDD_DIR|IDD_INST|IDD_INSTFILES|IDD_LICENSE|IDD_SELCOM|IDD_UNINST|IDD_VERIFY|IDIGNORE|IDNO|IDOK|IDRETRY|IDYES|MB_ABORTRETRYIGNORE|MB_DEFBUTTON1|MB_DEFBUTTON2|MB_DEFBUTTON3|MB_DEFBUTTON4|MB_ICONEXCLAMATION|MB_ICONINFORMATION|MB_ICONQUESTION|MB_ICONSTOP|MB_OK|MB_OKCANCEL|MB_RETRYCANCEL|MB_RIGHT|MB_RTLREADING|MB_SETFOREGROUND|MB_TOPMOST|MB_USERICON|MB_YESNO|MB_YESNOCANCEL|NORMAL|OFFLINE|READONLY|SHCTX|SHELL_CONTEXT|SW_HIDE|SW_SHOWDEFAULT|SW_SHOWMAXIMIZED|SW_SHOWMINIMIZED|SW_SHOWNORMAL|SYSTEM|TEMPORARY)\\b/,\ntoken:\"atom\"},{regex:/\\b(?:admin|all|auto|both|bottom|bzip2|components|current|custom|directory|force|hide|highest|ifdiff|ifnewer|instfiles|lastused|leave|left|license|listonly|lzma|nevershow|none|normal|notset|right|show|silent|silentlog|textonly|top|try|un\\.components|un\\.custom|un\\.directory|un\\.instfiles|un\\.license|uninstConfirm|user|Win10|Win7|Win8|WinVista|zlib)\\b/,token:\"builtin\"},{regex:/\\$\\{(?:And(?:If(?:Not)?|Unless)|Break|Case(?:Else)?|Continue|Default|Do(?:Until|While)?|Else(?:If(?:Not)?|Unless)?|End(?:If|Select|Switch)|Exit(?:Do|For|While)|For(?:Each)?|If(?:Cmd|Not(?:Then)?|Then)?|Loop(?:Until|While)?|Or(?:If(?:Not)?|Unless)|Select|Switch|Unless|While)\\}/,\ntoken:\"variable-2\",indent:!0},{regex:/\\$\\{(?:BannerTrimPath|DirState|DriveSpace|Get(BaseName|Drives|ExeName|ExePath|FileAttributes|FileExt|FileName|FileVersion|Options|OptionsS|Parameters|Parent|Root|Size|Time)|Locate|RefreshShellIcons)\\}/,token:\"variable-2\",dedent:!0},{regex:/\\$\\{(?:Memento(?:Section(?:Done|End|Restore|Save)?|UnselectedSection))\\}/,token:\"variable-2\",dedent:!0},{regex:/\\$\\{(?:Config(?:Read|ReadS|Write|WriteS)|File(?:Join|ReadFromEnd|Recode)|Line(?:Find|Read|Sum)|Text(?:Compare|CompareS)|TrimNewLines)\\}/,\ntoken:\"variable-2\",dedent:!0},{regex:/\\$\\{(?:(?:At(?:Least|Most)|Is)(?:ServicePack|Win(?:7|8|10|95|98|200(?:0|3|8(?:R2)?)|ME|NT4|Vista|XP))|Is(?:NT|Server))\\}/,token:\"variable\",dedent:!0},{regex:/\\$\\{(?:StrFilterS?|Version(?:Compare|Convert)|Word(?:AddS?|Find(?:(?:2|3)X)?S?|InsertS?|ReplaceS?))\\}/,token:\"variable-2\",dedent:!0},{regex:/\\$\\{(?:RunningX64)\\}/,token:\"variable\",dedent:!0},{regex:/\\$\\{(?:Disable|Enable)X64FSRedirection\\}/,token:\"variable-2\",dedent:!0},{regex:/(#|;).*/,token:\"comment\"},\n{regex:/\\/\\*/,token:\"comment\",next:\"comment\"},{regex:/[-+\\/*=<>!]+/,token:\"operator\"},{regex:/\\$[\\w]+/,token:\"variable\"},{regex:/\\${[\\w]+}/,token:\"variable-2\"},{regex:/\\$\\([\\w]+\\)/,token:\"variable-3\"}],comment:[{regex:/.*?\\*\\//,token:\"comment\",next:\"start\"},{regex:/.*/,token:\"comment\"}],meta:{electricInput:/^\\s*((Function|PageEx|Section|Section(Group)?)End|(\\!(endif|macroend))|\\$\\{(End(If|Unless|While)|Loop(Until)|Next)\\})$/,blockCommentStart:\"/*\",blockCommentEnd:\"*/\",lineComment:[\"#\",\";\"]}});a.defineMIME(\"text/x-nsis\",\n\"nsis\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/ntriples/ntriples.js",
    "content": "'use strict';(function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],e):e(CodeMirror)})(function(e){e.defineMode(\"ntriples\",function(){function d(f,b){var c=f.location;f.location=c==a.PRE_SUBJECT&&\"<\"==b?a.WRITING_SUB_URI:c==a.PRE_SUBJECT&&\"_\"==b?a.WRITING_BNODE_URI:c==a.PRE_PRED&&\"<\"==b?a.WRITING_PRED_URI:c==a.PRE_OBJ&&\"<\"==b?a.WRITING_OBJ_URI:c==a.PRE_OBJ&&\"_\"==b?a.WRITING_OBJ_BNODE:c==\na.PRE_OBJ&&'\"'==b?a.WRITING_OBJ_LITERAL:c==a.WRITING_SUB_URI&&\">\"==b?a.PRE_PRED:c==a.WRITING_BNODE_URI&&\" \"==b?a.PRE_PRED:c==a.WRITING_PRED_URI&&\">\"==b?a.PRE_OBJ:c==a.WRITING_OBJ_URI&&\">\"==b?a.POST_OBJ:c==a.WRITING_OBJ_BNODE&&\" \"==b?a.POST_OBJ:c==a.WRITING_OBJ_LITERAL&&'\"'==b?a.POST_OBJ:c==a.WRITING_LIT_LANG&&\" \"==b?a.POST_OBJ:c==a.WRITING_LIT_TYPE&&\">\"==b?a.POST_OBJ:c==a.WRITING_OBJ_LITERAL&&\"@\"==b?a.WRITING_LIT_LANG:c==a.WRITING_OBJ_LITERAL&&\"^\"==b?a.WRITING_LIT_TYPE:\" \"!=b||c!=a.PRE_SUBJECT&&c!=\na.PRE_PRED&&c!=a.PRE_OBJ&&c!=a.POST_OBJ?c==a.POST_OBJ&&\".\"==b?a.PRE_SUBJECT:a.ERROR:c}var a={PRE_SUBJECT:0,WRITING_SUB_URI:1,WRITING_BNODE_URI:2,PRE_PRED:3,WRITING_PRED_URI:4,PRE_OBJ:5,WRITING_OBJ_URI:6,WRITING_OBJ_BNODE:7,WRITING_OBJ_LITERAL:8,WRITING_LIT_LANG:9,WRITING_LIT_TYPE:10,POST_OBJ:11,ERROR:12};return{startState:function(){return{location:a.PRE_SUBJECT,uris:[],anchors:[],bnodes:[],langs:[],types:[]}},token:function(a,b){var c=a.next();if(\"<\"==c){d(b,c);var e=\"\";a.eatWhile(function(a){return\"#\"!=\na&&\">\"!=a?(e+=a,!0):!1});b.uris.push(e);if(a.match(\"#\",!1))return\"variable\";a.next();d(b,\">\");return\"variable\"}if(\"#\"==c){var f=\"\";a.eatWhile(function(a){return\">\"!=a&&\" \"!=a?(f+=a,!0):!1});b.anchors.push(f);return\"variable-2\"}if(\">\"==c)return d(b,\">\"),\"variable\";if(\"_\"==c){d(b,c);var g=\"\";a.eatWhile(function(a){return\" \"!=a?(g+=a,!0):!1});b.bnodes.push(g);a.next();d(b,\" \");return\"builtin\"}if('\"'==c)return d(b,c),a.eatWhile(function(a){return'\"'!=a}),a.next(),\"@\"!=a.peek()&&\"^\"!=a.peek()&&d(b,'\"'),\n\"string\";if(\"@\"==c){d(b,\"@\");var h=\"\";a.eatWhile(function(a){return\" \"!=a?(h+=a,!0):!1});b.langs.push(h);a.next();d(b,\" \");return\"string-2\"}if(\"^\"==c){a.next();d(b,\"^\");var k=\"\";a.eatWhile(function(a){return\">\"!=a?(k+=a,!0):!1});b.types.push(k);a.next();d(b,\">\");return\"variable\"}\" \"==c&&d(b,c);\".\"==c&&d(b,c)}}});e.defineMIME(\"text/n-triples\",\"ntriples\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/octave/octave.js",
    "content": "'use strict';(function(c){\"object\"==typeof exports&&\"object\"==typeof module?c(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],c):c(CodeMirror)})(function(c){c.defineMode(\"octave\",function(){function c(a){return new RegExp(\"^((\"+a.join(\")|(\")+\"))\\\\b\")}function e(a,b){if(!a.sol()&&\"'\"===a.peek())return a.next(),b.tokenize=d,\"operator\";b.tokenize=d;return d(a,b)}function f(a,b){if(a.match(/^.*%}/))return b.tokenize=d,\"comment\";a.skipToEnd();return\"comment\"}\nfunction d(a,b){if(a.eatSpace())return null;if(a.match(\"%{\"))return b.tokenize=f,a.skipToEnd(),\"comment\";if(a.match(/^[%#]/))return a.skipToEnd(),\"comment\";if(a.match(/^[0-9\\.+-]/,!1)){if(a.match(/^[+-]?0x[0-9a-fA-F]+[ij]?/))return a.tokenize=d,\"number\";if(a.match(/^[+-]?\\d*\\.\\d+([EeDd][+-]?\\d+)?[ij]?/)||a.match(/^[+-]?\\d+([EeDd][+-]?\\d+)?[ij]?/))return\"number\"}if(a.match(c([\"nan\",\"NaN\",\"inf\",\"Inf\"])))return\"number\";if(a.match(/^\"([^\"]|(\"\"))*\"/)||a.match(/^'([^']|(''))*'/))return\"string\";if(a.match(g))return\"keyword\";\nif(a.match(h))return\"builtin\";if(a.match(k))return\"variable\";if(a.match(l)||a.match(m))return\"operator\";if(a.match(n)||a.match(p)||a.match(q))return null;if(a.match(r))return b.tokenize=e,null;a.next();return\"error\"}var l=/^[\\+\\-\\*/&|\\^~<>!@'\\\\]/,n=/^[\\(\\[\\{\\},:=;]/,m=/^((==)|(~=)|(<=)|(>=)|(<<)|(>>)|(\\.[\\+\\-\\*/\\^\\\\]))/,p=/^((!=)|(\\+=)|(\\-=)|(\\*=)|(\\/=)|(&=)|(\\|=)|(\\^=))/,q=/^((>>=)|(<<=))/,r=/^[\\]\\)]/,k=/^[_A-Za-z\\u00a1-\\uffff][_A-Za-z0-9\\u00a1-\\uffff]*/,h=c(\"error eval function abs acos atan asin cos cosh exp log prod sum log10 max min sign sin sinh sqrt tan reshape break zeros default margin round ones rand syn ceil floor size clear zeros eye mean std cov det eig inv norm rank trace expm logm sqrtm linspace plot title xlabel ylabel legend text grid meshgrid mesh num2str fft ifft arrayfun cellfun input fliplr flipud ismember\".split(\" \")),\ng=c(\"return case switch else elseif end endif endfunction if otherwise do for while try catch classdef properties events methods global persistent endfor endwhile printf sprintf disp until continue pkg\".split(\" \"));return{startState:function(){return{tokenize:d}},token:function(a,b){a=b.tokenize(a,b);if(\"number\"===a||\"variable\"===a)b.tokenize=e;return a}}});c.defineMIME(\"text/x-octave\",\"octave\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/oz/oz.js",
    "content": "'use strict';(function(d){\"object\"==typeof exports&&\"object\"==typeof module?d(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],d):d(CodeMirror)})(function(d){d.defineMode(\"oz\",function(d){function e(a){return new RegExp(\"^((\"+a.join(\")|(\")+\"))\\\\b\")}function f(a,b){if(a.eatSpace())return null;if(a.match(/[{}]/))return\"bracket\";if(a.match(/(\\[])/))return\"keyword\";if(a.match(n)||a.match(p))return\"operator\";if(a.match(q))return\"atom\";var c=a.match(r);\nif(c)return b.doInCurrentLine?b.doInCurrentLine=!1:b.currentIndent++,\"proc\"==c[0]||\"fun\"==c[0]?b.tokenize=t:\"class\"==c[0]?b.tokenize=u:\"meth\"==c[0]&&(b.tokenize=v),\"keyword\";if(a.match(g)||a.match(w))return\"keyword\";if(a.match(h))return b.currentIndent--,\"keyword\";c=a.next();if('\"'==c||\"'\"==c)return b.tokenize=x(c),b.tokenize(a,b);if(/[~\\d]/.test(c)){if(\"~\"==c){if(!/^[0-9]/.test(a.peek()))return null;if(\"0\"==a.next()&&a.match(/^[xX][0-9a-fA-F]+/)||a.match(/^[0-9]*(\\.[0-9]+)?([eE][~+]?[0-9]+)?/))return\"number\"}return\"0\"==\nc&&a.match(/^[xX][0-9a-fA-F]+/)||a.match(/^[0-9]*(\\.[0-9]+)?([eE][~+]?[0-9]+)?/)?\"number\":null}if(\"%\"==c)return a.skipToEnd(),\"comment\";if(\"/\"==c&&a.eat(\"*\"))return b.tokenize=k,k(a,b);if(y.test(c))return\"operator\";a.eatWhile(/\\w/);return\"variable\"}function u(a,b){if(a.eatSpace())return null;a.match(/([A-Z][A-Za-z0-9_]*)|(`.+`)/);b.tokenize=f;return\"variable-3\"}function v(a,b){if(a.eatSpace())return null;a.match(/([a-zA-Z][A-Za-z0-9_]*)|(`.+`)/);b.tokenize=f;return\"def\"}function t(a,b){if(a.eatSpace())return null;\nif(!b.hasPassedFirstStage&&a.eat(\"{\"))return b.hasPassedFirstStage=!0,\"bracket\";if(b.hasPassedFirstStage)return a.match(/([A-Z][A-Za-z0-9_]*)|(`.+`)|\\$/),b.hasPassedFirstStage=!1,b.tokenize=f,\"def\";b.tokenize=f;return null}function k(a,b){for(var c=!1,d;d=a.next();){if(\"/\"==d&&c){b.tokenize=f;break}c=\"*\"==d}return\"comment\"}function x(a){return function(b,c){for(var d=!1,e,g=!1;null!=(e=b.next());){if(e==a&&!d){g=!0;break}d=!d&&\"\\\\\"==e}if(g||!d)c.tokenize=f;return\"string\"}}var y=/[\\^@!\\|<>#~\\.\\*\\-\\+\\\\/,=]/,\np=/(<-)|(:=)|(=<)|(>=)|(<=)|(<:)|(>:)|(=:)|(\\\\=)|(\\\\=:)|(!!)|(==)|(::)/,n=/(:::)|(\\.\\.\\.)|(=<:)|(>=:)/,l=\"in then else of elseof elsecase elseif catch finally with require prepare import export define do\".split(\" \"),m=[\"end\"],q=e([\"true\",\"false\",\"nil\",\"unit\"]),w=e(\"andthen at attr declare feat from lex mod mode orelse parser prod prop scanner self syn token\".split(\" \")),r=e(\"local proc fun case class if cond or dis choice not thread try raise lock for suchthat meth functor\".split(\" \")),g=e(l),h=e(m);\nreturn{startState:function(){return{tokenize:f,currentIndent:0,doInCurrentLine:!1,hasPassedFirstStage:!1}},token:function(a,b){a.sol()&&(b.doInCurrentLine=0);return b.tokenize(a,b)},indent:function(a,b){b=b.replace(/^\\s+|\\s+$/g,\"\");return b.match(h)||b.match(g)||b.match(/(\\[])/)?d.indentUnit*(a.currentIndent-1):0>a.currentIndent?0:a.currentIndent*d.indentUnit},fold:\"indent\",electricInput:function(){var a=l.concat(m);return new RegExp(\"[\\\\[\\\\]]|(\"+a.join(\"|\")+\")$\")}(),lineComment:\"%\",blockCommentStart:\"/*\",\nblockCommentEnd:\"*/\"}});d.defineMIME(\"text/x-oz\",\"oz\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/pascal/pascal.js",
    "content": "'use strict';(function(b){\"object\"==typeof exports&&\"object\"==typeof module?b(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],b):b(CodeMirror)})(function(b){b.defineMode(\"pascal\",function(){function b(a,d){var c=a.next();if(\"#\"==c&&d.startOfLine)return a.skipToEnd(),\"meta\";if('\"'==c||\"'\"==c)return d.tokenize=h(c),d.tokenize(a,d);if(\"(\"==c&&a.eat(\"*\"))return d.tokenize=e,e(a,d);if(/[\\[\\]{}\\(\\),;\\:\\.]/.test(c))return null;if(/\\d/.test(c))return a.eatWhile(/[\\w\\.]/),\n\"number\";if(\"/\"==c&&a.eat(\"/\"))return a.skipToEnd(),\"comment\";if(g.test(c))return a.eatWhile(g),\"operator\";a.eatWhile(/[\\w\\$_]/);a=a.current();return k.propertyIsEnumerable(a)?\"keyword\":l.propertyIsEnumerable(a)?\"atom\":\"variable\"}function h(a){return function(d,c){for(var b=!1,f,e=!1;null!=(f=d.next());){if(f==a&&!b){e=!0;break}b=!b&&\"\\\\\"==f}if(e||!b)c.tokenize=null;return\"string\"}}function e(a,d){for(var c=!1,b;b=a.next();){if(\")\"==b&&c){d.tokenize=null;break}c=\"*\"==b}return\"comment\"}var k=function(a){var b=\n{};a=a.split(\" \");for(var c=0;c<a.length;++c)b[a[c]]=!0;return b}(\"and array begin case const div do downto else end file for forward integer boolean char function goto if in label mod nil not of or packed procedure program record repeat set string then to type until var while with\"),l={\"null\":!0},g=/[+\\-*&%=<>!?|\\/]/;return{startState:function(){return{tokenize:null}},token:function(a,d){return a.eatSpace()?null:(d.tokenize||b)(a,d)},electricChars:\"{}\"}});b.defineMIME(\"text/x-pascal\",\"pascal\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/pegjs/pegjs.js",
    "content": "'use strict';(function(c){\"object\"==typeof exports&&\"object\"==typeof module?c(require(\"../../lib/codemirror\"),require(\"../javascript/javascript\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\",\"../javascript/javascript\"],c):c(CodeMirror)})(function(c){c.defineMode(\"pegjs\",function(g){var e=c.getMode(g,\"javascript\");return{startState:function(){return{inString:!1,stringType:null,inComment:!1,inCharacterClass:!1,braced:0,lhs:!0,localState:null}},token:function(a,b){!a||b.inString||\nb.inComment||'\"'!=a.peek()&&\"'\"!=a.peek()||(b.stringType=a.peek(),a.next(),b.inString=!0);b.inString||b.inComment||!a.match(/^\\/\\*/)||(b.inComment=!0);if(b.inString){for(;b.inString&&!a.eol();)a.peek()===b.stringType?(a.next(),b.inString=!1):\"\\\\\"===a.peek()?(a.next(),a.next()):a.match(/^.[^\\\\\\\"\\']*/);return b.lhs?\"property string\":\"string\"}if(b.inComment){for(;b.inComment&&!a.eol();)a.match(/\\*\\//)?b.inComment=!1:a.match(/^.[^\\*]*/);return\"comment\"}if(b.inCharacterClass)for(;b.inCharacterClass&&!a.eol();)a.match(/^[^\\]\\\\]+/)||\na.match(/^\\\\./)||(b.inCharacterClass=!1);else{if(\"[\"===a.peek())return a.next(),b.inCharacterClass=!0,\"bracket\";if(a.match(/^\\/\\//))return a.skipToEnd(),\"comment\";if(b.braced||\"{\"===a.peek()){null===b.localState&&(b.localState=c.startState(e));var f=e.token(a,b.localState);a=a.current();if(!f)for(var d=0;d<a.length;d++)\"{\"===a[d]?b.braced++:\"}\"===a[d]&&b.braced--;return f}if(a.match(/^[a-zA-Z_][a-zA-Z0-9_]*/))return\":\"===a.peek()?\"variable\":\"variable-2\";if(-1!=[\"[\",\"]\",\"(\",\")\"].indexOf(a.peek()))return a.next(),\n\"bracket\";a.eatSpace()||a.next()}return null}}},\"javascript\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/perl/perl.js",
    "content": "'use strict';(function(k){\"object\"==typeof exports&&\"object\"==typeof module?k(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],k):k(CodeMirror)})(function(k){function g(d,e){return d.string.charAt(d.pos+(e||0))}function q(d,e){if(e){var g=d.pos-e;return d.string.substr(0<=g?g:0,e)}return d.string.substr(0,d.pos-1)}function p(d,e){var g=d.string.length,r=g-d.pos+1;return d.string.substr(d.pos,e&&e<g?e:r)}function e(d,e){e=d.pos+e;var g;0>=e?d.pos=\n0:e>=(g=d.string.length-1)?d.pos=g:d.pos=e}k.defineMode(\"perl\",function(){function d(a,c,d,e,b){c.chain=null;c.style=null;c.tail=null;c.tokenize=function(a,c){for(var f=!1,g,h=0;g=a.next();){if(g===d[h]&&!f){void 0!==d[++h]?(c.chain=d[h],c.style=e,c.tail=b):b&&a.eatWhile(b);c.tokenize=n;break}f=!f&&\"\\\\\"==g}return e};return c.tokenize(a,c)}function k(a,c,d){c.tokenize=function(a,b){a.string==d&&(b.tokenize=n);a.skipToEnd();return\"string\"};return c.tokenize(a,c)}function n(a,c){if(a.eatSpace())return null;\nif(c.chain)return d(a,c,c.chain,c.style,c.tail);if(a.match(/^\\-?[\\d\\.]/,!1)&&a.match(/^(\\-?(\\d*\\.\\d+(e[+-]?\\d+)?|\\d+\\.\\d*)|0x[\\da-fA-F]+|0b[01]+|\\d+(e[+-]?\\d+)?)/))return\"number\";if(a.match(/^<<(?=\\w)/))return a.eatWhile(/\\w/),k(a,c,a.current().substr(2));if(a.sol()&&a.match(/^\\=item(?!\\w)/))return k(a,c,\"=cut\");var h=a.next();if('\"'==h||\"'\"==h){if(q(a,3)==\"<<\"+h){var l=a.pos;a.eatWhile(/\\w/);var b=a.current().substr(1);if(b&&a.eat(h))return k(a,c,b);a.pos=l}return d(a,c,[h],\"string\")}if(\"q\"==h&&\n(b=g(a,-2),!b||!/\\w/.test(b)))if(b=g(a,0),\"x\"==b){b=g(a,1);if(\"(\"==b)return e(a,2),d(a,c,[\")\"],\"string-2\",f);if(\"[\"==b)return e(a,2),d(a,c,[\"]\"],\"string-2\",f);if(\"{\"==b)return e(a,2),d(a,c,[\"}\"],\"string-2\",f);if(\"<\"==b)return e(a,2),d(a,c,[\">\"],\"string-2\",f);if(/[\\^'\"!~\\/]/.test(b))return e(a,1),d(a,c,[a.eat(b)],\"string-2\",f)}else if(\"q\"==b){b=g(a,1);if(\"(\"==b)return e(a,2),d(a,c,[\")\"],\"string\");if(\"[\"==b)return e(a,2),d(a,c,[\"]\"],\"string\");if(\"{\"==b)return e(a,2),d(a,c,[\"}\"],\"string\");if(\"<\"==b)return e(a,\n2),d(a,c,[\">\"],\"string\");if(/[\\^'\"!~\\/]/.test(b))return e(a,1),d(a,c,[a.eat(b)],\"string\")}else if(\"w\"==b){b=g(a,1);if(\"(\"==b)return e(a,2),d(a,c,[\")\"],\"bracket\");if(\"[\"==b)return e(a,2),d(a,c,[\"]\"],\"bracket\");if(\"{\"==b)return e(a,2),d(a,c,[\"}\"],\"bracket\");if(\"<\"==b)return e(a,2),d(a,c,[\">\"],\"bracket\");if(/[\\^'\"!~\\/]/.test(b))return e(a,1),d(a,c,[a.eat(b)],\"bracket\")}else if(\"r\"==b){b=g(a,1);if(\"(\"==b)return e(a,2),d(a,c,[\")\"],\"string-2\",f);if(\"[\"==b)return e(a,2),d(a,c,[\"]\"],\"string-2\",f);if(\"{\"==\nb)return e(a,2),d(a,c,[\"}\"],\"string-2\",f);if(\"<\"==b)return e(a,2),d(a,c,[\">\"],\"string-2\",f);if(/[\\^'\"!~\\/]/.test(b))return e(a,1),d(a,c,[a.eat(b)],\"string-2\",f)}else if(/[\\^'\"!~\\/(\\[{<]/.test(b)){if(\"(\"==b)return e(a,1),d(a,c,[\")\"],\"string\");if(\"[\"==b)return e(a,1),d(a,c,[\"]\"],\"string\");if(\"{\"==b)return e(a,1),d(a,c,[\"}\"],\"string\");if(\"<\"==b)return e(a,1),d(a,c,[\">\"],\"string\");if(/[\\^'\"!~\\/]/.test(b))return d(a,c,[a.eat(b)],\"string\")}if(\"m\"==h&&(b=g(a,-2),!b||!/\\w/.test(b))&&(b=a.eat(/[(\\[{<\\^'\"!~\\/]/))){if(/[\\^'\"!~\\/]/.test(b))return d(a,\nc,[b],\"string-2\",f);if(\"(\"==b)return d(a,c,[\")\"],\"string-2\",f);if(\"[\"==b)return d(a,c,[\"]\"],\"string-2\",f);if(\"{\"==b)return d(a,c,[\"}\"],\"string-2\",f);if(\"<\"==b)return d(a,c,[\">\"],\"string-2\",f)}if(\"s\"==h&&(b=/[\\/>\\]})\\w]/.test(g(a,-2)),!b&&(b=a.eat(/[(\\[{<\\^'\"!~\\/]/)))||\"y\"==h&&(b=/[\\/>\\]})\\w]/.test(g(a,-2)),!b&&(b=a.eat(/[(\\[{<\\^'\"!~\\/]/)))||\"t\"==h&&(b=/[\\/>\\]})\\w]/.test(g(a,-2)),!b&&(b=a.eat(\"r\")))&&(b=a.eat(/[(\\[{<\\^'\"!~\\/]/)))return\"[\"==b?d(a,c,[\"]\",\"]\"],\"string-2\",f):\"{\"==b?d(a,c,[\"}\",\"}\"],\"string-2\",\nf):\"<\"==b?d(a,c,[\">\",\">\"],\"string-2\",f):\"(\"==b?d(a,c,[\")\",\")\"],\"string-2\",f):d(a,c,[b,b],\"string-2\",f);if(\"`\"==h)return d(a,c,[h],\"variable-2\");if(\"/\"==h)return/~\\s*$/.test(q(a))?d(a,c,[h],\"string-2\",f):\"operator\";if(\"$\"==h){l=a.pos;if(a.eatWhile(/\\d/)||a.eat(\"{\")&&a.eatWhile(/\\d/)&&a.eat(\"}\"))return\"variable-2\";a.pos=l}if(/[$@%]/.test(h)){l=a.pos;if(a.eat(\"^\")&&a.eat(/[A-Z]/)||!/[@$%&]/.test(g(a,-2))&&a.eat(/[=|\\\\\\-#?@;:&`~\\^!\\[\\]*'\"$+.,\\/<>()]/))if(b=a.current(),m[b])return\"variable-2\";a.pos=l}if(/[$@%&]/.test(h)&&\n(a.eatWhile(/[\\w$\\[\\]]/)||a.eat(\"{\")&&a.eatWhile(/[\\w$\\[\\]]/)&&a.eat(\"}\")))return b=a.current(),m[b]?\"variable-2\":\"variable\";if(\"#\"==h&&\"$\"!=g(a,-2))return a.skipToEnd(),\"comment\";if(/[:+\\-\\^*$&%@=<>!?|\\/~\\.]/.test(h)){l=a.pos;a.eatWhile(/[:+\\-\\^*$&%@=<>!?|\\/~\\.]/);if(m[a.current()])return\"operator\";a.pos=l}if(\"_\"==h&&1==a.pos){if(\"_END__\"==p(a,6))return d(a,c,[\"\\x00\"],\"comment\");if(\"_DATA__\"==p(a,7))return d(a,c,[\"\\x00\"],\"variable-2\");if(\"_C__\"==p(a,7))return d(a,c,[\"\\x00\"],\"string\")}if(/\\w/.test(h)){l=\na.pos;if(\"{\"==g(a,-2)&&(\"}\"==g(a,0)||a.eatWhile(/\\w/)&&\"}\"==g(a,0)))return\"string\";a.pos=l}if(/[A-Z]/.test(h))if(c=g(a,-2),l=a.pos,a.eatWhile(/[A-Z_]/),/[\\da-z]/.test(g(a,0)))a.pos=l;else{b=m[a.current()];if(!b)return\"meta\";b[1]&&(b=b[0]);return\":\"!=c?1==b?\"keyword\":2==b?\"def\":3==b?\"atom\":4==b?\"operator\":5==b?\"variable-2\":\"meta\":\"meta\"}if(/[a-zA-Z_]/.test(h)){c=g(a,-2);a.eatWhile(/\\w/);b=m[a.current()];if(!b)return\"meta\";b[1]&&(b=b[0]);return\":\"!=c?1==b?\"keyword\":2==b?\"def\":3==b?\"atom\":4==b?\"operator\":\n5==b?\"variable-2\":\"meta\":\"meta\"}return null}var m={\"->\":4,\"++\":4,\"--\":4,\"**\":4,\"=~\":4,\"!~\":4,\"*\":4,\"/\":4,\"%\":4,x:4,\"+\":4,\"-\":4,\".\":4,\"<<\":4,\">>\":4,\"<\":4,\">\":4,\"<=\":4,\">=\":4,lt:4,gt:4,le:4,ge:4,\"==\":4,\"!=\":4,\"<=>\":4,eq:4,ne:4,cmp:4,\"~~\":4,\"&\":4,\"|\":4,\"^\":4,\"&&\":4,\"||\":4,\"//\":4,\"..\":4,\"...\":4,\"?\":4,\":\":4,\"=\":4,\"+=\":4,\"-=\":4,\"*=\":4,\",\":4,\"=>\":4,\"::\":4,not:4,and:4,or:4,xor:4,BEGIN:[5,1],END:[5,1],PRINT:[5,1],PRINTF:[5,1],GETC:[5,1],READ:[5,1],READLINE:[5,1],DESTROY:[5,1],TIE:[5,1],TIEHANDLE:[5,1],UNTIE:[5,\n1],STDIN:5,STDIN_TOP:5,STDOUT:5,STDOUT_TOP:5,STDERR:5,STDERR_TOP:5,$ARG:5,$_:5,\"@ARG\":5,\"@_\":5,$LIST_SEPARATOR:5,'$\"':5,$PROCESS_ID:5,$PID:5,$$:5,$REAL_GROUP_ID:5,$GID:5,\"$(\":5,$EFFECTIVE_GROUP_ID:5,$EGID:5,\"$)\":5,$PROGRAM_NAME:5,$0:5,$SUBSCRIPT_SEPARATOR:5,$SUBSEP:5,\"$;\":5,$REAL_USER_ID:5,$UID:5,\"$<\":5,$EFFECTIVE_USER_ID:5,$EUID:5,\"$>\":5,$a:5,$b:5,$COMPILING:5,\"$^C\":5,$DEBUGGING:5,\"$^D\":5,\"${^ENCODING}\":5,$ENV:5,\"%ENV\":5,$SYSTEM_FD_MAX:5,\"$^F\":5,\"@F\":5,\"${^GLOBAL_PHASE}\":5,\"$^H\":5,\"%^H\":5,\"@INC\":5,\n\"%INC\":5,$INPLACE_EDIT:5,\"$^I\":5,\"$^M\":5,$OSNAME:5,\"$^O\":5,\"${^OPEN}\":5,$PERLDB:5,\"$^P\":5,$SIG:5,\"%SIG\":5,$BASETIME:5,\"$^T\":5,\"${^TAINT}\":5,\"${^UNICODE}\":5,\"${^UTF8CACHE}\":5,\"${^UTF8LOCALE}\":5,$PERL_VERSION:5,\"$^V\":5,\"${^WIN32_SLOPPY_STAT}\":5,$EXECUTABLE_NAME:5,\"$^X\":5,$1:5,$MATCH:5,\"$&\":5,\"${^MATCH}\":5,$PREMATCH:5,\"$`\":5,\"${^PREMATCH}\":5,$POSTMATCH:5,\"$'\":5,\"${^POSTMATCH}\":5,$LAST_PAREN_MATCH:5,\"$+\":5,$LAST_SUBMATCH_RESULT:5,\"$^N\":5,\"@LAST_MATCH_END\":5,\"@+\":5,\"%LAST_PAREN_MATCH\":5,\"%+\":5,\"@LAST_MATCH_START\":5,\n\"@-\":5,\"%LAST_MATCH_START\":5,\"%-\":5,$LAST_REGEXP_CODE_RESULT:5,\"$^R\":5,\"${^RE_DEBUG_FLAGS}\":5,\"${^RE_TRIE_MAXBUF}\":5,$ARGV:5,\"@ARGV\":5,ARGV:5,ARGVOUT:5,$OUTPUT_FIELD_SEPARATOR:5,$OFS:5,\"$,\":5,$INPUT_LINE_NUMBER:5,$NR:5,\"$.\":5,$INPUT_RECORD_SEPARATOR:5,$RS:5,\"$/\":5,$OUTPUT_RECORD_SEPARATOR:5,$ORS:5,\"$\\\\\":5,$OUTPUT_AUTOFLUSH:5,\"$|\":5,$ACCUMULATOR:5,\"$^A\":5,$FORMAT_FORMFEED:5,\"$^L\":5,$FORMAT_PAGE_NUMBER:5,\"$%\":5,$FORMAT_LINES_LEFT:5,\"$-\":5,$FORMAT_LINE_BREAK_CHARACTERS:5,\"$:\":5,$FORMAT_LINES_PER_PAGE:5,\n\"$=\":5,$FORMAT_TOP_NAME:5,\"$^\":5,$FORMAT_NAME:5,\"$~\":5,\"${^CHILD_ERROR_NATIVE}\":5,$EXTENDED_OS_ERROR:5,\"$^E\":5,$EXCEPTIONS_BEING_CAUGHT:5,\"$^S\":5,$WARNING:5,\"$^W\":5,\"${^WARNING_BITS}\":5,$OS_ERROR:5,$ERRNO:5,\"$!\":5,\"%OS_ERROR\":5,\"%ERRNO\":5,\"%!\":5,$CHILD_ERROR:5,\"$?\":5,$EVAL_ERROR:5,\"$@\":5,$OFMT:5,\"$#\":5,\"$*\":5,$ARRAY_BASE:5,\"$[\":5,$OLD_PERL_VERSION:5,\"$]\":5,\"if\":[1,1],elsif:[1,1],\"else\":[1,1],\"while\":[1,1],unless:[1,1],\"for\":[1,1],foreach:[1,1],abs:1,accept:1,alarm:1,atan2:1,bind:1,binmode:1,bless:1,\nbootstrap:1,\"break\":1,caller:1,chdir:1,chmod:1,chomp:1,chop:1,chown:1,chr:1,chroot:1,close:1,closedir:1,connect:1,\"continue\":[1,1],cos:1,crypt:1,dbmclose:1,dbmopen:1,\"default\":1,defined:1,\"delete\":1,die:1,\"do\":1,dump:1,each:1,endgrent:1,endhostent:1,endnetent:1,endprotoent:1,endpwent:1,endservent:1,eof:1,eval:1,exec:1,exists:1,exit:1,exp:1,fcntl:1,fileno:1,flock:1,fork:1,format:1,formline:1,getc:1,getgrent:1,getgrgid:1,getgrnam:1,gethostbyaddr:1,gethostbyname:1,gethostent:1,getlogin:1,getnetbyaddr:1,\ngetnetbyname:1,getnetent:1,getpeername:1,getpgrp:1,getppid:1,getpriority:1,getprotobyname:1,getprotobynumber:1,getprotoent:1,getpwent:1,getpwnam:1,getpwuid:1,getservbyname:1,getservbyport:1,getservent:1,getsockname:1,getsockopt:1,given:1,glob:1,gmtime:1,\"goto\":1,grep:1,hex:1,\"import\":1,index:1,\"int\":1,ioctl:1,join:1,keys:1,kill:1,last:1,lc:1,lcfirst:1,length:1,link:1,listen:1,local:2,localtime:1,lock:1,log:1,lstat:1,m:null,map:1,mkdir:1,msgctl:1,msgget:1,msgrcv:1,msgsnd:1,my:2,\"new\":1,next:1,no:1,\noct:1,open:1,opendir:1,ord:1,our:2,pack:1,\"package\":1,pipe:1,pop:1,pos:1,print:1,printf:1,prototype:1,push:1,q:null,qq:null,qr:null,quotemeta:null,qw:null,qx:null,rand:1,read:1,readdir:1,readline:1,readlink:1,readpipe:1,recv:1,redo:1,ref:1,rename:1,require:1,reset:1,\"return\":1,reverse:1,rewinddir:1,rindex:1,rmdir:1,s:null,say:1,scalar:1,seek:1,seekdir:1,select:1,semctl:1,semget:1,semop:1,send:1,setgrent:1,sethostent:1,setnetent:1,setpgrp:1,setpriority:1,setprotoent:1,setpwent:1,setservent:1,setsockopt:1,\nshift:1,shmctl:1,shmget:1,shmread:1,shmwrite:1,shutdown:1,sin:1,sleep:1,socket:1,socketpair:1,sort:1,splice:1,split:1,sprintf:1,sqrt:1,srand:1,stat:1,state:1,study:1,sub:1,substr:1,symlink:1,syscall:1,sysopen:1,sysread:1,sysseek:1,system:1,syswrite:1,tell:1,telldir:1,tie:1,tied:1,time:1,times:1,tr:null,truncate:1,uc:1,ucfirst:1,umask:1,undef:1,unlink:1,unpack:1,unshift:1,untie:1,use:1,utime:1,values:1,vec:1,wait:1,waitpid:1,wantarray:1,warn:1,when:1,write:1,y:null},f=/[goseximacplud]/;return{startState:function(){return{tokenize:n,\nchain:null,style:null,tail:null}},token:function(a,c){return(c.tokenize||n)(a,c)},lineComment:\"#\"}});k.registerHelper(\"wordChars\",\"perl\",/[\\w$]/);k.defineMIME(\"text/x-perl\",\"perl\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/php/php.js",
    "content": "'use strict';(function(g){\"object\"==typeof exports&&\"object\"==typeof module?g(require(\"../../lib/codemirror\"),require(\"../htmlmixed/htmlmixed\"),require(\"../clike/clike\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\",\"../htmlmixed/htmlmixed\",\"../clike/clike\"],g):g(CodeMirror)})(function(g){function h(c){var a={};c=c.split(\" \");for(var d=0;d<c.length;++d)a[c[d]]=!0;return a}function m(c,a,d){return 0==c.length?k(a):function(e,f){for(var b=c[0],l=0;l<b.length;l++)if(e.match(b[l][0]))return f.tokenize=\nm(c.slice(1),a),b[l][1];f.tokenize=k(a,d);return\"string\"}}function k(c,a){return function(d,e){if(!1!==a&&d.match(\"${\",!1)||d.match(\"{$\",!1))e.tokenize=null,d=\"string\";else if(!1!==a&&d.match(/^\\$[a-zA-Z_][a-zA-Z0-9_]*/))d.match(\"[\",!1)&&(e.tokenize=m([[[\"[\",null]],[[/\\d[\\w\\.]*/,\"number\"],[/\\$[a-zA-Z_][a-zA-Z0-9_]*/,\"variable-2\"],[/[\\w\\$]+/,\"variable\"]],[[\"]\",null]]],c,a)),d.match(/\\-\\>\\w/,!1)&&(e.tokenize=m([[[\"->\",null]],[[/[\\w]+/,\"variable\"]]],c,a)),d=\"variable-2\";else{for(var f=!1;!d.eol()&&(f||\n!1===a||!d.match(\"{$\",!1)&&!d.match(/^(\\$[a-zA-Z_][a-zA-Z0-9_]*|\\$\\{)/,!1));){if(!f&&d.match(c)){e.tokenize=null;e.tokStack.pop();e.tokStack.pop();break}f=\"\\\\\"==d.next()&&!f}d=\"string\"}return d}}g.registerHelper(\"hintWords\",\"php\",\"abstract and array as break case catch class clone const continue declare default do else elseif enddeclare endfor endforeach endif endswitch endwhile extends final for foreach function global goto if implements interface instanceof namespace new or private protected public static switch throw trait try use var while xor die echo empty exit eval include include_once isset list require require_once return print unset __halt_compiler self static parent yield insteadof finally true false null TRUE FALSE NULL __CLASS__ __DIR__ __FILE__ __LINE__ __METHOD__ __FUNCTION__ __NAMESPACE__ __TRAIT__ func_num_args func_get_arg func_get_args strlen strcmp strncmp strcasecmp strncasecmp each error_reporting define defined trigger_error user_error set_error_handler restore_error_handler get_declared_classes get_loaded_extensions extension_loaded get_extension_funcs debug_backtrace constant bin2hex hex2bin sleep usleep time mktime gmmktime strftime gmstrftime strtotime date gmdate getdate localtime checkdate flush wordwrap htmlspecialchars htmlentities html_entity_decode md5 md5_file crc32 getimagesize image_type_to_mime_type phpinfo phpversion phpcredits strnatcmp strnatcasecmp substr_count strspn strcspn strtok strtoupper strtolower strpos strrpos strrev hebrev hebrevc nl2br basename dirname pathinfo stripslashes stripcslashes strstr stristr strrchr str_shuffle str_word_count strcoll substr substr_replace quotemeta ucfirst ucwords strtr addslashes addcslashes rtrim str_replace str_repeat count_chars chunk_split trim ltrim strip_tags similar_text explode implode setlocale localeconv parse_str str_pad chop strchr sprintf printf vprintf vsprintf sscanf fscanf parse_url urlencode urldecode rawurlencode rawurldecode readlink linkinfo link unlink exec system escapeshellcmd escapeshellarg passthru shell_exec proc_open proc_close rand srand getrandmax mt_rand mt_srand mt_getrandmax base64_decode base64_encode abs ceil floor round is_finite is_nan is_infinite bindec hexdec octdec decbin decoct dechex base_convert number_format fmod ip2long long2ip getenv putenv getopt microtime gettimeofday getrusage uniqid quoted_printable_decode set_time_limit get_cfg_var magic_quotes_runtime set_magic_quotes_runtime get_magic_quotes_gpc get_magic_quotes_runtime import_request_variables error_log serialize unserialize memory_get_usage var_dump var_export debug_zval_dump print_r highlight_file show_source highlight_string ini_get ini_get_all ini_set ini_alter ini_restore get_include_path set_include_path restore_include_path setcookie header headers_sent connection_aborted connection_status ignore_user_abort parse_ini_file is_uploaded_file move_uploaded_file intval floatval doubleval strval gettype settype is_null is_resource is_bool is_long is_float is_int is_integer is_double is_real is_numeric is_string is_array is_object is_scalar ereg ereg_replace eregi eregi_replace split spliti join sql_regcase dl pclose popen readfile rewind rmdir umask fclose feof fgetc fgets fgetss fread fopen fpassthru ftruncate fstat fseek ftell fflush fwrite fputs mkdir rename copy tempnam tmpfile file file_get_contents file_put_contents stream_select stream_context_create stream_context_set_params stream_context_set_option stream_context_get_options stream_filter_prepend stream_filter_append fgetcsv flock get_meta_tags stream_set_write_buffer set_file_buffer set_socket_blocking stream_set_blocking socket_set_blocking stream_get_meta_data stream_register_wrapper stream_wrapper_register stream_set_timeout socket_set_timeout socket_get_status realpath fnmatch fsockopen pfsockopen pack unpack get_browser crypt opendir closedir chdir getcwd rewinddir readdir dir glob fileatime filectime filegroup fileinode filemtime fileowner fileperms filesize filetype file_exists is_writable is_writeable is_readable is_executable is_file is_dir is_link stat lstat chown touch clearstatcache mail ob_start ob_flush ob_clean ob_end_flush ob_end_clean ob_get_flush ob_get_clean ob_get_length ob_get_level ob_get_status ob_get_contents ob_implicit_flush ob_list_handlers ksort krsort natsort natcasesort asort arsort sort rsort usort uasort uksort shuffle array_walk count end prev next reset current key min max in_array array_search extract compact array_fill range array_multisort array_push array_pop array_shift array_unshift array_splice array_slice array_merge array_merge_recursive array_keys array_values array_count_values array_reverse array_reduce array_pad array_flip array_change_key_case array_rand array_unique array_intersect array_intersect_assoc array_diff array_diff_assoc array_sum array_filter array_map array_chunk array_key_exists array_intersect_key array_combine array_column pos sizeof key_exists assert assert_options version_compare ftok str_rot13 aggregate session_name session_module_name session_save_path session_id session_regenerate_id session_decode session_register session_unregister session_is_registered session_encode session_start session_destroy session_unset session_set_save_handler session_cache_limiter session_cache_expire session_set_cookie_params session_get_cookie_params session_write_close preg_match preg_match_all preg_replace preg_replace_callback preg_split preg_quote preg_grep overload ctype_alnum ctype_alpha ctype_cntrl ctype_digit ctype_lower ctype_graph ctype_print ctype_punct ctype_space ctype_upper ctype_xdigit virtual apache_request_headers apache_note apache_lookup_uri apache_child_terminate apache_setenv apache_response_headers apache_get_version getallheaders mysql_connect mysql_pconnect mysql_close mysql_select_db mysql_create_db mysql_drop_db mysql_query mysql_unbuffered_query mysql_db_query mysql_list_dbs mysql_list_tables mysql_list_fields mysql_list_processes mysql_error mysql_errno mysql_affected_rows mysql_insert_id mysql_result mysql_num_rows mysql_num_fields mysql_fetch_row mysql_fetch_array mysql_fetch_assoc mysql_fetch_object mysql_data_seek mysql_fetch_lengths mysql_fetch_field mysql_field_seek mysql_free_result mysql_field_name mysql_field_table mysql_field_len mysql_field_type mysql_field_flags mysql_escape_string mysql_real_escape_string mysql_stat mysql_thread_id mysql_client_encoding mysql_get_client_info mysql_get_host_info mysql_get_proto_info mysql_get_server_info mysql_info mysql mysql_fieldname mysql_fieldtable mysql_fieldlen mysql_fieldtype mysql_fieldflags mysql_selectdb mysql_createdb mysql_dropdb mysql_freeresult mysql_numfields mysql_numrows mysql_listdbs mysql_listtables mysql_listfields mysql_db_name mysql_dbname mysql_tablename mysql_table_name pg_connect pg_pconnect pg_close pg_connection_status pg_connection_busy pg_connection_reset pg_host pg_dbname pg_port pg_tty pg_options pg_ping pg_query pg_send_query pg_cancel_query pg_fetch_result pg_fetch_row pg_fetch_assoc pg_fetch_array pg_fetch_object pg_fetch_all pg_affected_rows pg_get_result pg_result_seek pg_result_status pg_free_result pg_last_oid pg_num_rows pg_num_fields pg_field_name pg_field_num pg_field_size pg_field_type pg_field_prtlen pg_field_is_null pg_get_notify pg_get_pid pg_result_error pg_last_error pg_last_notice pg_put_line pg_end_copy pg_copy_to pg_copy_from pg_trace pg_untrace pg_lo_create pg_lo_unlink pg_lo_open pg_lo_close pg_lo_read pg_lo_write pg_lo_read_all pg_lo_import pg_lo_export pg_lo_seek pg_lo_tell pg_escape_string pg_escape_bytea pg_unescape_bytea pg_client_encoding pg_set_client_encoding pg_meta_data pg_convert pg_insert pg_update pg_delete pg_select pg_exec pg_getlastoid pg_cmdtuples pg_errormessage pg_numrows pg_numfields pg_fieldname pg_fieldsize pg_fieldtype pg_fieldnum pg_fieldprtlen pg_fieldisnull pg_freeresult pg_result pg_loreadall pg_locreate pg_lounlink pg_loopen pg_loclose pg_loread pg_lowrite pg_loimport pg_loexport http_response_code get_declared_traits getimagesizefromstring socket_import_stream stream_set_chunk_size trait_exists header_register_callback class_uses session_status session_register_shutdown echo print global static exit array empty eval isset unset die include require include_once require_once json_decode json_encode json_last_error json_last_error_msg curl_close curl_copy_handle curl_errno curl_error curl_escape curl_exec curl_file_create curl_getinfo curl_init curl_multi_add_handle curl_multi_close curl_multi_exec curl_multi_getcontent curl_multi_info_read curl_multi_init curl_multi_remove_handle curl_multi_select curl_multi_setopt curl_multi_strerror curl_pause curl_reset curl_setopt_array curl_setopt curl_share_close curl_share_init curl_share_setopt curl_strerror curl_unescape curl_version mysqli_affected_rows mysqli_autocommit mysqli_change_user mysqli_character_set_name mysqli_close mysqli_commit mysqli_connect_errno mysqli_connect_error mysqli_connect mysqli_data_seek mysqli_debug mysqli_dump_debug_info mysqli_errno mysqli_error_list mysqli_error mysqli_fetch_all mysqli_fetch_array mysqli_fetch_assoc mysqli_fetch_field_direct mysqli_fetch_field mysqli_fetch_fields mysqli_fetch_lengths mysqli_fetch_object mysqli_fetch_row mysqli_field_count mysqli_field_seek mysqli_field_tell mysqli_free_result mysqli_get_charset mysqli_get_client_info mysqli_get_client_stats mysqli_get_client_version mysqli_get_connection_stats mysqli_get_host_info mysqli_get_proto_info mysqli_get_server_info mysqli_get_server_version mysqli_info mysqli_init mysqli_insert_id mysqli_kill mysqli_more_results mysqli_multi_query mysqli_next_result mysqli_num_fields mysqli_num_rows mysqli_options mysqli_ping mysqli_prepare mysqli_query mysqli_real_connect mysqli_real_escape_string mysqli_real_query mysqli_reap_async_query mysqli_refresh mysqli_rollback mysqli_select_db mysqli_set_charset mysqli_set_local_infile_default mysqli_set_local_infile_handler mysqli_sqlstate mysqli_ssl_set mysqli_stat mysqli_stmt_init mysqli_store_result mysqli_thread_id mysqli_thread_safe mysqli_use_result mysqli_warning_count\".split(\" \"));\ng.registerHelper(\"wordChars\",\"php\",/[\\w$]/);var n={name:\"clike\",helperType:\"php\",keywords:h(\"abstract and array as break case catch class clone const continue declare default do else elseif enddeclare endfor endforeach endif endswitch endwhile extends final for foreach function global goto if implements interface instanceof namespace new or private protected public static switch throw trait try use var while xor die echo empty exit eval include include_once isset list require require_once return print unset __halt_compiler self static parent yield insteadof finally\"),\nblockKeywords:h(\"catch do else elseif for foreach if switch try while finally\"),defKeywords:h(\"class function interface namespace trait\"),atoms:h(\"true false null TRUE FALSE NULL __CLASS__ __DIR__ __FILE__ __LINE__ __METHOD__ __FUNCTION__ __NAMESPACE__ __TRAIT__\"),builtin:h(\"func_num_args func_get_arg func_get_args strlen strcmp strncmp strcasecmp strncasecmp each error_reporting define defined trigger_error user_error set_error_handler restore_error_handler get_declared_classes get_loaded_extensions extension_loaded get_extension_funcs debug_backtrace constant bin2hex hex2bin sleep usleep time mktime gmmktime strftime gmstrftime strtotime date gmdate getdate localtime checkdate flush wordwrap htmlspecialchars htmlentities html_entity_decode md5 md5_file crc32 getimagesize image_type_to_mime_type phpinfo phpversion phpcredits strnatcmp strnatcasecmp substr_count strspn strcspn strtok strtoupper strtolower strpos strrpos strrev hebrev hebrevc nl2br basename dirname pathinfo stripslashes stripcslashes strstr stristr strrchr str_shuffle str_word_count strcoll substr substr_replace quotemeta ucfirst ucwords strtr addslashes addcslashes rtrim str_replace str_repeat count_chars chunk_split trim ltrim strip_tags similar_text explode implode setlocale localeconv parse_str str_pad chop strchr sprintf printf vprintf vsprintf sscanf fscanf parse_url urlencode urldecode rawurlencode rawurldecode readlink linkinfo link unlink exec system escapeshellcmd escapeshellarg passthru shell_exec proc_open proc_close rand srand getrandmax mt_rand mt_srand mt_getrandmax base64_decode base64_encode abs ceil floor round is_finite is_nan is_infinite bindec hexdec octdec decbin decoct dechex base_convert number_format fmod ip2long long2ip getenv putenv getopt microtime gettimeofday getrusage uniqid quoted_printable_decode set_time_limit get_cfg_var magic_quotes_runtime set_magic_quotes_runtime get_magic_quotes_gpc get_magic_quotes_runtime import_request_variables error_log serialize unserialize memory_get_usage var_dump var_export debug_zval_dump print_r highlight_file show_source highlight_string ini_get ini_get_all ini_set ini_alter ini_restore get_include_path set_include_path restore_include_path setcookie header headers_sent connection_aborted connection_status ignore_user_abort parse_ini_file is_uploaded_file move_uploaded_file intval floatval doubleval strval gettype settype is_null is_resource is_bool is_long is_float is_int is_integer is_double is_real is_numeric is_string is_array is_object is_scalar ereg ereg_replace eregi eregi_replace split spliti join sql_regcase dl pclose popen readfile rewind rmdir umask fclose feof fgetc fgets fgetss fread fopen fpassthru ftruncate fstat fseek ftell fflush fwrite fputs mkdir rename copy tempnam tmpfile file file_get_contents file_put_contents stream_select stream_context_create stream_context_set_params stream_context_set_option stream_context_get_options stream_filter_prepend stream_filter_append fgetcsv flock get_meta_tags stream_set_write_buffer set_file_buffer set_socket_blocking stream_set_blocking socket_set_blocking stream_get_meta_data stream_register_wrapper stream_wrapper_register stream_set_timeout socket_set_timeout socket_get_status realpath fnmatch fsockopen pfsockopen pack unpack get_browser crypt opendir closedir chdir getcwd rewinddir readdir dir glob fileatime filectime filegroup fileinode filemtime fileowner fileperms filesize filetype file_exists is_writable is_writeable is_readable is_executable is_file is_dir is_link stat lstat chown touch clearstatcache mail ob_start ob_flush ob_clean ob_end_flush ob_end_clean ob_get_flush ob_get_clean ob_get_length ob_get_level ob_get_status ob_get_contents ob_implicit_flush ob_list_handlers ksort krsort natsort natcasesort asort arsort sort rsort usort uasort uksort shuffle array_walk count end prev next reset current key min max in_array array_search extract compact array_fill range array_multisort array_push array_pop array_shift array_unshift array_splice array_slice array_merge array_merge_recursive array_keys array_values array_count_values array_reverse array_reduce array_pad array_flip array_change_key_case array_rand array_unique array_intersect array_intersect_assoc array_diff array_diff_assoc array_sum array_filter array_map array_chunk array_key_exists array_intersect_key array_combine array_column pos sizeof key_exists assert assert_options version_compare ftok str_rot13 aggregate session_name session_module_name session_save_path session_id session_regenerate_id session_decode session_register session_unregister session_is_registered session_encode session_start session_destroy session_unset session_set_save_handler session_cache_limiter session_cache_expire session_set_cookie_params session_get_cookie_params session_write_close preg_match preg_match_all preg_replace preg_replace_callback preg_split preg_quote preg_grep overload ctype_alnum ctype_alpha ctype_cntrl ctype_digit ctype_lower ctype_graph ctype_print ctype_punct ctype_space ctype_upper ctype_xdigit virtual apache_request_headers apache_note apache_lookup_uri apache_child_terminate apache_setenv apache_response_headers apache_get_version getallheaders mysql_connect mysql_pconnect mysql_close mysql_select_db mysql_create_db mysql_drop_db mysql_query mysql_unbuffered_query mysql_db_query mysql_list_dbs mysql_list_tables mysql_list_fields mysql_list_processes mysql_error mysql_errno mysql_affected_rows mysql_insert_id mysql_result mysql_num_rows mysql_num_fields mysql_fetch_row mysql_fetch_array mysql_fetch_assoc mysql_fetch_object mysql_data_seek mysql_fetch_lengths mysql_fetch_field mysql_field_seek mysql_free_result mysql_field_name mysql_field_table mysql_field_len mysql_field_type mysql_field_flags mysql_escape_string mysql_real_escape_string mysql_stat mysql_thread_id mysql_client_encoding mysql_get_client_info mysql_get_host_info mysql_get_proto_info mysql_get_server_info mysql_info mysql mysql_fieldname mysql_fieldtable mysql_fieldlen mysql_fieldtype mysql_fieldflags mysql_selectdb mysql_createdb mysql_dropdb mysql_freeresult mysql_numfields mysql_numrows mysql_listdbs mysql_listtables mysql_listfields mysql_db_name mysql_dbname mysql_tablename mysql_table_name pg_connect pg_pconnect pg_close pg_connection_status pg_connection_busy pg_connection_reset pg_host pg_dbname pg_port pg_tty pg_options pg_ping pg_query pg_send_query pg_cancel_query pg_fetch_result pg_fetch_row pg_fetch_assoc pg_fetch_array pg_fetch_object pg_fetch_all pg_affected_rows pg_get_result pg_result_seek pg_result_status pg_free_result pg_last_oid pg_num_rows pg_num_fields pg_field_name pg_field_num pg_field_size pg_field_type pg_field_prtlen pg_field_is_null pg_get_notify pg_get_pid pg_result_error pg_last_error pg_last_notice pg_put_line pg_end_copy pg_copy_to pg_copy_from pg_trace pg_untrace pg_lo_create pg_lo_unlink pg_lo_open pg_lo_close pg_lo_read pg_lo_write pg_lo_read_all pg_lo_import pg_lo_export pg_lo_seek pg_lo_tell pg_escape_string pg_escape_bytea pg_unescape_bytea pg_client_encoding pg_set_client_encoding pg_meta_data pg_convert pg_insert pg_update pg_delete pg_select pg_exec pg_getlastoid pg_cmdtuples pg_errormessage pg_numrows pg_numfields pg_fieldname pg_fieldsize pg_fieldtype pg_fieldnum pg_fieldprtlen pg_fieldisnull pg_freeresult pg_result pg_loreadall pg_locreate pg_lounlink pg_loopen pg_loclose pg_loread pg_lowrite pg_loimport pg_loexport http_response_code get_declared_traits getimagesizefromstring socket_import_stream stream_set_chunk_size trait_exists header_register_callback class_uses session_status session_register_shutdown echo print global static exit array empty eval isset unset die include require include_once require_once json_decode json_encode json_last_error json_last_error_msg curl_close curl_copy_handle curl_errno curl_error curl_escape curl_exec curl_file_create curl_getinfo curl_init curl_multi_add_handle curl_multi_close curl_multi_exec curl_multi_getcontent curl_multi_info_read curl_multi_init curl_multi_remove_handle curl_multi_select curl_multi_setopt curl_multi_strerror curl_pause curl_reset curl_setopt_array curl_setopt curl_share_close curl_share_init curl_share_setopt curl_strerror curl_unescape curl_version mysqli_affected_rows mysqli_autocommit mysqli_change_user mysqli_character_set_name mysqli_close mysqli_commit mysqli_connect_errno mysqli_connect_error mysqli_connect mysqli_data_seek mysqli_debug mysqli_dump_debug_info mysqli_errno mysqli_error_list mysqli_error mysqli_fetch_all mysqli_fetch_array mysqli_fetch_assoc mysqli_fetch_field_direct mysqli_fetch_field mysqli_fetch_fields mysqli_fetch_lengths mysqli_fetch_object mysqli_fetch_row mysqli_field_count mysqli_field_seek mysqli_field_tell mysqli_free_result mysqli_get_charset mysqli_get_client_info mysqli_get_client_stats mysqli_get_client_version mysqli_get_connection_stats mysqli_get_host_info mysqli_get_proto_info mysqli_get_server_info mysqli_get_server_version mysqli_info mysqli_init mysqli_insert_id mysqli_kill mysqli_more_results mysqli_multi_query mysqli_next_result mysqli_num_fields mysqli_num_rows mysqli_options mysqli_ping mysqli_prepare mysqli_query mysqli_real_connect mysqli_real_escape_string mysqli_real_query mysqli_reap_async_query mysqli_refresh mysqli_rollback mysqli_select_db mysqli_set_charset mysqli_set_local_infile_default mysqli_set_local_infile_handler mysqli_sqlstate mysqli_ssl_set mysqli_stat mysqli_stmt_init mysqli_store_result mysqli_thread_id mysqli_thread_safe mysqli_use_result mysqli_warning_count\"),\nmultiLineStrings:!0,hooks:{$:function(c){c.eatWhile(/[\\w\\$_]/);return\"variable-2\"},\"<\":function(c,a){var d;if(d=c.match(/<<\\s*/)){var e=c.eat(/['\"]/);c.eatWhile(/[\\w\\.]/);d=c.current().slice(d[0].length+(e?2:1));e&&c.eat(e);if(d)return(a.tokStack||(a.tokStack=[])).push(d,0),a.tokenize=k(d,\"'\"!=e),\"string\"}return!1},\"#\":function(c){for(;!c.eol()&&!c.match(\"?>\",!1);)c.next();return\"comment\"},\"/\":function(c){if(c.eat(\"/\")){for(;!c.eol()&&!c.match(\"?>\",!1);)c.next();return\"comment\"}return!1},'\"':function(c,\na){(a.tokStack||(a.tokStack=[])).push('\"',0);a.tokenize=k('\"');return\"string\"},\"{\":function(c,a){a.tokStack&&a.tokStack.length&&a.tokStack[a.tokStack.length-1]++;return!1},\"}\":function(c,a){a.tokStack&&0<a.tokStack.length&&!--a.tokStack[a.tokStack.length-1]&&(a.tokenize=k(a.tokStack[a.tokStack.length-2]));return!1}}};g.defineMode(\"php\",function(c,a){var d=g.getMode(c,\"text/html\"),e=g.getMode(c,n);return{startState:function(){var f=g.startState(d),b=a.startOpen?g.startState(e):null;return{html:f,php:b,\ncurMode:a.startOpen?e:d,curState:a.startOpen?b:f,pending:null}},copyState:function(f){var b=g.copyState(d,f.html),a=f.php,a=a&&g.copyState(e,a);return{html:b,php:a,curMode:f.curMode,curState:f.curMode==d?b:a,pending:f.pending}},token:function(a,b){var c=b.curMode==e;a.sol()&&b.pending&&'\"'!=b.pending&&\"'\"!=b.pending&&(b.pending=null);if(c)return c&&null==b.php.tokenize&&a.match(\"?>\")?(b.curMode=d,b.curState=b.html,b.php.context.prev||(b.php=null),\"meta\"):e.token(a,b.curState);if(a.match(/^<\\?\\w*/))return b.curMode=\ne,b.php||(b.php=g.startState(e,d.indent(b.html,\"\"))),b.curState=b.php,\"meta\";if('\"'==b.pending||\"'\"==b.pending){for(;!a.eol()&&a.next()!=b.pending;);c=\"string\"}else b.pending&&a.pos<b.pending.end?(a.pos=b.pending.end,c=b.pending.style):c=d.token(a,b.curState);b.pending&&(b.pending=null);var f=a.current(),h=f.search(/<\\?/),k;-1!=h&&(\"string\"==c&&(k=f.match(/[\\'\\\"]$/))&&!/\\?>/.test(f)?b.pending=k[0]:b.pending={end:a.pos,style:c},a.backUp(f.length-h));return c},indent:function(a,b){return a.curMode!=\ne&&/^\\s*<\\//.test(b)||a.curMode==e&&/^\\?>/.test(b)?d.indent(a.html,b):a.curMode.indent(a.curState,b)},blockCommentStart:\"/*\",blockCommentEnd:\"*/\",lineComment:\"//\",innerMode:function(a){return{state:a.curState,mode:a.curMode}}}},\"htmlmixed\",\"clike\");g.defineMIME(\"application/x-httpd-php\",\"php\");g.defineMIME(\"application/x-httpd-php-open\",{name:\"php\",startOpen:!0});g.defineMIME(\"text/x-php\",n)});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/pig/pig.js",
    "content": "'use strict';(function(d){\"object\"==typeof exports&&\"object\"==typeof module?d(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],d):d(CodeMirror)})(function(d){d.defineMode(\"pig\",function(d,a){function g(b,f){for(var c=!1,a;a=b.next();){if(\"/\"==a&&c){f.tokenize=e;break}c=\"*\"==a}return\"comment\"}function n(b){return function(a,c){for(var f=!1,d,g=!1;null!=(d=a.next());){if(d==b&&!f){g=!0;break}f=!f&&\"\\\\\"==d}if(g||!f&&!p)c.tokenize=e;return\"error\"}}\nfunction e(b,a){var c=b.next();if('\"'==c||\"'\"==c)return c=n(c),a.tokenize=c,c(b,a);if(/[\\[\\]{}\\(\\),;\\.]/.test(c))return null;if(/\\d/.test(c))return b.eatWhile(/[\\w\\.]/),\"number\";if(\"/\"==c){if(b.eat(\"*\"))return a.tokenize=g,g(b,a);b.eatWhile(h);return\"operator\"}if(\"-\"==c){if(b.eat(\"-\"))return b.skipToEnd(),\"comment\";b.eatWhile(h);return\"operator\"}if(h.test(c))return b.eatWhile(h),\"operator\";b.eatWhile(/[\\w\\$_]/);return k&&k.propertyIsEnumerable(b.current().toUpperCase())&&!b.eat(\")\")&&!b.eat(\".\")?\n\"keyword\":l&&l.propertyIsEnumerable(b.current().toUpperCase())?\"variable-2\":m&&m.propertyIsEnumerable(b.current().toUpperCase())?\"variable-3\":\"variable\"}var k=a.keywords,l=a.builtins,m=a.types,p=a.multiLineStrings,h=/[*+\\-%<>=&?:\\/!|]/;return{startState:function(){return{tokenize:e,startOfLine:!0}},token:function(b,a){return b.eatSpace()?null:a.tokenize(b,a)}}});(function(){function e(a){var d={};a=a.split(\" \");for(var e=0;e<a.length;++e)d[a[e]]=!0;return d}d.defineMIME(\"text/x-pig\",{name:\"pig\",builtins:e(\"ABS ACOS ARITY ASIN ATAN AVG BAGSIZE BINSTORAGE BLOOM BUILDBLOOM CBRT CEIL CONCAT COR COS COSH COUNT COUNT_STAR COV CONSTANTSIZE CUBEDIMENSIONS DIFF DISTINCT DOUBLEABS DOUBLEAVG DOUBLEBASE DOUBLEMAX DOUBLEMIN DOUBLEROUND DOUBLESUM EXP FLOOR FLOATABS FLOATAVG FLOATMAX FLOATMIN FLOATROUND FLOATSUM GENERICINVOKER INDEXOF INTABS INTAVG INTMAX INTMIN INTSUM INVOKEFORDOUBLE INVOKEFORFLOAT INVOKEFORINT INVOKEFORLONG INVOKEFORSTRING INVOKER ISEMPTY JSONLOADER JSONMETADATA JSONSTORAGE LAST_INDEX_OF LCFIRST LOG LOG10 LOWER LONGABS LONGAVG LONGMAX LONGMIN LONGSUM MAX MIN MAPSIZE MONITOREDUDF NONDETERMINISTIC OUTPUTSCHEMA  PIGSTORAGE PIGSTREAMING RANDOM REGEX_EXTRACT REGEX_EXTRACT_ALL REPLACE ROUND SIN SINH SIZE SQRT STRSPLIT SUBSTRING SUM STRINGCONCAT STRINGMAX STRINGMIN STRINGSIZE TAN TANH TOBAG TOKENIZE TOMAP TOP TOTUPLE TRIM TEXTLOADER TUPLESIZE UCFIRST UPPER UTF8STORAGECONVERTER \"),\nkeywords:e(\"VOID IMPORT RETURNS DEFINE LOAD FILTER FOREACH ORDER CUBE DISTINCT COGROUP JOIN CROSS UNION SPLIT INTO IF OTHERWISE ALL AS BY USING INNER OUTER ONSCHEMA PARALLEL PARTITION GROUP AND OR NOT GENERATE FLATTEN ASC DESC IS STREAM THROUGH STORE MAPREDUCE SHIP CACHE INPUT OUTPUT STDERROR STDIN STDOUT LIMIT SAMPLE LEFT RIGHT FULL EQ GT LT GTE LTE NEQ MATCHES TRUE FALSE DUMP\"),types:e(\"BOOLEAN INT LONG FLOAT DOUBLE CHARARRAY BYTEARRAY BAG TUPLE MAP \")});d.registerHelper(\"hintWords\",\"pig\",\"ABS ACOS ARITY ASIN ATAN AVG BAGSIZE BINSTORAGE BLOOM BUILDBLOOM CBRT CEIL CONCAT COR COS COSH COUNT COUNT_STAR COV CONSTANTSIZE CUBEDIMENSIONS DIFF DISTINCT DOUBLEABS DOUBLEAVG DOUBLEBASE DOUBLEMAX DOUBLEMIN DOUBLEROUND DOUBLESUM EXP FLOOR FLOATABS FLOATAVG FLOATMAX FLOATMIN FLOATROUND FLOATSUM GENERICINVOKER INDEXOF INTABS INTAVG INTMAX INTMIN INTSUM INVOKEFORDOUBLE INVOKEFORFLOAT INVOKEFORINT INVOKEFORLONG INVOKEFORSTRING INVOKER ISEMPTY JSONLOADER JSONMETADATA JSONSTORAGE LAST_INDEX_OF LCFIRST LOG LOG10 LOWER LONGABS LONGAVG LONGMAX LONGMIN LONGSUM MAX MIN MAPSIZE MONITOREDUDF NONDETERMINISTIC OUTPUTSCHEMA  PIGSTORAGE PIGSTREAMING RANDOM REGEX_EXTRACT REGEX_EXTRACT_ALL REPLACE ROUND SIN SINH SIZE SQRT STRSPLIT SUBSTRING SUM STRINGCONCAT STRINGMAX STRINGMIN STRINGSIZE TAN TANH TOBAG TOKENIZE TOMAP TOP TOTUPLE TRIM TEXTLOADER TUPLESIZE UCFIRST UPPER UTF8STORAGECONVERTER BOOLEAN INT LONG FLOAT DOUBLE CHARARRAY BYTEARRAY BAG TUPLE MAP VOID IMPORT RETURNS DEFINE LOAD FILTER FOREACH ORDER CUBE DISTINCT COGROUP JOIN CROSS UNION SPLIT INTO IF OTHERWISE ALL AS BY USING INNER OUTER ONSCHEMA PARALLEL PARTITION GROUP AND OR NOT GENERATE FLATTEN ASC DESC IS STREAM THROUGH STORE MAPREDUCE SHIP CACHE INPUT OUTPUT STDERROR STDIN STDOUT LIMIT SAMPLE LEFT RIGHT FULL EQ GT LT GTE LTE NEQ MATCHES TRUE FALSE DUMP\".split(\" \"))})()});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/powershell/powershell.js",
    "content": "'use strict';(function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"codemirror\")):\"function\"==typeof define&&define.amd?define([\"codemirror\"],e):e(window.CodeMirror)})(function(e){e.defineMode(\"powershell\",function(){function e(b,a){a=a||{};var c=void 0!==a.prefix?a.prefix:\"^\";a=void 0!==a.suffix?a.suffix:\"\\\\b\";for(var d=0;d<b.length;d++)b[d]=b[d]instanceof RegExp?b[d].source:b[d].replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g,\"\\\\$&\");return new RegExp(c+\"(\"+b.join(\"|\")+\")\"+a,\"i\")}function f(b,\na){var c=a.returnStack[a.returnStack.length-1];if(c&&c.shouldReturnFrom(a))return a.tokenize=c.tokenize,a.returnStack.pop(),a.tokenize(b,a);if(b.eatSpace())return null;if(b.eat(\"(\"))return a.bracketNesting+=1,\"punctuation\";if(b.eat(\")\"))return--a.bracketNesting,\"punctuation\";for(var d in n)if(b.match(n[d]))return d;c=b.next();if(\"'\"===c){a:{for(;null!=(c=b.peek());)if(b.next(),\"'\"===c&&!b.eat(\"'\")){a.tokenize=f;b=\"string\";break a}b=\"error\"}return b}if(\"$\"===c)return h(b,a);if('\"'===c)return p(b,a);\nif(\"<\"===c&&b.eat(\"#\"))return a.tokenize=q,q(b,a);if(\"#\"===c)return b.skipToEnd(),\"comment\";if(\"@\"===c){if((c=b.eat(/[\"']/))&&b.eol())return a.tokenize=g,a.startQuote=c[0],g(b,a);if(b.peek().match(/[({]/))return\"punctuation\";if(b.peek().match(k))return h(b,a)}return\"error\"}function p(b,a){for(var c;null!=(c=b.peek());){if(\"$\"===c)return a.tokenize=u,\"string\";b.next();if(\"`\"===c)b.next();else if('\"'===c&&!b.eat('\"'))return a.tokenize=f,\"string\"}return\"error\"}function u(b,a){return r(b,a,p)}function v(b,\na){a.tokenize=g;a.startQuote='\"';return g(b,a)}function w(b,a){return r(b,a,v)}function r(b,a,c){if(b.match(\"$(\")){var d=a.bracketNesting;a.returnStack.push({shouldReturnFrom:function(a){return a.bracketNesting===d},tokenize:c});a.tokenize=f;a.bracketNesting+=1;return\"punctuation\"}b.next();a.returnStack.push({shouldReturnFrom:function(){return!0},tokenize:c});a.tokenize=h;return a.tokenize(b,a)}function q(b,a){for(var c=!1,d;null!=(d=b.next());){if(c&&\">\"==d){a.tokenize=f;break}c=\"#\"===d}return\"comment\"}\nfunction h(b,a){var c=b.peek();if(b.eat(\"{\"))return a.tokenize=t,t(b,a);if(void 0!=c&&c.match(k))return b.eatWhile(k),a.tokenize=f,\"variable-2\";a.tokenize=f;return\"error\"}function t(b,a){for(var c;null!=(c=b.next());)if(\"}\"===c){a.tokenize=f;break}return\"variable-2\"}function g(b,a){var c=a.startQuote;if(b.sol()&&b.match(new RegExp(c+\"@\")))a.tokenize=f;else if('\"'===c)for(;!b.eol();){c=b.peek();if(\"$\"===c){a.tokenize=w;break}b.next();\"`\"===c&&b.next()}else b.skipToEnd();return\"string\"}var k=/[\\w\\-:]/,\nx=e([/begin|break|catch|continue|data|default|do|dynamicparam/,/else|elseif|end|exit|filter|finally|for|foreach|from|function|if|in/,/param|process|return|switch|throw|trap|try|until|where|while/],{suffix:\"(?=[^A-Za-z\\\\d\\\\-_]|$)\"}),l=e([\"f\",/b?not/,/[ic]?split/,\"join\",/is(not)?/,\"as\",/[ic]?(eq|ne|[gl][te])/,/[ic]?(not)?(like|match|contains)/,/[ic]?replace/,/b?(and|or|xor)/],{prefix:\"-\"}),l=e([l,/[+\\-*\\/%]=|\\+\\+|--|\\.\\.|[+\\-*&^%:=!|\\/]|<(?!#)|(?!#)>/],{suffix:\"\"}),m=e([/Add-(Computer|Content|History|Member|PSSnapin|Type)/,\n/Checkpoint-Computer/,/Clear-(Content|EventLog|History|Host|Item(Property)?|Variable)/,/Compare-Object/,/Complete-Transaction/,/Connect-PSSession/,/ConvertFrom-(Csv|Json|SecureString|StringData)/,/Convert-Path/,/ConvertTo-(Csv|Html|Json|SecureString|Xml)/,/Copy-Item(Property)?/,/Debug-Process/,/Disable-(ComputerRestore|PSBreakpoint|PSRemoting|PSSessionConfiguration)/,/Disconnect-PSSession/,/Enable-(ComputerRestore|PSBreakpoint|PSRemoting|PSSessionConfiguration)/,/(Enter|Exit)-PSSession/,/Export-(Alias|Clixml|Console|Counter|Csv|FormatData|ModuleMember|PSSession)/,\n/ForEach-Object/,/Format-(Custom|List|Table|Wide)/,/Get-(Acl|Alias|AuthenticodeSignature|ChildItem|Command|ComputerRestorePoint|Content|ControlPanelItem|Counter|Credential|Culture|Date|Event|EventLog|EventSubscriber|ExecutionPolicy|FormatData|Help|History|Host|HotFix|Item|ItemProperty|Job|Location|Member|Module|PfxCertificate|Process|PSBreakpoint|PSCallStack|PSDrive|PSProvider|PSSession|PSSessionConfiguration|PSSnapin|Random|Service|TraceSource|Transaction|TypeData|UICulture|Unique|Variable|Verb|WinEvent|WmiObject)/,\n/Group-Object/,/Import-(Alias|Clixml|Counter|Csv|LocalizedData|Module|PSSession)/,/ImportSystemModules/,/Invoke-(Command|Expression|History|Item|RestMethod|WebRequest|WmiMethod)/,/Join-Path/,/Limit-EventLog/,/Measure-(Command|Object)/,/Move-Item(Property)?/,/New-(Alias|Event|EventLog|Item(Property)?|Module|ModuleManifest|Object|PSDrive|PSSession|PSSessionConfigurationFile|PSSessionOption|PSTransportOption|Service|TimeSpan|Variable|WebServiceProxy|WinEvent)/,/Out-(Default|File|GridView|Host|Null|Printer|String)/,\n/Pause/,/(Pop|Push)-Location/,/Read-Host/,/Receive-(Job|PSSession)/,/Register-(EngineEvent|ObjectEvent|PSSessionConfiguration|WmiEvent)/,/Remove-(Computer|Event|EventLog|Item(Property)?|Job|Module|PSBreakpoint|PSDrive|PSSession|PSSnapin|TypeData|Variable|WmiObject)/,/Rename-(Computer|Item(Property)?)/,/Reset-ComputerMachinePassword/,/Resolve-Path/,/Restart-(Computer|Service)/,/Restore-Computer/,/Resume-(Job|Service)/,/Save-Help/,/Select-(Object|String|Xml)/,/Send-MailMessage/,/Set-(Acl|Alias|AuthenticodeSignature|Content|Date|ExecutionPolicy|Item(Property)?|Location|PSBreakpoint|PSDebug|PSSessionConfiguration|Service|StrictMode|TraceSource|Variable|WmiInstance)/,\n/Show-(Command|ControlPanelItem|EventLog)/,/Sort-Object/,/Split-Path/,/Start-(Job|Process|Service|Sleep|Transaction|Transcript)/,/Stop-(Computer|Job|Process|Service|Transcript)/,/Suspend-(Job|Service)/,/TabExpansion2/,/Tee-Object/,/Test-(ComputerSecureChannel|Connection|ModuleManifest|Path|PSSessionConfigurationFile)/,/Trace-Command/,/Unblock-File/,/Undo-Transaction/,/Unregister-(Event|PSSessionConfiguration)/,/Update-(FormatData|Help|List|TypeData)/,/Use-Transaction/,/Wait-(Event|Job|Process)/,/Where-Object/,\n/Write-(Debug|Error|EventLog|Host|Output|Progress|Verbose|Warning)/,/cd|help|mkdir|more|oss|prompt/,/ac|asnp|cat|cd|chdir|clc|clear|clhy|cli|clp|cls|clv|cnsn|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|dnsn|ebp/,/echo|epal|epcsv|epsn|erase|etsn|exsn|fc|fl|foreach|ft|fw|gal|gbp|gc|gci|gcm|gcs|gdr|ghy|gi|gjb|gl|gm|gmo|gp|gps/,/group|gsn|gsnp|gsv|gu|gv|gwmi|h|history|icm|iex|ihy|ii|ipal|ipcsv|ipmo|ipsn|irm|ise|iwmi|iwr|kill|lp|ls|man|md/,/measure|mi|mount|move|mp|mv|nal|ndr|ni|nmo|npssc|nsn|nv|ogv|oh|popd|ps|pushd|pwd|r|rbp|rcjb|rcsn|rd|rdr|ren|ri/,\n/rjb|rm|rmdir|rmo|rni|rnp|rp|rsn|rsnp|rujb|rv|rvpa|rwmi|sajb|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls/,/sort|sp|spjb|spps|spsv|start|sujb|sv|swmi|tee|trcm|type|where|wjb|write/],{prefix:\"\",suffix:\"\"}),y=e([/[$?^_]|Args|ConfirmPreference|ConsoleFileName|DebugPreference|Error|ErrorActionPreference|ErrorView|ExecutionContext/,/FormatEnumerationLimit|Home|Host|Input|MaximumAliasCount|MaximumDriveCount|MaximumErrorCount|MaximumFunctionCount/,/MaximumHistoryCount|MaximumVariableCount|MyInvocation|NestedPromptLevel|OutputEncoding|Pid|Profile|ProgressPreference/,\n/PSBoundParameters|PSCommandPath|PSCulture|PSDefaultParameterValues|PSEmailServer|PSHome|PSScriptRoot|PSSessionApplicationName/,/PSSessionConfigurationName|PSSessionOption|PSUICulture|PSVersionTable|Pwd|ShellId|StackTrace|VerbosePreference/,/WarningPreference|WhatIfPreference/,/Event|EventArgs|EventSubscriber|Sender/,/Matches|Ofs|ForEach|LastExitCode|PSCmdlet|PSItem|PSSenderInfo|This/,/true|false|null/],{prefix:\"\\\\$\",suffix:\"\"}),m=e([/[A-Z]:|%|\\?/i,m,y],{suffix:\"(?=[^A-Za-z\\\\d\\\\-_]|$)\"}),n={keyword:x,\nnumber:/^((0x[\\da-f]+)|((\\d+\\.\\d+|\\d\\.|\\.\\d+|\\d+)(e[\\+\\-]?\\d+)?))[ld]?([kmgtp]b)?/i,operator:l,builtin:m,punctuation:/[\\[\\]{},;`\\.]|@[({]/,identifier:/^[A-Za-z\\_][A-Za-z\\-\\_\\d]*\\b/};return{startState:function(){return{returnStack:[],bracketNesting:0,tokenize:f}},token:function(b,a){return a.tokenize(b,a)},blockCommentStart:\"<#\",blockCommentEnd:\"#>\",lineComment:\"#\",fold:\"brace\"}});e.defineMIME(\"application/x-powershell\",\"powershell\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/properties/properties.js",
    "content": "'use strict';(function(b){\"object\"==typeof exports&&\"object\"==typeof module?b(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],b):b(CodeMirror)})(function(b){b.defineMode(\"properties\",function(){return{token:function(d,a){var b=d.sol()||a.afterSection,c=d.eol();a.afterSection=!1;b&&(a.nextMultiline?(a.inMultiline=!0,a.nextMultiline=!1):a.position=\"def\");c&&!a.nextMultiline&&(a.inMultiline=!1,a.position=\"def\");if(b)for(;d.eatSpace(););c=d.next();\nif(!b||\"#\"!==c&&\"!\"!==c&&\";\"!==c){if(b&&\"[\"===c)return a.afterSection=!0,d.skipTo(\"]\"),d.eat(\"]\"),\"header\";if(\"=\"===c||\":\"===c)return a.position=\"quote\",null;\"\\\\\"===c&&\"quote\"===a.position&&d.eol()&&(a.nextMultiline=!0)}else return a.position=\"comment\",d.skipToEnd(),\"comment\";return a.position},startState:function(){return{position:\"def\",nextMultiline:!1,inMultiline:!1,afterSection:!1}}}});b.defineMIME(\"text/x-properties\",\"properties\");b.defineMIME(\"text/x-ini\",\"properties\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/protobuf/protobuf.js",
    "content": "'use strict';(function(b){\"object\"==typeof exports&&\"object\"==typeof module?b(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],b):b(CodeMirror)})(function(b){function d(a){if(a.eatSpace())return null;if(a.match(\"//\"))return a.skipToEnd(),\"comment\";if(a.match(/^[0-9\\.+-]/,!1)&&(a.match(/^[+-]?0x[0-9a-fA-F]+/)||a.match(/^[+-]?\\d*\\.\\d+([EeDd][+-]?\\d+)?/)||a.match(/^[+-]?\\d+([EeDd][+-]?\\d+)?/)))return\"number\";if(a.match(/^\"([^\"]|(\"\"))*\"/)||a.match(/^'([^']|(''))*'/))return\"string\";\nif(a.match(e))return\"keyword\";if(a.match(f))return\"variable\";a.next();return null}var c=\"package message import syntax required optional repeated reserved default extensions packed bool bytes double enum float string int32 int64 uint32 uint64 sint32 sint64 fixed32 fixed64 sfixed32 sfixed64\".split(\" \"),e=new RegExp(\"^((\"+c.join(\")|(\")+\"))\\\\b\",\"i\");b.registerHelper(\"hintWords\",\"protobuf\",c);var f=/^[_A-Za-z\\u00a1-\\uffff][_A-Za-z0-9\\u00a1-\\uffff]*/;b.defineMode(\"protobuf\",function(){return{token:d}});\nb.defineMIME(\"text/x-protobuf\",\"protobuf\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/pug/pug.js",
    "content": "'use strict';(function(d){\"object\"==typeof exports&&\"object\"==typeof module?d(require(\"../../lib/codemirror\"),require(\"../javascript/javascript\"),require(\"../css/css\"),require(\"../htmlmixed/htmlmixed\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\",\"../javascript/javascript\",\"../css/css\",\"../htmlmixed/htmlmixed\"],d):d(CodeMirror)})(function(d){d.defineMode(\"pug\",function(e){function g(){this.javaScriptArguments=this.javaScriptLineExcludesColon=this.javaScriptLine=!1;this.javaScriptArgumentsDepth=\n0;this.isInterpolating=!1;this.interpolationNesting=0;this.jsState=d.startState(f);this.restOfLine=\"\";this.isEach=this.isIncludeFiltered=!1;this.scriptType=this.lastTag=\"\";this.isAttrs=!1;this.attrsNest=[];this.inAttributeName=!0;this.attributeIsType=!1;this.attrValue=\"\";this.indentOf=Infinity;this.indentToken=\"\";this.innerState=this.innerMode=null;this.innerModeForLine=!1}function k(c,b){if(c.match(\"#{\"))return b.isInterpolating=!0,b.interpolationNesting=0,\"punctuation\"}function l(c,b){if(c.match(/^:([\\w\\-]+)/)){var a;\ne&&e.innerModes&&(a=e.innerModes(c.current().substring(1)));a||(a=c.current().substring(1));\"string\"===typeof a&&(a=d.getMode(e,a));h(c,b,a);return\"atom\"}}function m(c,b){if(b.isAttrs){n[c.peek()]&&b.attrsNest.push(n[c.peek()]);if(b.attrsNest[b.attrsNest.length-1]===c.peek())b.attrsNest.pop();else if(c.eat(\")\"))return b.isAttrs=!1,\"punctuation\";if(b.inAttributeName&&c.match(/^[^=,\\)!]+/)){if(\"=\"===c.peek()||\"!\"===c.peek())b.inAttributeName=!1,b.jsState=d.startState(f),\"script\"===b.lastTag&&\"type\"===\nc.current().trim().toLowerCase()?b.attributeIsType=!0:b.attributeIsType=!1;return\"attribute\"}var a=f.token(c,b.jsState);b.attributeIsType&&\"string\"===a&&(b.scriptType=c.current().toString());if(0===b.attrsNest.length&&(\"string\"===a||\"variable\"===a||\"keyword\"===a))try{return Function(\"\",\"var x \"+b.attrValue.replace(/,\\s*$/,\"\").replace(/^!/,\"\")),b.inAttributeName=!0,b.attrValue=\"\",c.backUp(c.current().length),m(c,b)}catch(q){}b.attrValue+=c.current();return a||!0}}function h(c,b,a){a=d.mimeModes[a]||\na;a=e.innerModes?e.innerModes(a)||a:a;a=d.mimeModes[a]||a;a=d.getMode(e,a);b.indentOf=c.indentation();a&&\"null\"!==a.name?b.innerMode=a:b.indentToken=\"string\"}function p(c,b,a){if(c.indentation()>b.indentOf||b.innerModeForLine&&!c.sol()||a){if(b.innerMode)return b.innerState||(b.innerState=b.innerMode.startState?d.startState(b.innerMode,c.indentation()):{}),c.hideFirstChars(b.indentOf+2,function(){return b.innerMode.token(c,b.innerState)||!0});c.skipToEnd();return b.indentToken}c.sol()&&(b.indentOf=\nInfinity,b.indentToken=null,b.innerMode=null,b.innerState=null)}var n={\"{\":\"}\",\"(\":\")\",\"[\":\"]\"},f=d.getMode(e,\"javascript\");g.prototype.copy=function(){var c=new g;c.javaScriptLine=this.javaScriptLine;c.javaScriptLineExcludesColon=this.javaScriptLineExcludesColon;c.javaScriptArguments=this.javaScriptArguments;c.javaScriptArgumentsDepth=this.javaScriptArgumentsDepth;c.isInterpolating=this.isInterpolating;c.interpolationNesting=this.interpolationNesting;c.jsState=d.copyState(f,this.jsState);(c.innerMode=\nthis.innerMode)&&this.innerState&&(c.innerState=d.copyState(this.innerMode,this.innerState));c.restOfLine=this.restOfLine;c.isIncludeFiltered=this.isIncludeFiltered;c.isEach=this.isEach;c.lastTag=this.lastTag;c.scriptType=this.scriptType;c.isAttrs=this.isAttrs;c.attrsNest=this.attrsNest.slice();c.inAttributeName=this.inAttributeName;c.attributeIsType=this.attributeIsType;c.attrValue=this.attrValue;c.indentOf=this.indentOf;c.indentToken=this.indentToken;c.innerModeForLine=this.innerModeForLine;return c};\nreturn{startState:function(){return new g},copyState:function(c){return c.copy()},token:function(c,b){var a;(a=p(c,b))||(c.sol()&&(b.restOfLine=\"\"),b.restOfLine?(c.skipToEnd(),a=b.restOfLine,b.restOfLine=\"\"):a=void 0);if(!a)a:if(b.isInterpolating){if(\"}\"===c.peek()){if(b.interpolationNesting--,0>b.interpolationNesting){c.next();b.isInterpolating=!1;a=\"punctuation\";break a}}else\"{\"===c.peek()&&b.interpolationNesting++;a=f.token(c,b.jsState)||!0}else a=void 0;a||(b.isIncludeFiltered?(a=l(c,b),b.isIncludeFiltered=\n!1,b.restOfLine=\"string\"):a=void 0);if(!a)a:{if(b.isEach)if(c.match(/^ in\\b/)){b.javaScriptLine=!0;b.isEach=!1;a=\"keyword\";break a}else if(c.sol()||c.eol())b.isEach=!1;else if(c.next()){for(;!c.match(/^ in\\b/,!1)&&c.next(););a=\"variable\";break a}a=void 0}(a=a||m(c,b))||(c.sol()&&(b.javaScriptLine=!1,b.javaScriptLineExcludesColon=!1),b.javaScriptLine?b.javaScriptLineExcludesColon&&\":\"===c.peek()?(b.javaScriptLine=!1,b.javaScriptLineExcludesColon=!1,a=void 0):(a=f.token(c,b.jsState),c.eol()&&(b.javaScriptLine=\n!1),a=a||!0):a=void 0);a||(b.javaScriptArguments?0===b.javaScriptArgumentsDepth&&\"(\"!==c.peek()?(b.javaScriptArguments=!1,a=void 0):(\"(\"===c.peek()?b.javaScriptArgumentsDepth++:\")\"===c.peek()&&b.javaScriptArgumentsDepth--,0===b.javaScriptArgumentsDepth?(b.javaScriptArguments=!1,a=void 0):a=f.token(c,b.jsState)||!0):a=void 0);a||(b.mixinCallAfter?(b.mixinCallAfter=!1,c.match(/^\\( *[-\\w]+ *=/,!1)||(b.javaScriptArguments=!0,b.javaScriptArgumentsDepth=0),a=!0):a=void 0);a||(a=c.match(/^yield\\b/)?\"keyword\":\nvoid 0);a||(a=c.match(/^(?:doctype) *([^\\n]+)?/)?\"meta\":void 0);(a=a||k(c,b))||(c.match(/^case\\b/)?(b.javaScriptLine=!0,a=\"keyword\"):a=void 0);a||(c.match(/^when\\b/)?(b.javaScriptLine=!0,b.javaScriptLineExcludesColon=!0,a=\"keyword\"):a=void 0);a||(a=c.match(/^default\\b/)?\"keyword\":void 0);a||(c.match(/^extends?\\b/)?(b.restOfLine=\"string\",a=\"keyword\"):a=void 0);a||(c.match(/^append\\b/)?(b.restOfLine=\"variable\",a=\"keyword\"):a=void 0);a||(c.match(/^prepend\\b/)?(b.restOfLine=\"variable\",a=\"keyword\"):a=\nvoid 0);a||(c.match(/^block\\b *(?:(prepend|append)\\b)?/)?(b.restOfLine=\"variable\",a=\"keyword\"):a=void 0);a||(c.match(/^include\\b/)?(b.restOfLine=\"string\",a=\"keyword\"):a=void 0);a||(c.match(/^include:([a-zA-Z0-9\\-]+)/,!1)&&c.match(\"include\")?(b.isIncludeFiltered=!0,a=\"keyword\"):a=void 0);a||(c.match(/^mixin\\b/)?(b.javaScriptLine=!0,a=\"keyword\"):a=void 0);a||(c.match(/^\\+([-\\w]+)/)?(c.match(/^\\( *[-\\w]+ *=/,!1)||(b.javaScriptArguments=!0,b.javaScriptArgumentsDepth=0),a=\"variable\"):c.match(/^\\+#{/,!1)?\n(c.next(),b.mixinCallAfter=!0,a=k(c,b)):a=void 0);a||(c.match(/^(if|unless|else if|else)\\b/)?(b.javaScriptLine=!0,a=\"keyword\"):a=void 0);a||(c.match(/^(- *)?(each|for)\\b/)?(b.isEach=!0,a=\"keyword\"):a=void 0);a||(c.match(/^while\\b/)?(b.javaScriptLine=!0,a=\"keyword\"):a=void 0);a||((a=c.match(/^(\\w(?:[-:\\w]*\\w)?)\\/?/))?(b.lastTag=a[1].toLowerCase(),\"script\"===b.lastTag&&(b.scriptType=\"application/javascript\"),a=\"tag\"):a=void 0);(a=a||l(c,b))||(c.match(/^(!?=|-)/)?(b.javaScriptLine=!0,a=\"punctuation\"):\na=void 0);a||(a=c.match(/^#([\\w-]+)/)?\"builtin\":void 0);a||(a=c.match(/^\\.([\\w-]+)/)?\"qualifier\":void 0);a||(\"(\"==c.peek()?(c.next(),b.isAttrs=!0,b.attrsNest=[],b.inAttributeName=!0,b.attrValue=\"\",b.attributeIsType=!1,a=\"punctuation\"):a=void 0);a||(c.match(/^&attributes\\b/)?(b.javaScriptArguments=!0,b.javaScriptArgumentsDepth=0,a=\"keyword\"):a=void 0);a||(a=c.sol()&&c.eatSpace()?\"indent\":void 0);a||(c.match(/^(?:\\| ?| )([^\\n]+)/)?a=\"string\":c.match(/^(<[^\\n]*)/,!1)?(h(c,b,\"htmlmixed\"),b.innerModeForLine=\n!0,a=p(c,b,!0)):a=void 0);a||(c.match(/^ *\\/\\/(-)?([^\\n]*)/)?(b.indentOf=c.indentation(),a=b.indentToken=\"comment\"):a=void 0);a||(a=c.match(/^: */)?\"colon\":void 0);a||(c.eat(\".\")?(a=null,\"script\"===b.lastTag&&-1!=b.scriptType.toLowerCase().indexOf(\"javascript\")?a=b.scriptType.toLowerCase().replace(/\"|'/g,\"\"):\"style\"===b.lastTag&&(a=\"css\"),h(c,b,a),a=\"dot\"):a=void 0);(b=a)||(c.next(),b=null);c=b;return!0===c?null:c}}},\"javascript\",\"css\",\"htmlmixed\");d.defineMIME(\"text/x-pug\",\"pug\");d.defineMIME(\"text/x-jade\",\n\"pug\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/puppet/puppet.js",
    "content": "'use strict';(function(c){\"object\"==typeof exports&&\"object\"==typeof module?c(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],c):c(CodeMirror)})(function(c){c.defineMode(\"puppet\",function(){function c(a,b){b=b.split(\" \");for(var e=0;e<b.length;e++)g[b[e]]=a}function k(a,b){for(var e,c,f=!1;!a.eol()&&(e=a.next())!=b.pending;){if(\"$\"===e&&\"\\\\\"!=c&&'\"'==b.pending){f=!0;break}c=e}f&&a.backUp(1);b.continueString=e==b.pending?!1:!0;return\"string\"}function h(a,\nb){var c=a.match(/[\\w]+/,!1),h=a.match(/(\\s+)?\\w+\\s+=>.*/,!1),f=a.match(/(\\s+)?[\\w:_]+(\\s+)?{/,!1),l=a.match(/(\\s+)?[@]{1,2}[\\w:_]+(\\s+)?{/,!1),d=a.next();if(\"$\"===d)return a.match(m)?b.continueString?\"variable-2\":\"variable\":\"error\";if(b.continueString)return a.backUp(1),k(a,b);if(b.inDefinition){if(a.match(/(\\s+)?[\\w:_]+(\\s+)?/))return\"def\";a.match(/\\s+{/);b.inDefinition=!1}if(b.inInclude)return a.match(/(\\s+)?\\S+(\\s+)?/),b.inInclude=!1,\"def\";if(a.match(/(\\s+)?\\w+\\(/))return a.backUp(1),\"def\";if(h)return a.match(/(\\s+)?\\w+/),\n\"tag\";if(c&&g.hasOwnProperty(c))return a.backUp(1),a.match(/[\\w]+/),a.match(/\\s+\\S+\\s+{/,!1)&&(b.inDefinition=!0),\"include\"==c&&(b.inInclude=!0),g[c];if(/(^|\\s+)[A-Z][\\w:_]+/.test(c))return a.backUp(1),a.match(/(^|\\s+)[A-Z][\\w:_]+/),\"def\";if(f)return a.match(/(\\s+)?[\\w:_]+/),\"def\";if(l)return a.match(/(\\s+)?[@]{1,2}/),\"special\";if(\"#\"==d)return a.skipToEnd(),\"comment\";if(\"'\"==d||'\"'==d)return b.pending=d,k(a,b);if(\"{\"==d||\"}\"==d)return\"bracket\";if(\"/\"==d)return a.match(/.*?\\//),\"variable-3\";if(d.match(/[0-9]/))return a.eatWhile(/[0-9]+/),\n\"number\";if(\"=\"==d)return\">\"==a.peek()&&a.next(),\"operator\";a.eatWhile(/[\\w-]/);return null}var g={},m=/({)?([a-z][a-z0-9_]*)?((::[a-z][a-z0-9_]*)*::)?[a-zA-Z0-9_]+(})?/;c(\"keyword\",\"class define site node include import inherits\");c(\"keyword\",\"case if else in and elsif default or\");c(\"atom\",\"false true running present absent file directory undef\");c(\"builtin\",\"action augeas burst chain computer cron destination dport exec file filebucket group host icmp iniface interface jump k5login limit log_level log_prefix macauthorization mailalias maillist mcx mount nagios_command nagios_contact nagios_contactgroup nagios_host nagios_hostdependency nagios_hostescalation nagios_hostextinfo nagios_hostgroup nagios_service nagios_servicedependency nagios_serviceescalation nagios_serviceextinfo nagios_servicegroup nagios_timeperiod name notify outiface package proto reject resources router schedule scheduled_task selboolean selmodule service source sport ssh_authorized_key sshkey stage state table tidy todest toports tosource user vlan yumrepo zfs zone zpool\");\nreturn{startState:function(){return{inDefinition:!1,inInclude:!1,continueString:!1,pending:!1}},token:function(a,b){return a.eatSpace()?null:h(a,b)}}});c.defineMIME(\"text/x-puppet\",\"puppet\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/python/python.js",
    "content": "'use strict';(function(g){\"object\"==typeof exports&&\"object\"==typeof module?g(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],g):g(CodeMirror)})(function(g){function n(f){return new RegExp(\"^((\"+f.join(\")|(\")+\"))\\\\b\")}function f(f){return f.scopes[f.scopes.length-1]}var A=n([\"and\",\"or\",\"not\",\"is\"]),r=\"as assert break class continue def del elif else except finally for from global if import lambda pass raise return try while with yield in\".split(\" \"),\nt=\"abs all any bin bool bytearray callable chr classmethod compile complex delattr dict dir divmod enumerate eval filter float format frozenset getattr globals hasattr hash help hex id input int isinstance issubclass iter len list locals map max memoryview min next object oct open ord pow property range repr reversed round set setattr slice sorted staticmethod str sum super tuple type vars zip __import__ NotImplemented Ellipsis __debug__\".split(\" \");g.registerHelper(\"hintWords\",\"python\",r.concat(t));\ng.defineMode(\"python\",function(q,c){function l(a,b){a.sol()&&(b.indent=a.indentation());if(a.sol()&&\"py\"==f(b).type){var d=f(b).offset;if(a.eatSpace()){var e=a.indentation();e>d?u(b):e<d&&v(a,b)&&(b.errorToken=!0);return null}e=w(a,b);0<d&&v(a,b)&&(e+=\" error\");return e}return w(a,b)}function w(a,b){if(a.eatSpace())return null;if(\"#\"==a.peek())return a.skipToEnd(),\"comment\";if(a.match(/^[0-9\\.]/,!1)){var d=!1;a.match(/^\\d*\\.\\d+(e[\\+\\-]?\\d+)?/i)&&(d=!0);a.match(/^\\d+\\.\\d*/)&&(d=!0);a.match(/^\\.\\d+/)&&\n(d=!0);if(d)return a.eat(/J/i),\"number\";d=!1;a.match(/^0x[0-9a-f]+/i)&&(d=!0);a.match(/^0b[01]+/i)&&(d=!0);a.match(/^0o[0-7]+/i)&&(d=!0);a.match(/^[1-9]\\d*(e[\\+\\-]?\\d+)?/)&&(a.eat(/J/i),d=!0);a.match(/^0(?![\\dx])/i)&&(d=!0);if(d)return a.eat(/L/i),\"number\"}if(a.match(x))return b.tokenize=B(a.current()),b.tokenize(a,b);if(a.match(C)||a.match(D))return\"punctuation\";if(a.match(E)||a.match(y))return\"operator\";if(a.match(F))return\"punctuation\";if(\".\"==b.lastToken&&a.match(m))return\"property\";if(a.match(G)||\na.match(A))return\"keyword\";if(a.match(H))return\"builtin\";if(a.match(/^(self|cls)\\b/))return\"variable-2\";if(a.match(m))return\"def\"==b.lastToken||\"class\"==b.lastToken?\"def\":\"variable\";a.next();return\"error\"}function B(a){function b(b,f){for(;!b.eol();)if(b.eatWhile(/[^'\"\\\\]/),b.eat(\"\\\\\")){if(b.next(),d&&b.eol())return\"string\"}else{if(b.match(a))return f.tokenize=l,\"string\";b.eat(/['\"]/)}if(d){if(c.singleLineStringErrors)return\"error\";f.tokenize=l}return\"string\"}for(;0<=\"rubf\".indexOf(a.charAt(0).toLowerCase());)a=\na.substr(1);var d=1==a.length;b.isString=!0;return b}function u(a){for(;\"py\"!=f(a).type;)a.scopes.pop();a.scopes.push({offset:f(a).offset+q.indentUnit,type:\"py\",align:null})}function v(a,b){for(a=a.indentation();1<b.scopes.length&&f(b).offset>a;){if(\"py\"!=f(b).type)return!0;b.scopes.pop()}return f(b).offset!=a}var F=c.singleDelimiters||/^[\\(\\)\\[\\]\\{\\}@,:`=;\\.]/,E=c.doubleOperators||/^([!<>]==|<>|<<|>>|\\/\\/|\\*\\*)/,D=c.doubleDelimiters||/^(\\+=|\\-=|\\*=|%=|\\/=|&=|\\|=|\\^=)/,C=c.tripleDelimiters||/^(\\/\\/=|>>=|<<=|\\*\\*=)/,\np=c.hangingIndent||q.indentUnit,h=r,k=t;void 0!=c.extra_keywords&&(h=h.concat(c.extra_keywords));void 0!=c.extra_builtins&&(k=k.concat(c.extra_builtins));var z=!(c.version&&3>Number(c.version));if(z)var y=c.singleOperators||/^[\\+\\-\\*\\/%&|\\^~<>!@]/,m=c.identifiers||/^[_A-Za-z\\u00A1-\\uFFFF][_A-Za-z0-9\\u00A1-\\uFFFF]*/,h=h.concat(\"nonlocal False True None async await\".split(\" \")),k=k.concat([\"ascii\",\"bytes\",\"exec\",\"print\"]),x=/^(([rbuf]|(br))?('{3}|\"{3}|['\"]))/i;else y=c.singleOperators||/^[\\+\\-\\*\\/%&|\\^~<>!]/,\nm=c.identifiers||/^[_A-Za-z][_A-Za-z0-9]*/,h=h.concat([\"exec\",\"print\"]),k=k.concat(\"apply basestring buffer cmp coerce execfile file intern long raw_input reduce reload unichr unicode xrange False True None\".split(\" \")),x=/^(([rub]|(ur)|(br))?('{3}|\"{3}|['\"]))/i;var G=n(h),H=n(k);return{startState:function(a){return{tokenize:l,scopes:[{offset:a||0,type:\"py\",align:null}],indent:a||0,lastToken:null,lambda:!1,dedent:0}},token:function(a,b){var d=b.errorToken;d&&(b.errorToken=!1);var e;a:{a.sol()&&(b.beginningOfLine=\n!0);e=b.tokenize(a,b);var c=a.current();if(b.beginningOfLine&&\"@\"==c)e=a.match(m,!1)?\"meta\":z?\"operator\":\"error\";else{/\\S/.test(c)&&(b.beginningOfLine=!1);\"variable\"!=e&&\"builtin\"!=e||\"meta\"!=b.lastToken||(e=\"meta\");if(\"pass\"==c||\"return\"==c)b.dedent+=1;\"lambda\"==c&&(b.lambda=!0);\":\"!=c||b.lambda||\"py\"!=f(b).type||u(b);var g=1==c.length?\"[({\".indexOf(c):-1;if(-1!=g){var g=\"])}\".slice(g,g+1),h=a.match(/^([\\s\\[\\{\\(]|#.*)*$/,!1)?null:a.column()+1;b.scopes.push({offset:b.indent+p,type:g,align:h})}g=\"])}\".indexOf(c);\nif(-1!=g)if(f(b).type==c)b.indent=b.scopes.pop().offset-p;else{e=\"error\";break a}0<b.dedent&&a.eol()&&\"py\"==f(b).type&&(1<b.scopes.length&&b.scopes.pop(),--b.dedent)}}e&&\"comment\"!=e&&(b.lastToken=\"keyword\"==e||\"punctuation\"==e?a.current():e);\"punctuation\"==e&&(e=null);a.eol()&&b.lambda&&(b.lambda=!1);return d?e+\" error\":e},indent:function(a,b){if(a.tokenize!=l)return a.tokenize.isString?g.Pass:0;a=f(a);b=a.type==b.charAt(0);return null!=a.align?a.align-(b?1:0):a.offset-(b?p:0)},electricInput:/^\\s*[\\}\\]\\)]$/,\ncloseBrackets:{triples:\"'\\\"\"},lineComment:\"#\",fold:\"indent\"}});g.defineMIME(\"text/x-python\",\"python\");g.defineMIME(\"text/x-cython\",{name:\"python\",extra_keywords:\"by cdef cimport cpdef ctypedef enum exceptextern gil include nogil property publicreadonly struct union DEF IF ELIF ELSE\".split(\" \")})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/q/q.js",
    "content": "'use strict';(function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],e):e(CodeMirror)})(function(e){e.defineMode(\"q\",function(e){function g(a,b){var d=a.sol(),c=a.next();f=null;if(d){if(\"/\"==c)return(b.tokenize=l)(a,b);if(\"\\\\\"==c)return a.eol()||/\\s/.test(a.peek())?(a.skipToEnd(),/^\\\\\\s*$/.test(a.current())?(b.tokenize=m)(a,b):b.tokenize=g,\"comment\"):(b.tokenize=g,\"builtin\")}if(/\\s/.test(c))return\"/\"==\na.peek()?(a.skipToEnd(),\"comment\"):\"whitespace\";if('\"'==c)return(b.tokenize=n)(a,b);if(\"`\"==c)return a.eatWhile(/[A-Z|a-z|\\d|_|:|\\/|\\.]/),\"symbol\";if(\".\"==c&&/\\d/.test(a.peek())||/\\d/.test(c)){b=null;a.backUp(1);if(a.match(/^\\d{4}\\.\\d{2}(m|\\.\\d{2}([D|T](\\d{2}(:\\d{2}(:\\d{2}(\\.\\d{1,9})?)?)?)?)?)/)||a.match(/^\\d+D(\\d{2}(:\\d{2}(:\\d{2}(\\.\\d{1,9})?)?)?)/)||a.match(/^\\d{2}:\\d{2}(:\\d{2}(\\.\\d{1,9})?)?/)||a.match(/^\\d+[ptuv]{1}/))b=\"temporal\";else if(a.match(/^0[NwW]{1}/)||a.match(/^0x[\\d|a-f|A-F]*/)||a.match(/^[0|1]+[b]{1}/)||\na.match(/^\\d+[chijn]{1}/)||a.match(/-?\\d*(\\.\\d*)?(e[+\\-]?\\d+)?(e|f)?/))b=\"number\";return!b||(c=a.peek())&&!p.test(c)?(a.next(),\"error\"):b}return/[A-Z|a-z]|\\./.test(c)?(a.eatWhile(/[A-Z|a-z|\\.|_|\\d]/),q.test(a.current())?\"keyword\":\"variable\"):/[|/&^!+:\\\\\\-*%$=~#;@><\\.,?_\\']/.test(c)||/[{}\\(\\[\\]\\)]/.test(c)?null:\"error\"}function l(a,b){return a.skipToEnd(),/\\/\\s*$/.test(a.current())?(b.tokenize=r)(a,b):b.tokenize=g,\"comment\"}function r(a,b){var d=a.sol()&&\"\\\\\"==a.peek();a.skipToEnd();d&&/^\\\\\\s*$/.test(a.current())&&\n(b.tokenize=g);return\"comment\"}function m(a){return a.skipToEnd(),\"comment\"}function n(a,b){for(var d=!1,c,e=!1;c=a.next();){if('\"'==c&&!d){e=!0;break}d=!d&&\"\\\\\"==c}e&&(b.tokenize=g);return\"string\"}function h(a,b,d){a.context={prev:a.context,indent:a.indent,col:d,type:b}}function k(a){a.indent=a.context.indent;a.context=a.context.prev}var t=e.indentUnit,f,q=/^(abs|acos|aj|aj0|all|and|any|asc|asin|asof|atan|attr|avg|avgs|bin|by|ceiling|cols|cor|cos|count|cov|cross|csv|cut|delete|deltas|desc|dev|differ|distinct|div|do|each|ej|enlist|eval|except|exec|exit|exp|fby|fills|first|fkeys|flip|floor|from|get|getenv|group|gtime|hclose|hcount|hdel|hopen|hsym|iasc|idesc|if|ij|in|insert|inter|inv|key|keys|last|like|list|lj|load|log|lower|lsq|ltime|ltrim|mavg|max|maxs|mcount|md5|mdev|med|meta|min|mins|mmax|mmin|mmu|mod|msum|neg|next|not|null|or|over|parse|peach|pj|plist|prd|prds|prev|prior|rand|rank|ratios|raze|read0|read1|reciprocal|reverse|rload|rotate|rsave|rtrim|save|scan|select|set|setenv|show|signum|sin|sqrt|ss|ssr|string|sublist|sum|sums|sv|system|tables|tan|til|trim|txf|type|uj|ungroup|union|update|upper|upsert|value|var|view|views|vs|wavg|where|where|while|within|wj|wj1|wsum|xasc|xbar|xcol|xcols|xdesc|xexp|xgroup|xkey|xlog|xprev|xrank)$/,\np=/[|/&^!+:\\\\\\-*%$=~#;@><,?_\\'\\\"\\[\\(\\]\\)\\s{}]/;return{startState:function(){return{tokenize:g,context:null,indent:0,col:0}},token:function(a,b){a.sol()&&(b.context&&null==b.context.align&&(b.context.align=!1),b.indent=a.indentation());var d=b.tokenize(a,b);\"comment\"!=d&&b.context&&null==b.context.align&&\"pattern\"!=b.context.type&&(b.context.align=!0);if(\"(\"==f)h(b,\")\",a.column());else if(\"[\"==f)h(b,\"]\",a.column());else if(\"{\"==f)h(b,\"}\",a.column());else if(/[\\]\\}\\)]/.test(f)){for(;b.context&&\"pattern\"==\nb.context.type;)k(b);b.context&&f==b.context.type&&k(b)}else\".\"==f&&b.context&&\"pattern\"==b.context.type?k(b):/atom|string|variable/.test(d)&&b.context&&(/[\\}\\]]/.test(b.context.type)?h(b,\"pattern\",a.column()):\"pattern\"!=b.context.type||b.context.align||(b.context.align=!0,b.context.col=a.column()));return d},indent:function(a,b){b=b&&b.charAt(0);a=a.context;if(/[\\]\\}]/.test(b))for(;a&&\"pattern\"==a.type;)a=a.prev;b=a&&b==a.type;return a?\"pattern\"==a.type?a.col:a.align?a.col+(b?0:1):a.indent+(b?0:\nt):0}}});e.defineMIME(\"text/x-q\",\"q\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/r/r.js",
    "content": "'use strict';(function(d){\"object\"==typeof exports&&\"object\"==typeof module?d(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],d):d(CodeMirror)})(function(d){d.registerHelper(\"wordChars\",\"r\",/[\\w.]/);d.defineMode(\"r\",function(d){function f(b){b=b.split(\" \");for(var a={},c=0;c<b.length;++c)a[b[c]]=!0;return a}function h(b,a){e=null;var c=b.next();if(\"#\"==c)return b.skipToEnd(),\"comment\";if(\"0\"==c&&b.eat(\"x\"))return b.eatWhile(/[\\da-f]/i),\"number\";\nif(\".\"==c&&b.eat(/\\d/))return b.match(/\\d*(?:e[+\\-]?\\d+)?/),\"number\";if(/\\d/.test(c))return b.match(/\\d*(?:\\.\\d+)?(?:e[+\\-]\\d+)?L?/),\"number\";if(\"'\"==c||'\"'==c)return a.tokenize=l(c),\"string\";if(\".\"==c&&b.match(/.[.\\d]+/))return\"keyword\";if(/[\\w\\.]/.test(c)&&\"_\"!=c)return b.eatWhile(/[\\w\\.]/),a=b.current(),m.propertyIsEnumerable(a)?\"atom\":n.propertyIsEnumerable(a)?(p.propertyIsEnumerable(a)&&!b.match(/\\s*if(\\s+|$)/,!1)&&(e=\"block\"),\"keyword\"):q.propertyIsEnumerable(a)?\"builtin\":\"variable\";if(\"%\"==\nc)return b.skipTo(\"%\")&&b.next(),\"variable-2\";if(\"<\"==c&&b.eat(\"-\"))return\"arrow\";if(\"=\"==c&&a.ctx.argList)return\"arg-is\";if(k.test(c)){if(\"$\"==c)return\"dollar\";b.eatWhile(k);return\"operator\"}return/[\\(\\){}\\[\\];]/.test(c)?(e=c,\";\"==c?\"semi\":null):null}function l(b){return function(a,c){if(a.eat(\"\\\\\"))return c=a.next(),\"x\"==c?a.match(/^[a-f0-9]{2}/i):(\"u\"==c||\"U\"==c)&&a.eat(\"{\")&&a.skipTo(\"}\")?a.next():\"u\"==c?a.match(/^[a-f0-9]{4}/i):\"U\"==c?a.match(/^[a-f0-9]{8}/i):/[0-7]/.test(c)&&a.match(/^[0-7]{1,2}/),\n\"string-2\";for(var d;null!=(d=a.next());){if(d==b){c.tokenize=h;break}if(\"\\\\\"==d){a.backUp(1);break}}return\"string\"}}function g(b,a,c){b.ctx={type:a,indent:b.indent,align:null,column:c.column(),prev:b.ctx}}var m=f(\"NULL NA Inf NaN NA_integer_ NA_real_ NA_complex_ NA_character_\"),q=f(\"list quote bquote eval return call parse deparse\"),n=f(\"if else repeat while function for in next break\"),p=f(\"if else repeat while function for\"),k=/[+\\-*\\/^<>=!&|~$:]/,e;return{startState:function(){return{tokenize:h,\nctx:{type:\"top\",indent:-d.indentUnit,align:!1},indent:0,afterIdent:!1}},token:function(b,a){b.sol()&&(null==a.ctx.align&&(a.ctx.align=!1),a.indent=b.indentation());if(b.eatSpace())return null;var c=a.tokenize(b,a);\"comment\"!=c&&null==a.ctx.align&&(a.ctx.align=!0);var d=a.ctx.type;\";\"!=e&&\"{\"!=e&&\"}\"!=e||\"block\"!=d||(a.indent=a.ctx.indent,a.ctx=a.ctx.prev);\"{\"==e?g(a,\"}\",b):\"(\"==e?(g(a,\")\",b),a.afterIdent&&(a.ctx.argList=!0)):\"[\"==e?g(a,\"]\",b):\"block\"==e?g(a,\"block\",b):e==d&&(a.indent=a.ctx.indent,\na.ctx=a.ctx.prev);a.afterIdent=\"variable\"==c||\"keyword\"==c;return c},indent:function(b,a){if(b.tokenize!=h)return 0;a=a&&a.charAt(0);b=b.ctx;var c=a==b.type;return\"block\"==b.type?b.indent+(\"{\"==a?0:d.indentUnit):b.align?b.column+(c?0:1):b.indent+(c?0:d.indentUnit)},lineComment:\"#\"}});d.defineMIME(\"text/x-rsrc\",\"r\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/rpm/rpm.js",
    "content": "'use strict';(function(b){\"object\"==typeof exports&&\"object\"==typeof module?b(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],b):b(CodeMirror)})(function(b){b.defineMode(\"rpm-changes\",function(){var b=/^-+$/,e=/^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)  ?\\d{1,2} \\d{2}:\\d{2}(:\\d{2})? [A-Z]{3,4} \\d{4} - /,f=/^[\\w+.-]+@[\\w.-]+/;return{token:function(d){if(d.sol()&&(d.match(b)||d.match(e)))return\"tag\";if(d.match(f))return\"string\";\nd.next();return null}}});b.defineMIME(\"text/x-rpm-changes\",\"rpm-changes\");b.defineMode(\"rpm-spec\",function(){var b=/^(i386|i586|i686|x86_64|ppc64le|ppc64|ppc|ia64|s390x|s390|sparc64|sparcv9|sparc|noarch|alphaev6|alpha|hppa|mipsel)/,e=/^[a-zA-Z0-9()]+:/,f=/^%(debug_package|package|description|prep|build|install|files|clean|changelog|preinstall|preun|postinstall|postun|pretrans|posttrans|pre|post|triggerin|triggerun|verifyscript|check|triggerpostun|triggerprein|trigger)/,d=/^%(ifnarch|ifarch|if)/,g=\n/^%(else|endif)/,h=/^(\\!|\\?|\\<\\=|\\<|\\>\\=|\\>|\\=\\=|\\&\\&|\\|\\|)/;return{startState:function(){return{controlFlow:!1,macroParameters:!1,section:!1}},token:function(a,c){if(\"#\"==a.peek())return a.skipToEnd(),\"comment\";if(a.sol()){if(a.match(e))return\"header\";if(a.match(f))return\"atom\"}if(a.match(/^\\$\\w+/)||a.match(/^\\$\\{\\w+\\}/))return\"def\";if(a.match(g))return\"keyword\";if(a.match(d))return c.controlFlow=!0,\"keyword\";if(c.controlFlow){if(a.match(h))return\"operator\";if(a.match(/^(\\d+)/))return\"number\";a.eol()&&\n(c.controlFlow=!1)}if(a.match(b))return a.eol()&&(c.controlFlow=!1),\"number\";if(a.match(/^%[\\w]+/))return a.match(/^\\(/)&&(c.macroParameters=!0),\"keyword\";if(c.macroParameters){if(a.match(/^\\d+/))return\"number\";if(a.match(/^\\)/))return c.macroParameters=!1,\"keyword\"}if(a.match(/^%\\{\\??[\\w \\-\\:\\!]+\\}/))return a.eol()&&(c.controlFlow=!1),\"def\";a.next();return null}}});b.defineMIME(\"text/x-rpm-spec\",\"rpm-spec\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/rst/rst.js",
    "content": "'use strict';(function(k){\"object\"==typeof exports&&\"object\"==typeof module?k(require(\"../../lib/codemirror\"),require(\"../python/python\"),require(\"../stex/stex\"),require(\"../../addon/mode/overlay\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\",\"../python/python\",\"../stex/stex\",\"../../addon/mode/overlay\"],k):k(CodeMirror)})(function(k){k.defineMode(\"rst\",function(h,g){var d=/^\\*\\*[^\\*\\s](?:[^\\*]*[^\\*\\s])?\\*\\*/,l=/^\\*[^\\*\\s](?:[^\\*]*[^\\*\\s])?\\*/,x=/^``[^`\\s](?:[^`]*[^`\\s])``/,\ny=/^(?:[\\d]+(?:[\\.,]\\d+)*)/,v=/^(?:\\s\\+[\\d]+(?:[\\.,]\\d+)*)/,r=/^(?:\\s\\-[\\d]+(?:[\\.,]\\d+)*)/,f=/^[Hh][Tt][Tt][Pp][Ss]?:\\/\\/(?:[\\d\\w.-]+)\\.(?:\\w{2,6})(?:\\/[\\d\\w\\#\\%\\&\\-\\.\\,\\/\\:\\=\\?\\~]+)*/;h=k.getMode(h,g.backdrop||\"rst-base\");return k.overlayMode(h,{token:function(c){if(c.match(d)&&c.match(/\\W+|$/,!1))return\"strong\";if(c.match(l)&&c.match(/\\W+|$/,!1))return\"em\";if(c.match(x)&&c.match(/\\W+|$/,!1))return\"string-2\";if(c.match(y))return\"number\";if(c.match(v))return\"positive\";if(c.match(r))return\"negative\";\nif(c.match(f))return\"link\";for(;!(null==c.next()||c.match(d,!1)||c.match(l,!1)||c.match(x,!1)||c.match(y,!1)||c.match(v,!1)||c.match(r,!1)||c.match(f,!1)););return null}},!0)},\"python\",\"stex\");k.defineMode(\"rst-base\",function(h){function g(b){var a=Array.prototype.slice.call(arguments,1);return b.replace(/{(\\d+)}/g,function(b,c){return\"undefined\"!=typeof a[c]?a[c]:b})}function d(b,a){var e=null;if(b.sol()&&b.match(H,!1))c(a,r,{mode:z,local:k.startState(z)});else if(b.sol()&&b.match(I))c(a,l),e=\"meta\";\nelse if(b.sol()&&b.match(J))c(a,d),e=\"header\";else if(a.ctx.phase==m||b.match(m,!1))switch(n(a)){case 0:c(a,d,f(m,1));b.match(/^:/);e=\"meta\";break;case 1:c(a,d,f(m,2));b.match(D);e=\"keyword\";b.current().match(/^(?:math|latex)/)&&(a.tmp_stex=!0);break;case 2:c(a,d,f(m,3));b.match(/^:`/);e=\"meta\";break;case 3:a.tmp_stex&&(a.tmp_stex=void 0,a.tmp={mode:A,local:k.startState(A)});if(a.tmp){if(\"`\"==b.peek()){c(a,d,f(m,4));a.tmp=void 0;break}e=a.tmp.mode.token(b,a.tmp.local);break}c(a,d,f(m,4));b.match(E);\ne=\"string\";break;case 4:c(a,d,f(m,5));b.match(/^`/);e=\"meta\";break;case 5:c(a,d,f(m,6));b.match(F);break;default:c(a,d)}else if(a.ctx.phase==p||b.match(p,!1))switch(n(a)){case 0:c(a,d,f(p,1));b.match(/^`/);e=\"meta\";break;case 1:c(a,d,f(p,2));b.match(E);e=\"string\";break;case 2:c(a,d,f(p,3));b.match(/^`:/);e=\"meta\";break;case 3:c(a,d,f(p,4));b.match(D);e=\"keyword\";break;case 4:c(a,d,f(p,5));b.match(/^:/);e=\"meta\";break;case 5:c(a,d,f(p,6));b.match(F);break;default:c(a,d)}else if(a.ctx.phase==t||b.match(t,\n!1))switch(n(a)){case 0:c(a,d,f(t,1));b.match(/^:/);e=\"meta\";break;case 1:c(a,d,f(t,2));b.match(D);e=\"keyword\";break;case 2:c(a,d,f(t,3));b.match(/^:/);e=\"meta\";break;case 3:c(a,d,f(t,4));b.match(F);break;default:c(a,d)}else if(a.ctx.phase==B||b.match(B,!1))switch(n(a)){case 0:c(a,d,f(B,1));b.match(G);e=\"variable-2\";break;case 1:c(a,d,f(B,2));b.match(/^_?_?/)&&(e=\"link\");break;default:c(a,d)}else if(b.match(K))c(a,d),e=\"quote\";else if(b.match(L))c(a,d),e=\"quote\";else if(b.match(M)){if(c(a,d),!b.peek()||\nb.peek().match(/^\\W$/))e=\"link\"}else if(a.ctx.phase==q||b.match(q,!1))switch(n(a)){case 0:!b.peek()||b.peek().match(/^\\W$/)?c(a,d,f(q,1)):b.match(q);break;case 1:c(a,d,f(q,2));b.match(/^`/);e=\"link\";break;case 2:c(a,d,f(q,3));b.match(E);break;case 3:c(a,d,f(q,4));b.match(/^`_/);e=\"link\";break;default:c(a,d)}else b.match(N)?c(a,y):b.next()&&c(a,d);return e}function l(b,a){var e=null;if(a.ctx.phase==u||b.match(u,!1))switch(n(a)){case 0:c(a,l,f(u,1));b.match(G);e=\"variable-2\";break;case 1:c(a,l,f(u,\n2));b.match(O);break;case 2:c(a,l,f(u,3));b.match(P);e=\"keyword\";break;case 3:c(a,l,f(u,4));b.match(Q);e=\"meta\";break;default:c(a,d)}else if(a.ctx.phase==w||b.match(w,!1))switch(n(a)){case 0:c(a,l,f(w,1));b.match(R);e=\"keyword\";b.current().match(/^(?:math|latex)/)?a.tmp_stex=!0:b.current().match(/^python/)&&(a.tmp_py=!0);break;case 1:c(a,l,f(w,2));b.match(S);e=\"meta\";if(b.match(/^latex\\s*$/)||a.tmp_stex)a.tmp_stex=void 0,c(a,r,{mode:A,local:k.startState(A)});break;case 2:c(a,l,f(w,3));if(b.match(/^python\\s*$/)||\na.tmp_py)a.tmp_py=void 0,c(a,r,{mode:z,local:k.startState(z)});break;default:c(a,d)}else if(a.ctx.phase==C||b.match(C,!1))switch(n(a)){case 0:c(a,l,f(C,1));b.match(T);b.match(U);e=\"link\";break;case 1:c(a,l,f(C,2));b.match(V);e=\"meta\";break;default:c(a,d)}else b.match(W)?(c(a,d),e=\"quote\"):b.match(X)?(c(a,d),e=\"quote\"):(b.eatSpace(),b.eol()?c(a,d):(b.skipToEnd(),c(a,x),e=\"comment\"));return e}function x(b,a){return v(b,a,\"comment\")}function y(b,a){return v(b,a,\"meta\")}function v(b,a,e){if(b.eol()||\nb.eatSpace())return b.skipToEnd(),e;c(a,d);return null}function r(b,a){if(a.ctx.mode&&a.ctx.local)return b.sol()?(b.eatSpace()||c(a,d),null):a.ctx.mode.token(b,a.ctx.local);c(a,d);return null}function f(b,a,c,d){return{phase:b,stage:a,mode:c,local:d}}function c(b,a,c){b.tok=a;b.ctx=c||{}}function n(b){return b.ctx.stage||0}var z=k.getMode(h,\"python\"),A=k.getMode(h,\"stex\"),F=new RegExp(g(\"^{0}\",\"(?:\\\\s*|\\\\W|$)\")),D=new RegExp(g(\"^{0}\",\"(?:[^\\\\W\\\\d_](?:[\\\\w!\\\"#$%&'()\\\\*\\\\+,\\\\-\\\\./:;<=>\\\\?]*[^\\\\W_])?)\"));\nh=g(\"(?:{0}|`{1}`)\",\"(?:[^\\\\W\\\\d_](?:[\\\\w!\\\"#$%&'()\\\\*\\\\+,\\\\-\\\\./:;<=>\\\\?]*[^\\\\W_])?)\",\"(?:[^\\\\W\\\\d_](?:[\\\\w\\\\s!\\\"#$%&'()\\\\*\\\\+,\\\\-\\\\./:;<=>\\\\?]*[^\\\\W_])?)\");var E=new RegExp(g(\"^{0}\",\"(?:[^\\\\`]+)\")),J=/^([!'#$%&\"()*+,-./:;<=>?@\\[\\\\\\]^_`{|}~])\\1{3,}\\s*$/,I=new RegExp(g(\"^\\\\.\\\\.{0}\",\"\\\\s+\")),C=new RegExp(g(\"^_{0}:{1}|^__:{1}\",h,\"(?:\\\\s*|\\\\W|$)\")),w=new RegExp(g(\"^{0}::{1}\",h,\"(?:\\\\s*|\\\\W|$)\")),u=new RegExp(g(\"^\\\\|{0}\\\\|{1}{2}::{3}\",\"(?:[^\\\\s\\\\|](?:[^\\\\|]*[^\\\\s\\\\|])?)\",\"\\\\s+\",h,\"(?:\\\\s*|\\\\W|$)\")),W=\nnew RegExp(g(\"^\\\\[(?:\\\\d+|#{0}?|\\\\*)]{1}\",h,\"(?:\\\\s*|\\\\W|$)\")),X=new RegExp(g(\"^\\\\[{0}\\\\]{1}\",h,\"(?:\\\\s*|\\\\W|$)\")),B=new RegExp(g(\"^\\\\|{0}\\\\|\",\"(?:[^\\\\s\\\\|](?:[^\\\\|]*[^\\\\s\\\\|])?)\")),K=new RegExp(g(\"^\\\\[(?:\\\\d+|#{0}?|\\\\*)]_\",h)),L=new RegExp(g(\"^\\\\[{0}\\\\]_\",h)),M=new RegExp(g(\"^{0}__?\",h)),q=new RegExp(g(\"^`{0}`_\",\"(?:[^\\\\`]+)\")),m=new RegExp(g(\"^:{0}:`{1}`{2}\",\"(?:[^\\\\W\\\\d_](?:[\\\\w!\\\"#$%&'()\\\\*\\\\+,\\\\-\\\\./:;<=>\\\\?]*[^\\\\W_])?)\",\"(?:[^\\\\`]+)\",\"(?:\\\\s*|\\\\W|$)\")),p=new RegExp(g(\"^`{1}`:{0}:{2}\",\"(?:[^\\\\W\\\\d_](?:[\\\\w!\\\"#$%&'()\\\\*\\\\+,\\\\-\\\\./:;<=>\\\\?]*[^\\\\W_])?)\",\n\"(?:[^\\\\`]+)\",\"(?:\\\\s*|\\\\W|$)\")),t=new RegExp(g(\"^:{0}:{1}\",\"(?:[^\\\\W\\\\d_](?:[\\\\w!\\\"#$%&'()\\\\*\\\\+,\\\\-\\\\./:;<=>\\\\?]*[^\\\\W_])?)\",\"(?:\\\\s*|\\\\W|$)\")),R=new RegExp(g(\"^{0}\",h)),S=new RegExp(g(\"^::{0}\",\"(?:\\\\s*|\\\\W|$)\")),G=new RegExp(g(\"^\\\\|{0}\\\\|\",\"(?:[^\\\\s\\\\|](?:[^\\\\|]*[^\\\\s\\\\|])?)\")),O=new RegExp(g(\"^{0}\",\"\\\\s+\")),P=new RegExp(g(\"^{0}\",h)),Q=new RegExp(g(\"^::{0}\",\"(?:\\\\s*|\\\\W|$)\")),T=/^_/,U=new RegExp(g(\"^{0}|_\",h)),V=new RegExp(g(\"^:{0}\",\"(?:\\\\s*|\\\\W|$)\")),N=/^::\\s*$/,H=/^\\s+(?:>>>|In \\[\\d+\\]:)\\s/;\nreturn{startState:function(){return{tok:d,ctx:f(void 0,0)}},copyState:function(b){var a=b.ctx,c=b.tmp;a.local&&(a={mode:a.mode,local:k.copyState(a.mode,a.local)});c&&(c={mode:c.mode,local:k.copyState(c.mode,c.local)});return{tok:b.tok,ctx:a,tmp:c}},innerMode:function(b){return b.tmp?{state:b.tmp.local,mode:b.tmp.mode}:b.ctx.mode?{state:b.ctx.local,mode:b.ctx.mode}:null},token:function(b,a){return a.tok(b,a)}}},\"python\",\"stex\");k.defineMIME(\"text/x-rst\",\"rst\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/ruby/ruby.js",
    "content": "'use strict';(function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],e):e(CodeMirror)})(function(e){e.defineMode(\"ruby\",function(e){function n(a){for(var c={},b=0,d=a.length;b<d;++b)c[a[b]]=!0;return c}function k(a,c,b){b.tokenize.push(a);return a(c,b)}function m(a,c){if(a.sol()&&a.match(\"=begin\")&&a.eol())return c.tokenize.push(r),\"comment\";if(a.eatSpace())return null;var b=a.next(),d;\nif(\"`\"==b||\"'\"==b||'\"'==b)return k(l(b,\"string\",'\"'==b||\"`\"==b),a,c);if(\"/\"==b){d=a.current().length;if(a.skipTo(\"/\")){var h=a.current().length;a.backUp(a.current().length-d);for(var f=0;a.current().length<h;){var e=a.next();\"(\"==e?f+=1:\")\"==e&&--f;if(0>f)break}a.backUp(a.current().length-d);if(0==f)return k(l(b,\"string-2\",!0),a,c)}return\"operator\"}if(\"%\"==b){b=\"string\";d=!0;a.eat(\"s\")?b=\"atom\":a.eat(/[WQ]/)?b=\"string\":a.eat(/[r]/)?b=\"string-2\":a.eat(/[wxq]/)&&(b=\"string\",d=!1);h=a.eat(/[^\\w\\s=]/);\nif(!h)return\"operator\";p.propertyIsEnumerable(h)&&(h=p[h]);return k(l(h,b,d,!0),a,c)}if(\"#\"==b)return a.skipToEnd(),\"comment\";if(\"<\"==b&&(d=a.match(/^<-?[\\`\\\"\\']?([a-zA-Z_?]\\w*)[\\`\\\"\\']?(?:;|$)/)))return k(t(d[1]),a,c);if(\"0\"==b)return a.eat(\"x\")?a.eatWhile(/[\\da-fA-F]/):a.eat(\"b\")?a.eatWhile(/[01]/):a.eatWhile(/[0-7]/),\"number\";if(/\\d/.test(b))return a.match(/^[\\d_]*(?:\\.[\\d_]+)?(?:[eE][+\\-]?[\\d_]+)?/),\"number\";if(\"?\"==b){for(;a.match(/^\\\\[CM]-/););a.eat(\"\\\\\")?a.eatWhile(/\\w/):a.next();return\"string\"}if(\":\"==\nb)return a.eat(\"'\")?k(l(\"'\",\"atom\",!1),a,c):a.eat('\"')?k(l('\"',\"atom\",!0),a,c):a.eat(/[\\<\\>]/)?(a.eat(/[\\<\\>]/),\"atom\"):a.eat(/[\\+\\-\\*\\/\\&\\|\\:\\!]/)?\"atom\":a.eat(/[a-zA-Z$@_\\xa1-\\uffff]/)?(a.eatWhile(/[\\w$\\xa1-\\uffff]/),a.eat(/[\\?\\!\\=]/),\"atom\"):\"operator\";if(\"@\"==b&&a.match(/^@?[a-zA-Z_\\xa1-\\uffff]/))return a.eat(\"@\"),a.eatWhile(/[\\w\\xa1-\\uffff]/),\"variable-2\";if(\"$\"==b)return a.eat(/[a-zA-Z_]/)?a.eatWhile(/[\\w]/):a.eat(/\\d/)?a.eat(/\\d/):a.next(),\"variable-3\";if(/[a-zA-Z_\\xa1-\\uffff]/.test(b))return a.eatWhile(/[\\w\\xa1-\\uffff]/),\na.eat(/[\\?\\!]/),a.eat(\":\")?\"atom\":\"ident\";if(\"|\"!=b||!c.varList&&\"{\"!=c.lastTok&&\"do\"!=c.lastTok)return/[\\(\\)\\[\\]{}\\\\;]/.test(b)?(g=b,null):\"-\"==b&&a.eat(\">\")?\"arrow\":/[=+\\-\\/*:\\.^%<>~|]/.test(b)?(a=a.eatWhile(/[=+\\-\\/*:\\.^%<>~|]/),\".\"!=b||a||(g=\".\"),\"operator\"):null;g=\"|\";return null}function q(a){a||(a=1);return function(c,b){if(\"}\"==c.peek()){if(1==a)return b.tokenize.pop(),b.tokenize[b.tokenize.length-1](c,b);b.tokenize[b.tokenize.length-1]=q(a-1)}else\"{\"==c.peek()&&(b.tokenize[b.tokenize.length-\n1]=q(a+1));return m(c,b)}}function u(){var a=!1;return function(c,b){if(a)return b.tokenize.pop(),b.tokenize[b.tokenize.length-1](c,b);a=!0;return m(c,b)}}function l(a,c,b,d){return function(h,f){var e=!1,g;\"read-quoted-paused\"===f.context.type&&(f.context=f.context.prev,h.eat(\"}\"));for(;null!=(g=h.next());){if(g==a&&(d||!e)){f.tokenize.pop();break}if(b&&\"#\"==g&&!e)if(h.eat(\"{\")){\"}\"==a&&(f.context={prev:f.context,type:\"read-quoted-paused\"});f.tokenize.push(q());break}else if(/[@\\$]/.test(h.peek())){f.tokenize.push(u());\nbreak}e=!e&&\"\\\\\"==g}return c}}function t(a){return function(c,b){c.match(a)?b.tokenize.pop():c.skipToEnd();return\"string\"}}function r(a,c){a.sol()&&a.match(\"=end\")&&a.eol()&&c.tokenize.pop();a.skipToEnd();return\"comment\"}var v=n(\"alias and BEGIN begin break case class def defined? do else elsif END end ensure false for if in module next not or redo rescue retry return self super then true undef unless until when while yield nil raise throw catch fail loop callcc caller lambda proc public protected private require load require_relative extend autoload __END__ __FILE__ __LINE__ __dir__\".split(\" \")),\nw=n(\"def class case for while until module then catch loop proc begin\".split(\" \")),x=n([\"end\",\"until\"]),p={\"[\":\"]\",\"{\":\"}\",\"(\":\")\"},g;return{startState:function(){return{tokenize:[m],indented:0,context:{type:\"top\",indented:-e.indentUnit},continuedLine:!1,lastTok:null,varList:!1}},token:function(a,c){g=null;a.sol()&&(c.indented=a.indentation());var b=c.tokenize[c.tokenize.length-1](a,c),d,e=g;if(\"ident\"==b){var f=a.current(),b=\".\"==c.lastTok?\"property\":v.propertyIsEnumerable(a.current())?\"keyword\":\n/^[A-Z]/.test(f)?\"tag\":\"def\"==c.lastTok||\"class\"==c.lastTok||c.varList?\"def\":\"variable\";\"keyword\"==b&&(e=f,w.propertyIsEnumerable(f)?d=\"indent\":x.propertyIsEnumerable(f)?d=\"dedent\":\"if\"!=f&&\"unless\"!=f||a.column()!=a.indentation()?\"do\"==f&&c.context.indented<c.indented&&(d=\"indent\"):d=\"indent\")}if(g||b&&\"comment\"!=b)c.lastTok=e;\"|\"==g&&(c.varList=!c.varList);\"indent\"==d||/[\\(\\[\\{]/.test(g)?c.context={prev:c.context,type:g||b,indented:c.indented}:(\"dedent\"==d||/[\\)\\]\\}]/.test(g))&&c.context.prev&&\n(c.context=c.context.prev);a.eol()&&(c.continuedLine=\"\\\\\"==g||\"operator\"==b);return b},indent:function(a,c){if(a.tokenize[a.tokenize.length-1]!=m)return 0;var b=c&&c.charAt(0),d=a.context;c=d.type==p[b]||\"keyword\"==d.type&&/^(?:end|until|else|elsif|when|rescue)\\b/.test(c);return d.indented+(c?0:e.indentUnit)+(a.continuedLine?e.indentUnit:0)},electricInput:/^\\s*(?:end|rescue|\\})$/,lineComment:\"#\"}});e.defineMIME(\"text/x-ruby\",\"ruby\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/rust/rust.js",
    "content": "'use strict';(function(a){\"object\"==typeof exports&&\"object\"==typeof module?a(require(\"../../lib/codemirror\"),require(\"../../addon/mode/simple\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\",\"../../addon/mode/simple\"],a):a(CodeMirror)})(function(a){a.defineSimpleMode(\"rust\",{start:[{regex:/b?\"/,token:\"string\",next:\"string\"},{regex:/b?r\"/,token:\"string\",next:\"string_raw\"},{regex:/b?r#+\"/,token:\"string\",next:\"string_raw_hash\"},{regex:/'(?:[^'\\\\]|\\\\(?:[nrt0'\"]|x[\\da-fA-F]{2}|u\\{[\\da-fA-F]{6}\\}))'/,\ntoken:\"string-2\"},{regex:/b'(?:[^']|\\\\(?:['\\\\nrt0]|x[\\da-fA-F]{2}))'/,token:\"string-2\"},{regex:/(?:(?:[0-9][0-9_]*)(?:(?:[Ee][+-]?[0-9_]+)|\\.[0-9_]+(?:[Ee][+-]?[0-9_]+)?)(?:f32|f64)?)|(?:0(?:b[01_]+|(?:o[0-7_]+)|(?:x[0-9a-fA-F_]+))|(?:[0-9][0-9_]*))(?:u8|u16|u32|u64|i8|i16|i32|i64|isize|usize)?/,token:\"number\"},{regex:/(let(?:\\s+mut)?|fn|enum|mod|struct|type)(\\s+)([a-zA-Z_][a-zA-Z0-9_]*)/,token:[\"keyword\",null,\"def\"]},{regex:/(?:abstract|alignof|as|box|break|continue|const|crate|do|else|enum|extern|fn|for|final|if|impl|in|loop|macro|match|mod|move|offsetof|override|priv|proc|pub|pure|ref|return|self|sizeof|static|struct|super|trait|type|typeof|unsafe|unsized|use|virtual|where|while|yield)\\b/,\ntoken:\"keyword\"},{regex:/\\b(?:Self|isize|usize|char|bool|u8|u16|u32|u64|f16|f32|f64|i8|i16|i32|i64|str|Option)\\b/,token:\"atom\"},{regex:/\\b(?:true|false|Some|None|Ok|Err)\\b/,token:\"builtin\"},{regex:/\\b(fn)(\\s+)([a-zA-Z_][a-zA-Z0-9_]*)/,token:[\"keyword\",null,\"def\"]},{regex:/#!?\\[.*\\]/,token:\"meta\"},{regex:/\\/\\/.*/,token:\"comment\"},{regex:/\\/\\*/,token:\"comment\",next:\"comment\"},{regex:/[-+\\/*=<>!]+/,token:\"operator\"},{regex:/[a-zA-Z_]\\w*!/,token:\"variable-3\"},{regex:/[a-zA-Z_]\\w*/,token:\"variable\"},{regex:/[\\{\\[\\(]/,\nindent:!0},{regex:/[\\}\\]\\)]/,dedent:!0}],string:[{regex:/\"/,token:\"string\",next:\"start\"},{regex:/(?:[^\\\\\"]|\\\\(?:.|$))*/,token:\"string\"}],string_raw:[{regex:/\"/,token:\"string\",next:\"start\"},{regex:/[^\"]*/,token:\"string\"}],string_raw_hash:[{regex:/\"#+/,token:\"string\",next:\"start\"},{regex:/(?:[^\"]|\"(?!#))*/,token:\"string\"}],comment:[{regex:/.*?\\*\\//,token:\"comment\",next:\"start\"},{regex:/.*/,token:\"comment\"}],meta:{dontIndentStates:[\"comment\"],electricInput:/^\\s*\\}$/,blockCommentStart:\"/*\",blockCommentEnd:\"*/\",\nlineComment:\"//\",fold:\"brace\"}});a.defineMIME(\"text/x-rustsrc\",\"rust\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/sas/sas.js",
    "content": "'use strict';(function(f){\"object\"==typeof exports&&\"object\"==typeof module?f(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],f):f(CodeMirror)})(function(f){f.defineMode(\"sas\",function(){function d(a,c,b){if(b){c=c.split(\" \");for(var d=0;d<c.length;d++)e[c[d]]={style:a,state:b}}}function f(a,c){var b=a.next();if(\"/\"===b&&a.eat(\"*\"))return c.continueComment=!0,\"comment\";if(!0===c.continueComment)return\"*\"===b&&\"/\"===a.peek()?(a.next(),c.continueComment=\n!1):a.skipTo(\"*\")?(a.skipTo(\"*\"),a.next(),a.eat(\"/\")&&(c.continueComment=!1)):a.skipToEnd(),\"comment\";var d=b+a.peek(),f=/(?:^\\s*|[;]\\s*)(\\*.*?);/ig.exec(a.string);if(null!==f){if(0===f.index&&a.column()!==f.index+f[0].length-1)return a.backUp(a.column()),a.skipTo(\";\"),a.next(),\"comment\";if(f.index+1<a.column()&&a.column()<f.index+f[0].length-1)return a.backUp(a.column()-f.index-1),a.skipTo(\";\"),a.next(),\"comment\"}else if('\"'!==b&&\"'\"!==b||c.continueString){if(c.continueString)return c.continueString==\nb?c.continueString=null:a.skipTo(c.continueString)?(a.next(),c.continueString=null):a.skipToEnd(),\"string\";if(null!==c.continueString&&a.eol())return a.skipTo(c.continueString)||a.skipToEnd(),\"string\";if(/[\\d\\.]/.test(b))return\".\"===b?a.match(/^[0-9]+([eE][\\-+]?[0-9]+)?/):\"0\"===b?a.match(/^[xX][0-9a-fA-F]+/)||a.match(/^0[0-7]+/):a.match(/^[0-9]*\\.?[0-9]*([eE][\\-+]?[0-9]+)?/),\"number\";if(h.test(b+a.peek()))return a.next(),\"operator\";if(g.hasOwnProperty(d)){if(a.next(),\" \"===a.peek())return g[d.toLowerCase()]}else if(k.test(b))return\"operator\"}else return c.continueString=\nb,\"string\";if(null!=a.match(/[%&;\\w]+/,!1)&&(b+=a.match(/[%&;\\w]+/,!0),/&/.test(b)))return\"variable\";if(c.nextword)return a.match(/[\\w]+/),\".\"===a.peek()&&a.skipTo(\" \"),c.nextword=!1,\"variable-2\";b=b.toLowerCase();if(c.inDataStep){if(\"run;\"===b||a.match(/run\\s;/))return c.inDataStep=!1,\"builtin\";if(b&&\".\"===a.next())return/\\w/.test(a.peek())?\"variable-2\":\"variable\";if(b&&e.hasOwnProperty(b)&&(-1!==e[b].state.indexOf(\"inDataStep\")||-1!==e[b].state.indexOf(\"ALL\"))){a.start<a.pos&&a.backUp(a.pos-a.start);\nfor(c=0;c<b.length;++c)a.next();return e[b].style}}if(c.inProc){if(\"run;\"===b||\"quit;\"===b)return c.inProc=!1,\"builtin\";if(b&&e.hasOwnProperty(b)&&(-1!==e[b].state.indexOf(\"inProc\")||-1!==e[b].state.indexOf(\"ALL\")))return a.match(/[\\w]+/),e[b].style}if(c.inMacro)return\"%mend\"===b?(\";\"===a.peek()&&a.next(),c.inMacro=!1,\"builtin\"):b&&e.hasOwnProperty(b)&&(-1!==e[b].state.indexOf(\"inMacro\")||-1!==e[b].state.indexOf(\"ALL\"))?(a.match(/[\\w]+/),e[b].style):\"atom\";if(b&&e.hasOwnProperty(b)){a.backUp(1);a.match(/[\\w]+/);\nif(\"data\"===b&&!1===/=/.test(a.peek()))return c.inDataStep=!0,c.nextword=!0,\"builtin\";if(\"proc\"===b)return c.inProc=!0,c.nextword=!0,\"builtin\";if(\"%macro\"===b)return c.inMacro=!0,c.nextword=!0,\"builtin\";if(/title[1-9]/.test(b))return\"def\";if(\"footnote\"===b)return a.eat(/[1-9]/),\"def\";if(!0===c.inDataStep&&-1!==e[b].state.indexOf(\"inDataStep\")||!0===c.inProc&&-1!==e[b].state.indexOf(\"inProc\")||!0===c.inMacro&&-1!==e[b].state.indexOf(\"inMacro\")||-1!==e[b].state.indexOf(\"ALL\"))return e[b].style}return null}\nvar e={},g={eq:\"operator\",lt:\"operator\",le:\"operator\",gt:\"operator\",ge:\"operator\",\"in\":\"operator\",ne:\"operator\",or:\"operator\"},h=/(<=|>=|!=|<>)/,k=/[=\\(:\\),{}.*<>+\\-\\/^\\[\\]]/;d(\"def\",\"stack pgm view source debug nesting nolist\",[\"inDataStep\"]);d(\"def\",\"if while until for do do; end end; then else cancel\",[\"inDataStep\"]);d(\"def\",\"label format _n_ _error_\",[\"inDataStep\"]);d(\"def\",\"ALTER BUFNO BUFSIZE CNTLLEV COMPRESS DLDMGACTION ENCRYPT ENCRYPTKEY EXTENDOBSCOUNTER GENMAX GENNUM INDEX LABEL OBSBUF OUTREP PW PWREQ READ REPEMPTY REPLACE REUSE ROLE SORTEDBY SPILL TOBSNO TYPE WRITE FILECLOSE FIRSTOBS IN OBS POINTOBS WHERE WHEREUP IDXNAME IDXWHERE DROP KEEP RENAME\",\n[\"inDataStep\"]);d(\"def\",\"filevar finfo finv fipname fipnamel fipstate first firstobs floor\",[\"inDataStep\"]);d(\"def\",\"varfmt varinfmt varlabel varlen varname varnum varray varrayx vartype verify vformat vformatd vformatdx vformatn vformatnx vformatw vformatwx vformatx vinarray vinarrayx vinformat vinformatd vinformatdx vinformatn vinformatnx vinformatw vinformatwx vinformatx vlabel vlabelx vlength vlengthx vname vnamex vnferr vtype vtypex weekday\",[\"inDataStep\"]);d(\"def\",\"zipfips zipname zipnamel zipstate\",\n[\"inDataStep\"]);d(\"def\",\"put putc putn\",[\"inDataStep\"]);d(\"builtin\",\"data run\",[\"inDataStep\"]);d(\"def\",\"data\",[\"inProc\"]);d(\"def\",\"%if %end %end; %else %else; %do %do; %then\",[\"inMacro\"]);d(\"builtin\",\"proc run; quit; libname filename %macro %mend option options\",[\"ALL\"]);d(\"def\",\"footnote title libname ods\",[\"ALL\"]);d(\"def\",\"%let %put %global %sysfunc %eval \",[\"ALL\"]);d(\"variable\",\"&sysbuffr &syscc &syscharwidth &syscmd &sysdate &sysdate9 &sysday &sysdevic &sysdmg &sysdsn &sysencoding &sysenv &syserr &syserrortext &sysfilrc &syshostname &sysindex &sysinfo &sysjobid &syslast &syslckrc &syslibrc &syslogapplname &sysmacroname &sysmenv &sysmsg &sysncpu &sysodspath &sysparm &syspbuff &sysprocessid &sysprocessname &sysprocname &sysrc &sysscp &sysscpl &sysscpl &syssite &sysstartid &sysstartname &systcpiphostname &systime &sysuserid &sysver &sysvlong &sysvlong4 &syswarningtext\",\n[\"ALL\"]);d(\"def\",\"source2 nosource2 page pageno pagesize\",[\"ALL\"]);d(\"def\",\"_all_ _character_ _cmd_ _freq_ _i_ _infile_ _last_ _msg_ _null_ _numeric_ _temporary_ _type_ abort abs addr adjrsq airy alpha alter altlog altprint and arcos array arsin as atan attrc attrib attrn authserver autoexec awscontrol awsdef awsmenu awsmenumerge awstitle backward band base betainv between blocksize blshift bnot bor brshift bufno bufsize bxor by byerr byline byte calculated call cards cards4 catcache cbufno cdf ceil center cexist change chisq cinv class cleanup close cnonct cntllev coalesce codegen col collate collin column comamid comaux1 comaux2 comdef compbl compound compress config continue convert cos cosh cpuid create cross crosstab css curobs cv daccdb daccdbsl daccsl daccsyd dacctab dairy datalines datalines4 datejul datepart datetime day dbcslang dbcstype dclose ddm delete delimiter depdb depdbsl depsl depsyd deptab dequote descending descript design= device dflang dhms dif digamma dim dinfo display distinct dkricond dkrocond dlm dnum do dopen doptname doptnum dread drop dropnote dsname dsnferr echo else emaildlg emailid emailpw emailserver emailsys encrypt end endsas engine eof eov erf erfc error errorcheck errors exist exp fappend fclose fcol fdelete feedback fetch fetchobs fexist fget file fileclose fileexist filefmt filename fileref  fmterr fmtsearch fnonct fnote font fontalias  fopen foptname foptnum force formatted formchar formdelim formdlim forward fpoint fpos fput fread frewind frlen from fsep fuzz fwrite gaminv gamma getoption getvarc getvarn go goto group gwindow hbar hbound helpenv helploc hms honorappearance hosthelp hostprint hour hpct html hvar ibessel ibr id if index indexc indexw initcmd initstmt inner input inputc inputn inr insert int intck intnx into intrr invaliddata irr is jbessel join juldate keep kentb kurtosis label lag last lbound leave left length levels lgamma lib  library libref line linesize link list log log10 log2 logpdf logpmf logsdf lostcard lowcase lrecl ls macro macrogen maps mautosource max maxdec maxr mdy mean measures median memtype merge merror min minute missing missover mlogic mod mode model modify month mopen mort mprint mrecall msglevel msymtabmax mvarsize myy n nest netpv new news nmiss no nobatch nobs nocaps nocardimage nocenter nocharcode nocmdmac nocol nocum nodate nodbcs nodetails nodmr nodms nodmsbatch nodup nodupkey noduplicates noechoauto noequals noerrorabend noexitwindows nofullstimer noicon noimplmac noint nolist noloadlist nomiss nomlogic nomprint nomrecall nomsgcase nomstored nomultenvappl nonotes nonumber noobs noovp nopad nopercent noprint noprintinit normal norow norsasuser nosetinit  nosplash nosymbolgen note notes notitle notitles notsorted noverbose noxsync noxwait npv null number numkeys nummousekeys nway obs  on open     order ordinal otherwise out outer outp= output over ovp p(1 5 10 25 50 75 90 95 99) pad pad2  paired parm parmcards path pathdll pathname pdf peek peekc pfkey pmf point poisson poke position printer probbeta probbnml probchi probf probgam probhypr probit probnegb probnorm probsig probt procleave prt ps  pw pwreq qtr quote r ranbin rancau ranexp rangam range ranks rannor ranpoi rantbl rantri ranuni read recfm register regr remote remove rename repeat replace resolve retain return reuse reverse rewind right round rsquare rtf rtrace rtraceloc s s2 samploc sasautos sascontrol sasfrscr sasmsg sasmstore sasscript sasuser saving scan sdf second select selection separated seq serror set setcomm setot sign simple sin sinh siteinfo skewness skip sle sls sortedby sortpgm sortseq sortsize soundex  spedis splashlocation split spool sqrt start std stderr stdin stfips stimer stname stnamel stop stopover subgroup subpopn substr sum sumwgt symbol symbolgen symget symput sysget sysin sysleave sysmsg sysparm sysprint sysprintfont sysprod sysrc system t table tables tan tanh tapeclose tbufsize terminal test then timepart tinv  tnonct to today tol tooldef totper transformout translate trantab tranwrd trigamma trim trimn trunc truncover type unformatted uniform union until upcase update user usericon uss validate value var  weight when where while wincharset window work workinit workterm write wsum xsync xwait yearcutoff yes yyq  min max\",\n[\"inDataStep\",\"inProc\"]);d(\"operator\",\"and not \",[\"inDataStep\",\"inProc\"]);return{startState:function(){return{inDataStep:!1,inProc:!1,inMacro:!1,nextword:!1,continueString:null,continueComment:!1}},token:function(a,c){return a.eatSpace()?null:f(a,c)},blockCommentStart:\"/*\",blockCommentEnd:\"*/\"}});f.defineMIME(\"text/x-sas\",\"sas\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/sass/sass.js",
    "content": "'use strict';(function(f){\"object\"==typeof exports&&\"object\"==typeof module?f(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],f):f(CodeMirror)})(function(f){f.defineMode(\"sass\",function(f){function k(a,b){var c=a.peek();if(\")\"===c)return a.next(),b.tokenizer=g,\"operator\";if(\"(\"===c)return a.next(),a.eatSpace(),\"operator\";b.tokenizer=\"'\"===c||'\"'===c?h(a.next()):h(\")\",!1);return\"string\"}function l(a,b){return function(c,d){if(c.sol()&&c.indentation()<=\na)return d.tokenizer=g,g(c,d);b&&c.skipTo(\"*/\")?(c.next(),c.next(),d.tokenizer=g):c.skipToEnd();return\"comment\"}}function h(a,b){function c(d,f){var e=d.next(),m=d.peek(),h=d.string.charAt(d.pos-2);return\"\\\\\"!==e&&m===a||e===a&&\"\\\\\"!==h?(e!==a&&b&&d.next(),f.tokenizer=g,\"string\"):\"#\"===e&&\"{\"===m?(f.tokenizer=n(c),d.next(),\"operator\"):\"string\"}null==b&&(b=!0);return c}function n(a){return function(b,c){return\"}\"===b.peek()?(b.next(),c.tokenizer=a,\"operator\"):g(b,c)}}function e(a){0==a.indentCount&&\n(a.indentCount++,a.scopes.unshift({offset:a.scopes[0].offset+f.indentUnit}))}function g(a,b){var c=a.peek();if(a.match(\"/*\"))return b.tokenizer=l(a.indentation(),!0),b.tokenizer(a,b);if(a.match(\"//\"))return b.tokenizer=l(a.indentation(),!1),b.tokenizer(a,b);if(a.match(\"#{\"))return b.tokenizer=n(g),\"operator\";if('\"'===c||\"'\"===c)return a.next(),b.tokenizer=h(c),\"string\";if(b.cursorHalf){if(\"#\"===c&&(a.next(),a.match(/[0-9a-fA-F]{6}|[0-9a-fA-F]{3}/))||a.match(/^-?[0-9\\.]+/))return a.peek()||(b.cursorHalf=\n0),\"number\";if(a.match(/^(px|em|in)\\b/))return a.peek()||(b.cursorHalf=0),\"unit\";if(a.match(p))return a.peek()||(b.cursorHalf=0),\"keyword\";if(a.match(/^url/)&&\"(\"===a.peek())return b.tokenizer=k,a.peek()||(b.cursorHalf=0),\"atom\";if(\"$\"===c)return a.next(),a.eatWhile(/[\\w-]/),a.peek()||(b.cursorHalf=0),\"variable-3\";if(\"!\"===c)return a.next(),a.peek()||(b.cursorHalf=0),a.match(/^[\\w]+/)?\"keyword\":\"operator\";if(a.match(q))return a.peek()||(b.cursorHalf=0),\"operator\";if(a.eatWhile(/[\\w-]/))return a.peek()||\n(b.cursorHalf=0),\"attribute\";if(!a.peek())return b.cursorHalf=0,null}else{if(\".\"===c&&(a.next(),a.match(/^[\\w-]+/)||\"#\"===a.peek())||\"#\"===c&&(a.next(),a.match(/^[\\w-]+/)||\"#\"===a.peek()))return e(b),\"atom\";if(\"$\"===c)return a.next(),a.eatWhile(/[\\w-]/),\"variable-2\";if(a.match(/^-?[0-9\\.]+/))return\"number\";if(a.match(/^(px|em|in)\\b/))return\"unit\";if(a.match(p))return\"keyword\";if(a.match(/^url/)&&\"(\"===a.peek())return b.tokenizer=k,\"atom\";if(\"=\"===c&&a.match(/^=[\\w-]+/))return e(b),\"meta\";if(\"+\"===\nc&&a.match(/^\\+[\\w-]+/))return\"variable-3\";\"@\"===c&&a.match(/@extend/)&&!a.match(/\\s*[\\w]/)&&1!=b.scopes.length&&b.scopes.shift();if(a.match(/^@(else if|if|media|else|for|each|while|mixin|function)/))return e(b),\"meta\";if(\"@\"===c)return a.next(),a.eatWhile(/[\\w-]/),\"meta\";if(a.eatWhile(/[\\w-]/)){if(a.match(/ *: *[\\w-\\+\\$#!\\(\"']/,!1))return\"property\";a.match(/ *:/,!1)?(e(b),b.cursorHalf=1):a.match(/ *,/,!1)||e(b);return\"atom\"}if(\":\"===c){if(a.match(r))return\"keyword\";a.next();b.cursorHalf=1;return\"operator\"}}if(a.match(q))return\"operator\";\na.next();return null}var p=/^true|false|null|auto/,q=/^\\(|\\)|=|>|<|==|>=|<=|\\+|-|\\!=|\\/|\\*|%|and|or|not|;|\\{|\\}|:/,r=/^::?[a-zA-Z_][\\w\\-]*/;return{startState:function(){return{tokenizer:g,scopes:[{offset:0,type:\"sass\"}],indentCount:0,cursorHalf:0,definedVars:[],definedMixins:[]}},token:function(a,b){a.sol()&&(b.indentCount=0);var c=b.tokenizer(a,b),d=a.current();\"@return\"!==d&&\"}\"!==d||1==b.scopes.length||b.scopes.shift();if(null!==c){for(var d=a.pos-d.length+f.indentUnit*b.indentCount,e=[],g=0;g<\nb.scopes.length;g++){var h=b.scopes[g];h.offset<=d&&e.push(h)}b.scopes=e}b.lastToken={style:c,content:a.current()};return c},indent:function(a){return a.scopes[0].offset}}});f.defineMIME(\"text/x-sass\",\"sass\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/scheme/scheme.js",
    "content": "'use strict';(function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],e):e(CodeMirror)})(function(e){e.defineMode(\"scheme\",function(){function e(a){var c={};a=a.split(\" \");for(var b=0;b<a.length;++b)c[a[b]]=!0;return c}function g(a,c,b){this.indent=a;this.type=c;this.prev=b}function l(a){return a.match(m)}function n(a){return a.match(p)}function h(a,c){!0===c&&a.backUp(1);return a.match(q)}\nfunction r(a){return a.match(t)}var k=e(\"\\u03bb case-lambda call/cc class define-class exit-handler field import inherit init-field interface let*-values let-values let/ec mixin opt-lambda override protect provide public rename require require-for-syntax syntax syntax-case syntax-error unit/sig unless when with-syntax and begin call-with-current-continuation call-with-input-file call-with-output-file case cond define define-syntax delay do dynamic-wind else for-each if lambda let let* let-syntax letrec letrec-syntax map or syntax-rules abs acos angle append apply asin assoc assq assv atan boolean? caar cadr call-with-input-file call-with-output-file call-with-values car cdddar cddddr cdr ceiling char->integer char-alphabetic? char-ci<=? char-ci<? char-ci=? char-ci>=? char-ci>? char-downcase char-lower-case? char-numeric? char-ready? char-upcase char-upper-case? char-whitespace? char<=? char<? char=? char>=? char>? char? close-input-port close-output-port complex? cons cos current-input-port current-output-port denominator display eof-object? eq? equal? eqv? eval even? exact->inexact exact? exp expt #f floor force gcd imag-part inexact->exact inexact? input-port? integer->char integer? interaction-environment lcm length list list->string list->vector list-ref list-tail list? load log magnitude make-polar make-rectangular make-string make-vector max member memq memv min modulo negative? newline not null-environment null? number->string number? numerator odd? open-input-file open-output-file output-port? pair? peek-char port? positive? procedure? quasiquote quote quotient rational? rationalize read read-char real-part real? remainder reverse round scheme-report-environment set! set-car! set-cdr! sin sqrt string string->list string->number string->symbol string-append string-ci<=? string-ci<? string-ci=? string-ci>=? string-ci>? string-copy string-fill! string-length string-ref string-set! string<=? string<? string=? string>=? string>? string? substring symbol->string symbol? #t tan transcript-off transcript-on truncate values vector vector->list vector-fill! vector-length vector-ref vector-set! with-input-from-file with-output-to-file write write-char zero?\"),\nu=e(\"define let letrec let* lambda\"),m=new RegExp(/^(?:[-+]i|[-+][01]+#*(?:\\/[01]+#*)?i|[-+]?[01]+#*(?:\\/[01]+#*)?@[-+]?[01]+#*(?:\\/[01]+#*)?|[-+]?[01]+#*(?:\\/[01]+#*)?[-+](?:[01]+#*(?:\\/[01]+#*)?)?i|[-+]?[01]+#*(?:\\/[01]+#*)?)(?=[()\\s;\"]|$)/i),p=new RegExp(/^(?:[-+]i|[-+][0-7]+#*(?:\\/[0-7]+#*)?i|[-+]?[0-7]+#*(?:\\/[0-7]+#*)?@[-+]?[0-7]+#*(?:\\/[0-7]+#*)?|[-+]?[0-7]+#*(?:\\/[0-7]+#*)?[-+](?:[0-7]+#*(?:\\/[0-7]+#*)?)?i|[-+]?[0-7]+#*(?:\\/[0-7]+#*)?)(?=[()\\s;\"]|$)/i),t=new RegExp(/^(?:[-+]i|[-+][\\da-f]+#*(?:\\/[\\da-f]+#*)?i|[-+]?[\\da-f]+#*(?:\\/[\\da-f]+#*)?@[-+]?[\\da-f]+#*(?:\\/[\\da-f]+#*)?|[-+]?[\\da-f]+#*(?:\\/[\\da-f]+#*)?[-+](?:[\\da-f]+#*(?:\\/[\\da-f]+#*)?)?i|[-+]?[\\da-f]+#*(?:\\/[\\da-f]+#*)?)(?=[()\\s;\"]|$)/i),\nq=new RegExp(/^(?:[-+]i|[-+](?:(?:(?:\\d+#+\\.?#*|\\d+\\.\\d*#*|\\.\\d+#*|\\d+)(?:[esfdl][-+]?\\d+)?)|\\d+#*\\/\\d+#*)i|[-+]?(?:(?:(?:\\d+#+\\.?#*|\\d+\\.\\d*#*|\\.\\d+#*|\\d+)(?:[esfdl][-+]?\\d+)?)|\\d+#*\\/\\d+#*)@[-+]?(?:(?:(?:\\d+#+\\.?#*|\\d+\\.\\d*#*|\\.\\d+#*|\\d+)(?:[esfdl][-+]?\\d+)?)|\\d+#*\\/\\d+#*)|[-+]?(?:(?:(?:\\d+#+\\.?#*|\\d+\\.\\d*#*|\\.\\d+#*|\\d+)(?:[esfdl][-+]?\\d+)?)|\\d+#*\\/\\d+#*)[-+](?:(?:(?:\\d+#+\\.?#*|\\d+\\.\\d*#*|\\.\\d+#*|\\d+)(?:[esfdl][-+]?\\d+)?)|\\d+#*\\/\\d+#*)?i|(?:(?:(?:\\d+#+\\.?#*|\\d+\\.\\d*#*|\\.\\d+#*|\\d+)(?:[esfdl][-+]?\\d+)?)|\\d+#*\\/\\d+#*))(?=[()\\s;\"]|$)/i);\nreturn{startState:function(){return{indentStack:null,indentation:0,mode:!1,sExprComment:!1}},token:function(a,c){null==c.indentStack&&a.sol()&&(c.indentation=a.indentation());if(a.eatSpace())return null;var b=null;switch(c.mode){case \"string\":for(var d,b=!1;null!=(d=a.next());){if('\"'==d&&!b){c.mode=!1;break}b=!b&&\"\\\\\"==d}b=\"string\";break;case \"comment\":for(b=!1;null!=(d=a.next());){if(\"#\"==d&&b){c.mode=!1;break}b=\"|\"==d}b=\"comment\";break;case \"s-expr-comment\":if(c.mode=!1,\"(\"==a.peek()||\"[\"==a.peek())c.sExprComment=\n0;else{a.eatWhile(/[^/s]/);b=\"comment\";break}default:if(d=a.next(),'\"'==d)b=c.mode=\"string\";else if(\"'\"==d)b=\"atom\";else if(\"#\"==d)if(a.eat(\"|\"))b=c.mode=\"comment\";else if(a.eat(/[tf]/i))b=\"atom\";else if(a.eat(\";\"))c.mode=\"s-expr-comment\",b=\"comment\";else{d=null;var e=!1,f=!0;a.eat(/[ei]/i)?e=!0:a.backUp(1);a.match(/^#b/i)?d=l:a.match(/^#o/i)?d=n:a.match(/^#x/i)?d=r:a.match(/^#d/i)?d=h:a.match(/^[-+0-9.]/,!1)?(f=!1,d=h):e||a.eat(\"#\");null!=d&&(f&&!e&&a.match(/^#[ei]/i),d(a)&&(b=\"number\"))}else if(/^[-+0-9.]/.test(d)&&\nh(a,!0))b=\"number\";else if(\";\"==d)a.skipToEnd(),b=\"comment\";else if(\"(\"==d||\"[\"==d){b=\"\";for(e=a.column();null!=(f=a.eat(/[^\\s\\(\\[\\;\\)\\]]/));)b+=f;0<b.length&&u.propertyIsEnumerable(b)?c.indentStack=new g(e+2,d,c.indentStack):(a.eatSpace(),a.eol()||\";\"==a.peek()?c.indentStack=new g(e+1,d,c.indentStack):(b=e+a.current().length,c.indentStack=new g(b,d,c.indentStack)));a.backUp(a.current().length-1);\"number\"==typeof c.sExprComment&&c.sExprComment++;b=\"bracket\"}else\")\"==d||\"]\"==d?(b=\"bracket\",null!=c.indentStack&&\nc.indentStack.type==(\")\"==d?\"(\":\"[\")&&(c.indentStack=c.indentStack.prev,\"number\"==typeof c.sExprComment&&0==--c.sExprComment&&(b=\"comment\",c.sExprComment=!1))):(a.eatWhile(/[\\w\\$_\\-!$%&*+\\.\\/:<=>?@\\^~]/),b=k&&k.propertyIsEnumerable(a.current())?\"builtin\":\"variable\")}return\"number\"==typeof c.sExprComment?\"comment\":b},indent:function(a){return null==a.indentStack?a.indentation:a.indentStack.indent},closeBrackets:{pairs:'()[]{}\"\"'},lineComment:\";;\"}});e.defineMIME(\"text/x-scheme\",\"scheme\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/shell/shell.js",
    "content": "'use strict';(function(d){\"object\"==typeof exports&&\"object\"==typeof module?d(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],d):d(CodeMirror)})(function(d){d.defineMode(\"shell\",function(){function d(a,b){b=b.split(\" \");for(var e=0;e<b.length;e++)h[b[e]]=a}function g(a,b){if(a.eatSpace())return null;var e=a.sol(),c=a.next();if(\"\\\\\"===c)return a.next(),null;if(\"'\"===c||'\"'===c||\"`\"===c)return b.tokens.unshift(k(c)),(b.tokens[0]||g)(a,b);if(\"#\"===\nc){if(e&&a.eat(\"!\"))return a.skipToEnd(),\"meta\";a.skipToEnd();return\"comment\"}if(\"$\"===c)return b.tokens.unshift(l),(b.tokens[0]||g)(a,b);if(\"+\"===c||\"=\"===c)return\"operator\";if(\"-\"===c)return a.eat(\"-\"),a.eatWhile(/\\w/),\"attribute\";if(/\\d/.test(c)&&(a.eatWhile(/\\d/),a.eol()||!/\\w/.test(a.peek())))return\"number\";a.eatWhile(/[\\w-]/);b=a.current();return\"=\"===a.peek()&&/\\w+/.test(b)?\"def\":h.hasOwnProperty(b)?h[b]:null}function k(a){return function(b,e){for(var c,d=!1,f=!1;null!=(c=b.next());){if(c===\na&&!f){d=!0;break}if(\"$\"===c&&!f&&\"'\"!==a){f=!0;b.backUp(1);e.tokens.unshift(l);break}f=!f&&\"\\\\\"===c}!d&&f||e.tokens.shift();return\"`\"===a||\")\"===a?\"quote\":\"string\"}}var h={};d(\"atom\",\"true false\");d(\"keyword\",\"if then do else elif while until for in esac fi fin fil done exit set unset export function\");d(\"builtin\",\"ab awk bash beep cat cc cd chown chmod chroot clear cp curl cut diff echo find gawk gcc get git grep kill killall ln ls make mkdir openssl mv nc node npm ping ps restart rm rmdir sed service sh shopt shred source sort sleep ssh start stop su sudo tee telnet top touch vi vim wall wc wget who write yes zsh\");\nvar l=function(a,b){1<b.tokens.length&&a.eat(\"$\");var d=a.next(),c=/\\w/;\"{\"===d&&(c=/[^}]/);if(\"(\"===d)return b.tokens[0]=k(\")\"),(b.tokens[0]||g)(a,b);/\\d/.test(d)||(a.eatWhile(c),a.eat(\"}\"));b.tokens.shift();return\"def\"};return{startState:function(){return{tokens:[]}},token:function(a,b){return(b.tokens[0]||g)(a,b)},lineComment:\"#\",fold:\"brace\"}});d.defineMIME(\"text/x-sh\",\"shell\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/sieve/sieve.js",
    "content": "'use strict';(function(d){\"object\"==typeof exports&&\"object\"==typeof module?d(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],d):d(CodeMirror)})(function(d){d.defineMode(\"sieve\",function(d){function g(a){var b={};a=a.split(\" \");for(var c=0;c<a.length;++c)b[a[c]]=!0;return b}function e(a,b){var c=a.next();if(\"/\"==c&&a.eat(\"*\"))return b.tokenize=h,h(a,b);if(\"#\"===c)return a.skipToEnd(),\"comment\";if('\"'==c)return b.tokenize=k(c),b.tokenize(a,b);\nif(\"(\"==c)return b._indent.push(\"(\"),b._indent.push(\"{\"),null;if(\"{\"===c)return b._indent.push(\"{\"),null;\")\"==c&&(b._indent.pop(),b._indent.pop());if(\"}\"===c)return b._indent.pop(),null;if(\",\"==c||\";\"==c||/[{}\\(\\),;]/.test(c))return null;if(/\\d/.test(c))return a.eatWhile(/[\\d]/),a.eat(/[KkMmGg]/),\"number\";if(\":\"==c)return a.eatWhile(/[a-zA-Z_]/),a.eatWhile(/[a-zA-Z0-9_]/),\"operator\";a.eatWhile(/\\w/);c=a.current();return\"text\"==c&&a.eat(\":\")?(b.tokenize=l,\"string\"):m.propertyIsEnumerable(c)?\"keyword\":\nn.propertyIsEnumerable(c)?\"atom\":null}function l(a,b){b._multiLineString=!0;if(!a.sol()){a.eatSpace();if(\"#\"==a.peek())return a.skipToEnd(),\"comment\";a.skipToEnd();return\"string\"}\".\"==a.next()&&a.eol()&&(b._multiLineString=!1,b.tokenize=e);return\"string\"}function h(a,b){for(var c=!1,d;null!=(d=a.next());){if(c&&\"/\"==d){b.tokenize=e;break}c=\"*\"==d}return\"comment\"}function k(a){return function(b,c){for(var d=!1,f;null!=(f=b.next())&&(f!=a||d);)d=!d&&\"\\\\\"==f;d||(c.tokenize=e);return\"string\"}}var m=g(\"if elsif else stop require\"),\nn=g(\"true false not\"),p=d.indentUnit;return{startState:function(a){return{tokenize:e,baseIndent:a||0,_indent:[]}},token:function(a,b){return a.eatSpace()?null:(b.tokenize||e)(a,b)},indent:function(a,b){a=a._indent.length;b&&\"}\"==b[0]&&a--;0>a&&(a=0);return a*p},electricChars:\"}\"}});d.defineMIME(\"application/sieve\",\"sieve\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/slim/slim.js",
    "content": "'use strict';(function(d){\"object\"==typeof exports&&\"object\"==typeof module?d(require(\"../../lib/codemirror\"),require(\"../htmlmixed/htmlmixed\"),require(\"../ruby/ruby\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\",\"../htmlmixed/htmlmixed\",\"../ruby/ruby\"],d):d(CodeMirror)})(function(d){d.defineMode(\"slim\",function(m){function J(a,b,c){var e=function(e,d){d.tokenize=b;return e.pos<a?(e.pos=a,c):d.tokenize(e,d)};return function(a,c){c.tokenize=e;return b(a,c)}}function t(a,b){a.stack=\n{parent:a.stack,style:\"continuation\",indented:b,tokenize:a.line};a.line=a.tokenize}function u(a){a.line==a.tokenize&&(a.line=a.stack.tokenize,a.stack=a.stack.parent)}function K(a,b){return function(c,e){u(e);if(c.match(/^\\\\$/))return t(e,a),\"lineContinuation\";e=b(c,e);c.eol()&&c.current().match(/(?:^|[^\\\\])(?:\\\\\\\\)*\\\\$/)&&c.backUp(1);return e}}function L(a,b){return function(c,e){u(e);var d=b(c,e);c.eol()&&c.current().match(/,$/)&&t(e,a);return d}}function v(a,b){return function(c,e){return c.peek()==\na&&1==e.rubyState.tokenize.length?(c.next(),e.tokenize=b,\"closeAttributeTag\"):n(c,e)}}function f(a){var b,c=function(c,d){if(1==d.rubyState.tokenize.length&&!d.rubyState.context.prev){c.backUp(1);if(c.eatSpace())return d.rubyState=b,d.tokenize=a,a(c,d);c.next()}return n(c,d)};return function(a,k){b=k.rubyState;k.rubyState=d.startState(p);k.tokenize=c;return n(a,k)}}function n(a,b){return p.token(a,b.rubyState)}function z(a,b){if(a.match(/^#\\{/))return b.tokenize=v(\"}\",b.tokenize),null;var c=r.token(a,\nb.htmlState),d=a.current(),k=d.search(/[^\\\\]#\\{/);-1<k&&(b.tokenize=J(a.pos,b.tokenize,c),a.backUp(d.length-k-1));return c}function M(a){return function(b,c){var d;d=b.match(/^\\\\$/)?\"lineContinuation\":z(b,c);b.eol()&&(c.tokenize=a);return d}}function A(a,b,c){b.stack={parent:b.stack,style:\"html\",indented:a.column()+c,tokenize:b.line};b.line=b.tokenize=z;return null}function B(a,b){a.skipToEnd();return b.stack.style}function l(a,b){if(a.eat(b.stack.endQuote))return b.line=b.stack.line,b.tokenize=b.stack.tokenize,\nb.stack=b.stack.parent,null;if(a.match(N))return b.tokenize=O,\"slimAttribute\";a.next();return null}function O(a,b){return a.match(/^==?/)?(b.tokenize=P,null):l(a,b)}function P(a,b){var c=a.peek();return'\"'==c||\"'\"==c?(b.tokenize=C(c,\"string\",!0,!1,l),a.next(),b.tokenize(a,b)):\"[\"==c?f(l)(a,b):a.match(/^(true|false|nil)\\b/)?(b.tokenize=l,\"keyword\"):f(l)(a,b)}function Q(a,b){if(a.match(/^#\\{/))return b.tokenize=v(\"}\",b.tokenize),null;var c=new d.StringStream(a.string.slice(b.stack.indented),a.tabSize);\nc.pos=a.pos-b.stack.indented;c.start=a.start-b.stack.indented;c.lastColumnPos=a.lastColumnPos-b.stack.indented;c.lastColumnValue=a.lastColumnValue-b.stack.indented;var e=b.subMode.token(c,b.subState);a.pos=c.pos+b.stack.indented;return e}function R(a,b){b.stack.indented=a.column();b.line=b.tokenize=Q;return b.tokenize(a,b)}function S(a,b){a.skipToEnd();return\"slimDoctype\"}function T(a,b){if(\"<\"==a.peek())return(b.tokenize=M(b.tokenize))(a,b);if(a.match(/^[|']/))return A(a,b,1);if(a.match(/^\\/(!|\\[\\w+])?/))return b.stack=\n{parent:b.stack,style:\"comment\",indented:b.indented+1,tokenize:b.line},b.line=B,B(a,b);if(a.match(/^(-|==?[<>]?)/))return b.tokenize=K(a.column(),L(a.column(),n)),\"slimSwitch\";if(a.match(/^doctype\\b/))return b.tokenize=S,\"keyword\";var c=a.match(U);if(c){a=c[1];if(w.hasOwnProperty(a))a=w[a];else{var c=D[a],e=d.mimeModes[c];c=e?d.getMode(m,e):(e=d.modes[c])?e(m,{name:c}):d.getMode(m,\"null\");a=w[a]=c}c=d.startState(a);b.subMode=a;b.subState=c;b.stack={parent:b.stack,style:\"sub\",indented:b.indented+1,\ntokenize:b.line};b.line=b.tokenize=R;return\"slimSubmode\"}return x(a,b)}function y(a,b){return b.startOfLine?T(a,b):x(a,b)}function x(a,b){return a.eat(\"*\")?(b.tokenize=f(E),null):a.match(V)?(b.tokenize=E,\"slimTag\"):q(a,b)}function E(a,b){return a.match(/^(<>?|><?)/)?(b.tokenize=q,null):q(a,b)}function q(a,b){return a.match(W)?(b.tokenize=q,\"slimId\"):a.match(X)?(b.tokenize=q,\"slimClass\"):g(a,b)}function g(a,b){return a.match(/^([\\[\\{\\(])/)?(b.stack={parent:b.stack,style:\"wrapper\",indented:b.indented+\n1,tokenize:g,line:b.line,endQuote:Y[RegExp.$1]},b.line=b.tokenize=l,null):a.match(Z)?(b.tokenize=aa,\"slimAttribute\"):\"*\"==a.peek()?(a.next(),b.tokenize=f(F),null):F(a,b)}function aa(a,b){return a.match(/^==?/)?(b.tokenize=ba,null):g(a,b)}function ba(a,b){var c=a.peek();return'\"'==c||\"'\"==c?(b.tokenize=C(c,\"string\",!0,!1,g),a.next(),b.tokenize(a,b)):\"[\"==c?f(g)(a,b):\":\"==c?f(G)(a,b):a.match(/^(true|false|nil)\\b/)?(b.tokenize=g,\"keyword\"):f(g)(a,b)}function G(a,b){a.backUp(1);if(a.match(/^[^\\s],(?=:)/))return b.tokenize=\nf(G),null;a.next();return g(a,b)}function C(a,b,c,d,k){return function(e,f){u(f);var h=0==e.current().length;if(e.match(/^\\\\$/,h)){if(!h)return b;t(f,f.indented);return\"lineContinuation\"}if(e.match(/^#\\{/,h)){if(!h)return b;f.tokenize=v(\"}\",f.tokenize);return null}for(var h=!1,g;null!=(g=e.next());){if(g==a&&(d||!h)){f.tokenize=k;break}if(c&&\"#\"==g&&!h&&e.eat(\"{\")){e.backUp(2);break}h=!h&&\"\\\\\"==g}e.eol()&&h&&e.backUp(1);return b}}function F(a,b){if(a.match(/^==?/))return b.tokenize=n,\"slimSwitch\";\nif(a.match(/^\\/$/))return b.tokenize=y,null;if(a.match(/^:/))return b.tokenize=x,\"slimSwitch\";A(a,b,0);return b.tokenize(a,b)}var r=d.getMode(m,{name:\"htmlmixed\"}),p=d.getMode(m,\"ruby\"),w={html:r,ruby:p},D={ruby:\"ruby\",javascript:\"javascript\",css:\"text/css\",sass:\"text/x-sass\",scss:\"text/x-scss\",less:\"text/x-less\",styl:\"text/x-styl\",coffee:\"coffeescript\",asciidoc:\"text/x-asciidoc\",markdown:\"text/x-markdown\",textile:\"text/x-textile\",creole:\"text/x-creole\",wiki:\"text/x-wiki\",mediawiki:\"text/x-mediawiki\",\nrdoc:\"text/x-rdoc\",builder:\"text/x-builder\",nokogiri:\"text/x-nokogiri\",erb:\"application/x-erb\"},U=function(a){var b=[],c;for(c in a)b.push(c);return new RegExp(\"^(\"+b.join(\"|\")+\"):\")}(D),H={commentLine:\"comment\",slimSwitch:\"operator special\",slimTag:\"tag\",slimId:\"attribute def\",slimClass:\"attribute qualifier\",slimAttribute:\"attribute\",slimSubmode:\"keyword special\",closeAttributeTag:null,slimDoctype:null,lineContinuation:null},Y={\"{\":\"}\",\"[\":\"]\",\"(\":\")\"},V=/^[:_a-zA-Z\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u02ff\\u0370-\\u037d\\u037f-\\u1fff\\u200c-\\u200d\\u2070-\\u218f\\u2c00-\\u2fef\\u3001-\\ud7ff\\uf900-\\ufdcf\\ufdf0-\\ufffd](?::[_a-zA-Z\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u02ff\\u0370-\\u037d\\u037f-\\u1fff\\u200c-\\u200d\\u2070-\\u218f\\u2c00-\\u2fef\\u3001-\\ud7ff\\uf900-\\ufdcf\\ufdf0-\\ufffd\\-0-9\\u00b7\\u0300-\\u036f\\u203f-\\u2040]|[_a-zA-Z\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u02ff\\u0370-\\u037d\\u037f-\\u1fff\\u200c-\\u200d\\u2070-\\u218f\\u2c00-\\u2fef\\u3001-\\ud7ff\\uf900-\\ufdcf\\ufdf0-\\ufffd\\-0-9\\u00b7\\u0300-\\u036f\\u203f-\\u2040]*)/,\nZ=/^[:_a-zA-Z\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u02ff\\u0370-\\u037d\\u037f-\\u1fff\\u200c-\\u200d\\u2070-\\u218f\\u2c00-\\u2fef\\u3001-\\ud7ff\\uf900-\\ufdcf\\ufdf0-\\ufffd][:\\._a-zA-Z\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u02ff\\u0370-\\u037d\\u037f-\\u1fff\\u200c-\\u200d\\u2070-\\u218f\\u2c00-\\u2fef\\u3001-\\ud7ff\\uf900-\\ufdcf\\ufdf0-\\ufffd\\-0-9\\u00b7\\u0300-\\u036f\\u203f-\\u2040]*(?=\\s*=)/,N=/^[:_a-zA-Z\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u02ff\\u0370-\\u037d\\u037f-\\u1fff\\u200c-\\u200d\\u2070-\\u218f\\u2c00-\\u2fef\\u3001-\\ud7ff\\uf900-\\ufdcf\\ufdf0-\\ufffd][:\\._a-zA-Z\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u02ff\\u0370-\\u037d\\u037f-\\u1fff\\u200c-\\u200d\\u2070-\\u218f\\u2c00-\\u2fef\\u3001-\\ud7ff\\uf900-\\ufdcf\\ufdf0-\\ufffd\\-0-9\\u00b7\\u0300-\\u036f\\u203f-\\u2040]*/,\nX=/^\\.-?[_a-zA-Z]+[\\w\\-]*/,W=/^#[_a-zA-Z]+[\\w\\-]*/,I={startState:function(){var a=d.startState(r),b=d.startState(p);return{htmlState:a,rubyState:b,stack:null,last:null,tokenize:y,line:y,indented:0}},copyState:function(a){return{htmlState:d.copyState(r,a.htmlState),rubyState:d.copyState(p,a.rubyState),subMode:a.subMode,subState:a.subMode&&d.copyState(a.subMode,a.subState),stack:a.stack,last:a.last,tokenize:a.tokenize,line:a.line}},token:function(a,b){if(a.sol())for(b.indented=a.indentation(),b.startOfLine=\n!0,b.tokenize=b.line;b.stack&&b.stack.indented>b.indented&&\"slimSubmode\"!=b.last;)b.line=b.tokenize=b.stack.tokenize,b.stack=b.stack.parent,b.subMode=null,b.subState=null;if(a.eatSpace())return null;a=b.tokenize(a,b);b.startOfLine=!1;a&&(b.last=a);return H.hasOwnProperty(a)?H[a]:a},blankLine:function(a){if(a.subMode&&a.subMode.blankLine)return a.subMode.blankLine(a.subState)},innerMode:function(a){return a.subMode?{state:a.subState,mode:a.subMode}:{state:a,mode:I}}};return I},\"htmlmixed\",\"ruby\");\nd.defineMIME(\"text/x-slim\",\"slim\");d.defineMIME(\"application/x-slim\",\"slim\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/smalltalk/smalltalk.js",
    "content": "'use strict';(function(f){\"object\"==typeof exports&&\"object\"==typeof module?f(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],f):f(CodeMirror)})(function(f){f.defineMode(\"smalltalk\",function(f){var k=/[+\\-\\/\\\\*~<>=@%|&?!.,:;^]/,r=/true|false|nil|self|super|thisContext/,g=function(a,b){this.next=a;this.parent=b},h=function(a,b,d){this.name=a;this.context=b;this.eos=d},m=function(){this.context=new g(l,null);this.expectVariable=!0;this.userIndentationDelta=\nthis.indentation=0};m.prototype.userIndent=function(a){this.userIndentationDelta=0<a?a/f.indentUnit-this.indentation:0};var l=function(a,b,d){var c=new h(null,b,!1),e=a.next();'\"'===e?c=n(a,new g(n,b)):\"'\"===e?c=p(a,new g(p,b)):\"#\"===e?\"'\"===a.peek()?(a.next(),c=q(a,new g(q,b))):a.eatWhile(/[^\\s.{}\\[\\]()]/)?c.name=\"string-2\":c.name=\"meta\":\"$\"===e?(\"<\"===a.next()&&(a.eatWhile(/[^\\s>]/),a.next()),c.name=\"string-2\"):\"|\"===e&&d.expectVariable?c.context=new g(t,b):/[\\[\\]{}()]/.test(e)?(c.name=\"bracket\",\nc.eos=/[\\[{(]/.test(e),\"[\"===e?d.indentation++:\"]\"===e&&(d.indentation=Math.max(0,d.indentation-1))):k.test(e)?(a.eatWhile(k),c.name=\"operator\",c.eos=\";\"!==e):/\\d/.test(e)?(a.eatWhile(/[\\w\\d]/),c.name=\"number\"):/[\\w_]/.test(e)?(a.eatWhile(/[\\w\\d_]/),c.name=d.expectVariable?r.test(a.current())?\"keyword\":\"variable\":null):c.eos=d.expectVariable;return c},n=function(a,b){a.eatWhile(/[^\"]/);return new h(\"comment\",a.eat('\"')?b.parent:b,!0)},p=function(a,b){a.eatWhile(/[^']/);return new h(\"string\",a.eat(\"'\")?\nb.parent:b,!1)},q=function(a,b){a.eatWhile(/[^']/);return new h(\"string-2\",a.eat(\"'\")?b.parent:b,!1)},t=function(a,b){var d=new h(null,b,!1);\"|\"===a.next()?(d.context=b.parent,d.eos=!0):(a.eatWhile(/[^|]/),d.name=\"variable\");return d};return{startState:function(){return new m},token:function(a,b){b.userIndent(a.indentation());if(a.eatSpace())return null;a=b.context.next(a,b.context,b);b.context=a.context;b.expectVariable=a.eos;return a.name},blankLine:function(a){a.userIndent(0)},indent:function(a,\nb){b=a.context.next===l&&b&&\"]\"===b.charAt(0)?-1:a.userIndentationDelta;return(a.indentation+b)*f.indentUnit},electricChars:\"]\"}});f.defineMIME(\"text/x-stsrc\",{name:\"smalltalk\"})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/smarty/smarty.js",
    "content": "'use strict';(function(d){\"object\"==typeof exports&&\"object\"==typeof module?d(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],d):d(CodeMirror)})(function(d){d.defineMode(\"smarty\",function(t,l){function e(a,b){m=b;return a}function h(a,b){for(var c=a.string,e=a.pos;;){var d=c.indexOf(g,e),e=d+g.length,f;(f=-1==d)||(f=d+g.length,null==f&&(f=a.pos),f=!(3===p&&\"{\"==g&&(f==a.string.length||/\\s/.test(a.string.charAt(f)))));if(f)break}if(d==a.pos){a.match(g);\nif(a.eat(\"*\"))return c=u(\"comment\",\"*\"+n),b.tokenize=c,c(a,b);b.depth++;b.tokenize=q;m=\"startTag\";return\"tag\"}-1<d&&(a.string=c.slice(0,d));b=k.token(a,b.base);-1<d&&(a.string=c);return b}function q(a,b){if(a.match(n,!0))return 3===p?(b.depth--,0>=b.depth&&(b.tokenize=h)):b.tokenize=h,e(\"tag\",null);if(a.match(g,!0))return b.depth++,e(\"tag\",\"startTag\");var c=a.next();if(\"$\"==c)return a.eatWhile(f.validIdentifier),e(\"variable-2\",\"variable\");if(\"|\"==c)return e(\"operator\",\"pipe\");if(\".\"==c)return e(\"operator\",\n\"property\");if(f.stringChar.test(c))return b.tokenize=v(c),e(\"string\",\"string\");if(f.operatorChars.test(c))return a.eatWhile(f.operatorChars),e(\"operator\",\"operator\");if(\"[\"==c||\"]\"==c)return e(\"bracket\",\"bracket\");if(\"(\"==c||\")\"==c)return e(\"bracket\",\"operator\");if(/\\d/.test(c))return a.eatWhile(/\\d/),e(\"number\",\"number\");if(\"variable\"==b.last){if(\"@\"==c)return a.eatWhile(f.validIdentifier),e(\"property\",\"property\");if(\"|\"==c)return a.eatWhile(f.validIdentifier),e(\"qualifier\",\"modifier\")}else{if(\"pipe\"==\nb.last)return a.eatWhile(f.validIdentifier),e(\"qualifier\",\"modifier\");if(\"whitespace\"==b.last)return a.eatWhile(f.validIdentifier),e(\"attribute\",\"modifier\")}if(\"property\"==b.last)return a.eatWhile(f.validIdentifier),e(\"property\",null);if(/\\s/.test(c))return m=\"whitespace\",null;b=\"\";\"/\"!=c&&(b+=c);for(var d;d=a.eat(f.validIdentifier);)b+=d;a=0;for(d=r.length;a<d;a++)if(r[a]==b)return e(\"keyword\",\"keyword\");return/\\s/.test(c)?null:e(\"tag\",\"tag\")}function v(a){return function(b,c){for(var d=null,e;!b.eol();){e=\nb.peek();if(b.next()==a&&\"\\\\\"!==d){c.tokenize=q;break}d=e}return\"string\"}}function u(a,b){return function(c,d){for(;!c.eol();){if(c.match(b)){d.tokenize=h;break}c.next()}return a}}var n=l.rightDelimiter||\"}\",g=l.leftDelimiter||\"{\",p=l.version||2,k=d.getMode(t,l.baseMode||\"null\"),r=[\"debug\",\"extends\",\"function\",\"include\",\"literal\"],f={operatorChars:/[+\\-*&%=<>!?]/,validIdentifier:/[a-zA-Z0-9_]/,stringChar:/['\"]/},m;return{startState:function(){return{base:d.startState(k),tokenize:h,last:null,depth:0}},\ncopyState:function(a){return{base:d.copyState(k,a.base),tokenize:a.tokenize,last:a.last,depth:a.depth}},innerMode:function(a){if(a.tokenize==h)return{mode:k,state:a.base}},token:function(a,b){a=b.tokenize(a,b);b.last=m;return a},indent:function(a,b){return a.tokenize==h&&k.indent?k.indent(a.base,b):d.Pass},blockCommentStart:g+\"*\",blockCommentEnd:\"*\"+n}});d.defineMIME(\"text/x-smarty\",\"smarty\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/solr/solr.js",
    "content": "'use strict';(function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],e):e(CodeMirror)})(function(e){e.defineMode(\"solr\",function(){function e(b){return function(a,c){for(var d=!1,e;null!=(e=a.next())&&(e!=b||d);)d=!d&&\"\\\\\"==e;d||(c.tokenize=f);return\"string\"}}function h(b){return function(a,c){var d=\"operator\";\"+\"==b?d+=\" positive\":\"-\"==b?d+=\" negative\":\"|\"==b?a.eat(/\\|/):\"&\"==b?a.eat(/\\&/):\n\"^\"==b&&(d+=\" boost\");c.tokenize=f;return d}}function k(b){return function(a,c){for(var d=b;(b=a.peek())&&null!=b.match(g);)d+=a.next();c.tokenize=f;if(l.test(d))return\"operator\";c=d;return parseFloat(c,10).toString()===c?\"number\":\":\"==a.peek()?\"field\":\"string\"}}function f(b,a){var c=b.next();'\"'==c?a.tokenize=e(c):m.test(c)?a.tokenize=h(c):g.test(c)&&(a.tokenize=k(c));return a.tokenize!=f?a.tokenize(b,a):null}var g=/[^\\s\\|\\!\\+\\-\\*\\?\\~\\^\\&\\:\\(\\)\\[\\]\\{\\}\\^\\\"\\\\]/,m=/[\\|\\!\\+\\-\\*\\?\\~\\^\\&]/,l=/^(OR|AND|NOT|TO)$/i;\nreturn{startState:function(){return{tokenize:f}},token:function(b,a){return b.eatSpace()?null:a.tokenize(b,a)}}});e.defineMIME(\"text/x-solr\",\"solr\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/soy/soy.js",
    "content": "'use strict';(function(d){\"object\"==typeof exports&&\"object\"==typeof module?d(require(\"../../lib/codemirror\"),require(\"../htmlmixed/htmlmixed\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\",\"../htmlmixed/htmlmixed\"],d):d(CodeMirror)})(function(d){var k=\"template literal msg fallbackmsg let if elseif else switch case default foreach ifempty for call param deltemplate delcall log\".split(\" \");d.defineMode(\"soy\",function(e){function g(a){return a[a.length-1]}function l(a,b,c){var d=\na.string;if(c=c.exec(d.substr(a.pos)))a.string=d.substr(0,a.pos+c.index);c=a.hideFirstChars(b.indent,function(){return b.localMode.token(a,b.localState)});a.string=d;return c}var h=d.getMode(e,\"text/plain\"),f={html:d.getMode(e,{name:\"text/html\",multilineTagIndentFactor:2,multilineTagIndentPastTag:!1}),attributes:h,text:h,uri:h,css:d.getMode(e,\"text/css\"),js:d.getMode(e,{name:\"text/javascript\",statementIndent:2*e.indentUnit})};return{startState:function(){return{kind:[],kindTag:[],soyState:[],indent:0,\nlocalMode:f.html,localState:d.startState(f.html)}},copyState:function(a){return{tag:a.tag,kind:a.kind.concat([]),kindTag:a.kindTag.concat([]),soyState:a.soyState.concat([]),indent:a.indent,localMode:a.localMode,localState:d.copyState(a.localMode,a.localState)}},token:function(a,b){var c;switch(g(b.soyState)){case \"comment\":return a.match(/^.*?\\*\\//)?b.soyState.pop():a.skipToEnd(),\"comment\";case \"variable\":if(a.match(/^}/))return b.indent-=2*e.indentUnit,b.soyState.pop(),\"variable-2\";a.next();return null;\ncase \"tag\":if(a.match(/^\\/?}/))return b.indent=\"/template\"==b.tag||\"/deltemplate\"==b.tag?0:b.indent-(\"/}\"==a.current()||-1==k.indexOf(b.tag)?2:1)*e.indentUnit,b.soyState.pop(),\"keyword\";if(a.match(/^([\\w?]+)(?==)/))return\"kind\"==a.current()&&(c=a.match(/^=\"([^\"]+)/,!1))&&(a=c[1],b.kind.push(a),b.kindTag.push(b.tag),b.localMode=f[a]||f.html,b.localState=d.startState(b.localMode)),\"attribute\";if(a.match(/^\"/))return b.soyState.push(\"string\"),\"string\";a.next();return null;case \"literal\":return a.match(/^(?=\\{\\/literal})/)?\n(b.indent-=e.indentUnit,b.soyState.pop(),this.token(a,b)):l(a,b,/\\{\\/literal}/);case \"string\":return(c=a.match(/^.*?(\"|\\\\[\\s\\S])/))?'\"'==c[1]&&b.soyState.pop():a.skipToEnd(),\"string\"}return a.match(/^\\/\\*/)?(b.soyState.push(\"comment\"),\"comment\"):a.match(a.sol()?/^\\s*\\/\\/.*/:/^\\s+\\/\\/.*/)?\"comment\":a.match(/^\\{\\$[\\w?]*/)?(b.indent+=2*e.indentUnit,b.soyState.push(\"variable\"),\"variable-2\"):a.match(/^\\{literal}/)?(b.indent+=e.indentUnit,b.soyState.push(\"literal\"),\"keyword\"):(c=a.match(/^\\{([\\/@\\\\]?[\\w?]*)/))?\n(\"/switch\"!=c[1]&&(b.indent+=(/^(\\/|(else|elseif|case|default)$)/.test(c[1])&&\"switch\"!=b.tag?1:2)*e.indentUnit),b.tag=c[1],b.tag==\"/\"+g(b.kindTag)&&(b.kind.pop(),b.kindTag.pop(),b.localMode=f[g(b.kind)]||f.html,b.localState=d.startState(b.localMode)),b.soyState.push(\"tag\"),\"keyword\"):l(a,b,/\\{|\\s+\\/\\/|\\/\\*/)},indent:function(a,b){var c=a.indent,f=g(a.soyState);if(\"comment\"==f)return d.Pass;if(\"literal\"==f)/^\\{\\/literal}/.test(b)&&(c-=e.indentUnit);else{if(/^\\s*\\{\\/(template|deltemplate)\\b/.test(b))return 0;\n/^\\{(\\/|(fallbackmsg|elseif|else|ifempty)\\b)/.test(b)&&(c-=e.indentUnit);\"switch\"!=a.tag&&/^\\{(case|default)\\b/.test(b)&&(c-=e.indentUnit);/^\\{\\/switch\\b/.test(b)&&(c-=e.indentUnit)}c&&a.localMode.indent&&(c+=a.localMode.indent(a.localState,b));return c},innerMode:function(a){return a.soyState.length&&\"literal\"!=g(a.soyState)?null:{state:a.localState,mode:a.localMode}},electricInput:/^\\s*\\{(\\/|\\/template|\\/deltemplate|\\/switch|fallbackmsg|elseif|else|case|default|ifempty|\\/literal\\})$/,lineComment:\"//\",\nblockCommentStart:\"/*\",blockCommentEnd:\"*/\",blockCommentContinue:\" * \",fold:\"indent\"}},\"htmlmixed\");d.registerHelper(\"hintWords\",\"soy\",k.concat(\"delpackage namespace alias print css debugger\".split(\" \")));d.defineMIME(\"text/x-soy\",\"soy\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/sparql/sparql.js",
    "content": "'use strict';(function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],e):e(CodeMirror)})(function(e){e.defineMode(\"sparql\",function(e){function h(a,b){var c=a.next();d=null;if(\"$\"==c||\"?\"==c){if(\"?\"==c&&a.match(/\\s/,!1))return\"operator\";a.match(/^[\\w\\d]*/);return\"variable-2\"}if(\"<\"!=c||a.match(/^[\\s\\u00a0=]/,!1)){if('\"'==c||\"'\"==c)return b.tokenize=l(c),b.tokenize(a,b);if(/[{}\\(\\),\\.;\\[\\]]/.test(c))return d=\nc,\"bracket\";if(\"#\"==c)return a.skipToEnd(),\"comment\";if(k.test(c))return a.eatWhile(k),\"operator\";if(\":\"==c)return a.eatWhile(/[\\w\\d\\._\\-]/),\"atom\";if(\"@\"==c)return a.eatWhile(/[a-z\\d\\-]/i),\"meta\";a.eatWhile(/[_\\w\\d]/);if(a.eat(\":\"))return a.eatWhile(/[\\w\\d_\\-]/),\"atom\";a=a.current();return m.test(a)?\"builtin\":n.test(a)?\"keyword\":\"variable\"}a.match(/^[^\\s\\u00a0>]*>?/);return\"atom\"}function l(a){return function(b,c){for(var d=!1,e;null!=(e=b.next());){if(e==a&&!d){c.tokenize=h;break}d=!d&&\"\\\\\"==e}return\"string\"}}\nfunction f(a,b,c){a.context={prev:a.context,indent:a.indent,col:c,type:b}}function g(a){a.indent=a.context.indent;a.context=a.context.prev}var p=e.indentUnit,d,m=/^(?:str|lang|langmatches|datatype|bound|sameterm|isiri|isuri|iri|uri|bnode|count|sum|min|max|avg|sample|group_concat|rand|abs|ceil|floor|round|concat|substr|strlen|replace|ucase|lcase|encode_for_uri|contains|strstarts|strends|strbefore|strafter|year|month|day|hours|minutes|seconds|timezone|tz|now|uuid|struuid|md5|sha1|sha256|sha384|sha512|coalesce|if|strlang|strdt|isnumeric|regex|exists|isblank|isliteral|a|bind)$/i,\nn=/^(?:base|prefix|select|distinct|reduced|construct|describe|ask|from|named|where|order|limit|offset|filter|optional|graph|by|asc|desc|as|having|undef|values|group|minus|in|not|service|silent|using|insert|delete|union|true|false|with|data|copy|to|move|add|create|drop|clear|load)$/i,k=/[*+\\-<>=&|\\^\\/!\\?]/;return{startState:function(){return{tokenize:h,context:null,indent:0,col:0}},token:function(a,b){a.sol()&&(b.context&&null==b.context.align&&(b.context.align=!1),b.indent=a.indentation());if(a.eatSpace())return null;\nvar c=b.tokenize(a,b);\"comment\"!=c&&b.context&&null==b.context.align&&\"pattern\"!=b.context.type&&(b.context.align=!0);if(\"(\"==d)f(b,\")\",a.column());else if(\"[\"==d)f(b,\"]\",a.column());else if(\"{\"==d)f(b,\"}\",a.column());else if(/[\\]\\}\\)]/.test(d)){for(;b.context&&\"pattern\"==b.context.type;)g(b);b.context&&d==b.context.type&&(g(b),\"}\"==d&&b.context&&\"pattern\"==b.context.type&&g(b))}else\".\"==d&&b.context&&\"pattern\"==b.context.type?g(b):/atom|string|variable/.test(c)&&b.context&&(/[\\}\\]]/.test(b.context.type)?\nf(b,\"pattern\",a.column()):\"pattern\"!=b.context.type||b.context.align||(b.context.align=!0,b.context.col=a.column()));return c},indent:function(a,b){b=b&&b.charAt(0);a=a.context;if(/[\\]\\}]/.test(b))for(;a&&\"pattern\"==a.type;)a=a.prev;b=a&&b==a.type;return a?\"pattern\"==a.type?a.col:a.align?a.col+(b?0:1):a.indent+(b?0:p):0},lineComment:\"#\"}});e.defineMIME(\"application/sparql-query\",\"sparql\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/spreadsheet/spreadsheet.js",
    "content": "'use strict';(function(c){\"object\"==typeof exports&&\"object\"==typeof module?c(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],c):c(CodeMirror)})(function(c){c.defineMode(\"spreadsheet\",function(){return{startState:function(){return{stringType:null,stack:[]}},token:function(a,b){if(a){0!==b.stack.length||'\"'!=a.peek()&&\"'\"!=a.peek()||(b.stringType=a.peek(),a.next(),b.stack.unshift(\"string\"));switch(b.stack[0]){case \"string\":for(;\"string\"===b.stack[0]&&\n!a.eol();)a.peek()===b.stringType?(a.next(),b.stack.shift()):\"\\\\\"===a.peek()?(a.next(),a.next()):a.match(/^.[^\\\\\\\"\\']*/);return\"string\";case \"characterClass\":for(;\"characterClass\"===b.stack[0]&&!a.eol();)a.match(/^[^\\]\\\\]+/)||a.match(/^\\\\./)||b.stack.shift();return\"operator\"}var c=a.peek();switch(c){case \"[\":return a.next(),b.stack.unshift(\"characterClass\"),\"bracket\";case \":\":return a.next(),\"operator\";case \"\\\\\":if(a.match(/\\\\[a-z]+/))return\"string-2\";a.next();return\"atom\";case \".\":case \",\":case \";\":case \"*\":case \"-\":case \"+\":case \"^\":case \"<\":case \"/\":case \"=\":return a.next(),\n\"atom\";case \"$\":return a.next(),\"builtin\"}if(a.match(/\\d+/))return a.match(/^\\w+/)?\"error\":\"number\";if(a.match(/^[a-zA-Z_]\\w*/))return a.match(/(?=[\\(.])/,!1)?\"keyword\":\"variable-2\";if(-1!=\"[](){}\".split(\"\").indexOf(c))return a.next(),\"bracket\";a.eatSpace()||a.next();return null}}}});c.defineMIME(\"text/x-spreadsheet\",\"spreadsheet\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/sql/sql.js",
    "content": "'use strict';(function(d){\"object\"==typeof exports&&\"object\"==typeof module?d(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],d):d(CodeMirror)})(function(d){d.defineMode(\"sql\",function(l,h){function k(b,f){var c=b.next();if(m[c]){var d=m[c](b,f);if(!1!==d)return d}if(1==g.hexNumber&&(\"0\"==c&&b.match(/^[xX][0-9a-fA-F]+/)||(\"x\"==c||\"X\"==c)&&b.match(/^'[0-9a-fA-F]+'/))||1==g.binaryNumber&&((\"b\"==c||\"B\"==c)&&b.match(/^'[01]+'/)||\"0\"==c&&b.match(/^b[01]+/)))return\"number\";\nif(47<c.charCodeAt(0)&&58>c.charCodeAt(0))return b.match(/^[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?/),1==g.decimallessFloat&&b.eat(\".\"),\"number\";if(\"?\"==c&&(b.eatSpace()||b.eol()||b.eat(\";\")))return\"variable-3\";if(\"'\"==c||'\"'==c&&g.doubleQuote)return f.tokenize=a(c),f.tokenize(b,f);if(!(1==g.nCharCast&&(\"n\"==c||\"N\"==c)||1==g.charsetCast&&\"_\"==c&&b.match(/[a-z][a-z0-9]*/i))||\"'\"!=b.peek()&&'\"'!=b.peek()){if(/^[\\(\\),\\;\\[\\]]/.test(c))return null;if(g.commentSlashSlash&&\"/\"==c&&b.eat(\"/\")||g.commentHash&&\"#\"==\nc||\"-\"==c&&b.eat(\"-\")&&(!g.commentSpaceRequired||b.eat(\" \")))return b.skipToEnd(),\"comment\";if(\"/\"==c&&b.eat(\"*\"))return f.tokenize=e,f.tokenize(b,f);if(\".\"==c){if(1==g.zerolessFloat&&b.match(/^(?:\\d+(?:e[+-]?\\d+)?)/i))return\"number\";if(1==g.ODBCdotTable&&b.match(/^[a-zA-Z_]+/))return\"variable-2\"}else{if(n.test(c))return b.eatWhile(n),null;if(\"{\"==c&&(b.match(/^( )*(d|D|t|T|ts|TS)( )*'[^']*'( )*}/)||b.match(/^( )*(d|D|t|T|ts|TS)( )*\"[^\"]*\"( )*}/)))return\"number\";b.eatWhile(/^[_\\w\\d]/);f=b.current().toLowerCase();\nreturn q.hasOwnProperty(f)&&(b.match(/^( )+'[^']*'/)||b.match(/^( )+\"[^\"]*\"/))?\"number\":r.hasOwnProperty(f)?\"atom\":t.hasOwnProperty(f)?\"builtin\":u.hasOwnProperty(f)?\"keyword\":v.hasOwnProperty(f)?\"string-2\":null}}else return\"keyword\"}function a(b){return function(a,c){for(var f=!1,e;null!=(e=a.next());){if(e==b&&!f){c.tokenize=k;break}f=!f&&\"\\\\\"==e}return\"string\"}}function e(b,a){for(;;)if(b.skipTo(\"*\")){if(b.next(),b.eat(\"/\")){a.tokenize=k;break}}else{b.skipToEnd();break}return\"comment\"}function p(b,\na,c){a.context={prev:a.context,indent:b.indentation(),col:b.column(),type:c}}var v=h.client||{},r=h.atoms||{\"false\":!0,\"true\":!0,\"null\":!0},t=h.builtin||{},u=h.keywords||{},n=h.operatorChars||/^[*+\\-%<>!=&|~^]/,g=h.support||{},m=h.hooks||{},q=h.dateSQL||{date:!0,time:!0,timestamp:!0};return{startState:function(){return{tokenize:k,context:null}},token:function(b,a){b.sol()&&a.context&&null==a.context.align&&(a.context.align=!1);if(b.eatSpace())return null;var c=a.tokenize(b,a);if(\"comment\"==c)return c;\na.context&&null==a.context.align&&(a.context.align=!0);var e=b.current();\"(\"==e?p(b,a,\")\"):\"[\"==e?p(b,a,\"]\"):a.context&&a.context.type==e&&(a.indent=a.context.indent,a.context=a.context.prev);return c},indent:function(a,e){a=a.context;if(!a)return d.Pass;e=e.charAt(0)==a.type;return a.align?a.col+(e?0:1):a.indent+(e?0:l.indentUnit)},blockCommentStart:\"/*\",blockCommentEnd:\"*/\",lineComment:g.commentSlashSlash?\"//\":g.commentHash?\"#\":null}});(function(){function l(a){for(var e;null!=(e=a.next());)if(\"`\"==\ne&&!a.eat(\"`\"))return\"variable-2\";a.backUp(a.current().length-1);return a.eatWhile(/\\w/)?\"variable-2\":null}function h(a){a.eat(\"@\")&&(a.match(/^session\\./),a.match(/^local\\./),a.match(/^global\\./));return a.eat(\"'\")?(a.match(/^.*'/),\"variable-2\"):a.eat('\"')?(a.match(/^.*\"/),\"variable-2\"):a.eat(\"`\")?(a.match(/^.*`/),\"variable-2\"):a.match(/^[0-9a-zA-Z$\\.\\_]+/)?\"variable-2\":null}function k(a){return a.eat(\"N\")?\"atom\":a.match(/^[a-zA-Z.#!?]/)?\"variable-2\":null}function a(a){var d={};a=a.split(\" \");for(var e=\n0;e<a.length;++e)d[a[e]]=!0;return d}d.defineMIME(\"text/x-sql\",{name:\"sql\",keywords:a(\"alter and as asc between by count create delete desc distinct drop from group having in insert into is join like not on or order select set table union update values where limit begin\"),builtin:a(\"bool boolean bit blob enum long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision real date datetime year unsigned signed decimal numeric\"),\natoms:a(\"false true null unknown\"),operatorChars:/^[*+\\-%<>!=]/,dateSQL:a(\"date time timestamp\"),support:a(\"ODBCdotTable doubleQuote binaryNumber hexNumber\")});d.defineMIME(\"text/x-mssql\",{name:\"sql\",client:a(\"charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee\"),keywords:a(\"alter and as asc between by count create delete desc distinct drop from group having in insert into is join like not on or order select set table union update values where limit begin trigger proc view index for add constraint key primary foreign collate clustered nonclustered declare\"),\nbuiltin:a(\"bigint numeric bit smallint decimal smallmoney int tinyint money float real char varchar text nchar nvarchar ntext binary varbinary image cursor timestamp hierarchyid uniqueidentifier sql_variant xml table \"),atoms:a(\"false true null unknown\"),operatorChars:/^[*+\\-%<>!=]/,dateSQL:a(\"date datetimeoffset datetime2 smalldatetime datetime time\"),hooks:{\"@\":h}});d.defineMIME(\"text/x-mysql\",{name:\"sql\",client:a(\"charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee\"),\nkeywords:a(\"alter and as asc between by count create delete desc distinct drop from group having in insert into is join like not on or order select set table union update values where limit accessible action add after algorithm all analyze asensitive at authors auto_increment autocommit avg avg_row_length before binary binlog both btree cache call cascade cascaded case catalog_name chain change changed character check checkpoint checksum class_origin client_statistics close coalesce code collate collation collations column columns comment commit committed completion concurrent condition connection consistent constraint contains continue contributors convert cross current current_date current_time current_timestamp current_user cursor data database databases day_hour day_microsecond day_minute day_second deallocate dec declare default delay_key_write delayed delimiter des_key_file describe deterministic dev_pop dev_samp deviance diagnostics directory disable discard distinctrow div dual dumpfile each elseif enable enclosed end ends engine engines enum errors escape escaped even event events every execute exists exit explain extended fast fetch field fields first flush for force foreign found_rows full fulltext function general get global grant grants group group_concat handler hash help high_priority hosts hour_microsecond hour_minute hour_second if ignore ignore_server_ids import index index_statistics infile inner innodb inout insensitive insert_method install interval invoker isolation iterate key keys kill language last leading leave left level limit linear lines list load local localtime localtimestamp lock logs low_priority master master_heartbeat_period master_ssl_verify_server_cert masters match max max_rows maxvalue message_text middleint migrate min min_rows minute_microsecond minute_second mod mode modifies modify mutex mysql_errno natural next no no_write_to_binlog offline offset one online open optimize option optionally out outer outfile pack_keys parser partition partitions password phase plugin plugins prepare preserve prev primary privileges procedure processlist profile profiles purge query quick range read read_write reads real rebuild recover references regexp relaylog release remove rename reorganize repair repeatable replace require resignal restrict resume return returns revoke right rlike rollback rollup row row_format rtree savepoint schedule schema schema_name schemas second_microsecond security sensitive separator serializable server session share show signal slave slow smallint snapshot soname spatial specific sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result sqlexception sqlstate sqlwarning ssl start starting starts status std stddev stddev_pop stddev_samp storage straight_join subclass_origin sum suspend table_name table_statistics tables tablespace temporary terminated to trailing transaction trigger triggers truncate uncommitted undo uninstall unique unlock upgrade usage use use_frm user user_resources user_statistics using utc_date utc_time utc_timestamp value variables varying view views warnings when while with work write xa xor year_month zerofill begin do then else loop repeat\"),\nbuiltin:a(\"bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision date datetime year unsigned signed numeric\"),atoms:a(\"false true null unknown\"),operatorChars:/^[*+\\-%<>!=&|^]/,dateSQL:a(\"date time timestamp\"),support:a(\"ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber doubleQuote nCharCast charsetCast commentHash commentSpaceRequired\"),\nhooks:{\"@\":h,\"`\":l,\"\\\\\":k}});d.defineMIME(\"text/x-mariadb\",{name:\"sql\",client:a(\"charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee\"),keywords:a(\"alter and as asc between by count create delete desc distinct drop from group having in insert into is join like not on or order select set table union update values where limit accessible action add after algorithm all always analyze asensitive at authors auto_increment autocommit avg avg_row_length before binary binlog both btree cache call cascade cascaded case catalog_name chain change changed character check checkpoint checksum class_origin client_statistics close coalesce code collate collation collations column columns comment commit committed completion concurrent condition connection consistent constraint contains continue contributors convert cross current current_date current_time current_timestamp current_user cursor data database databases day_hour day_microsecond day_minute day_second deallocate dec declare default delay_key_write delayed delimiter des_key_file describe deterministic dev_pop dev_samp deviance diagnostics directory disable discard distinctrow div dual dumpfile each elseif enable enclosed end ends engine engines enum errors escape escaped even event events every execute exists exit explain extended fast fetch field fields first flush for force foreign found_rows full fulltext function general generated get global grant grants group groupby_concat handler hard hash help high_priority hosts hour_microsecond hour_minute hour_second if ignore ignore_server_ids import index index_statistics infile inner innodb inout insensitive insert_method install interval invoker isolation iterate key keys kill language last leading leave left level limit linear lines list load local localtime localtimestamp lock logs low_priority master master_heartbeat_period master_ssl_verify_server_cert masters match max max_rows maxvalue message_text middleint migrate min min_rows minute_microsecond minute_second mod mode modifies modify mutex mysql_errno natural next no no_write_to_binlog offline offset one online open optimize option optionally out outer outfile pack_keys parser partition partitions password persistent phase plugin plugins prepare preserve prev primary privileges procedure processlist profile profiles purge query quick range read read_write reads real rebuild recover references regexp relaylog release remove rename reorganize repair repeatable replace require resignal restrict resume return returns revoke right rlike rollback rollup row row_format rtree savepoint schedule schema schema_name schemas second_microsecond security sensitive separator serializable server session share show shutdown signal slave slow smallint snapshot soft soname spatial specific sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result sqlexception sqlstate sqlwarning ssl start starting starts status std stddev stddev_pop stddev_samp storage straight_join subclass_origin sum suspend table_name table_statistics tables tablespace temporary terminated to trailing transaction trigger triggers truncate uncommitted undo uninstall unique unlock upgrade usage use use_frm user user_resources user_statistics using utc_date utc_time utc_timestamp value variables varying view views virtual warnings when while with work write xa xor year_month zerofill begin do then else loop repeat\"),\nbuiltin:a(\"bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision date datetime year unsigned signed numeric\"),atoms:a(\"false true null unknown\"),operatorChars:/^[*+\\-%<>!=&|^]/,dateSQL:a(\"date time timestamp\"),support:a(\"ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber doubleQuote nCharCast charsetCast commentHash commentSpaceRequired\"),\nhooks:{\"@\":h,\"`\":l,\"\\\\\":k}});d.defineMIME(\"text/x-cassandra\",{name:\"sql\",client:{},keywords:a(\"add all allow alter and any apply as asc authorize batch begin by clustering columnfamily compact consistency count create custom delete desc distinct drop each_quorum exists filtering from grant if in index insert into key keyspace keyspaces level limit local_one local_quorum modify nan norecursive nosuperuser not of on one order password permission permissions primary quorum rename revoke schema select set storage superuser table three to token truncate ttl two type unlogged update use user users using values where with writetime\"),\nbuiltin:a(\"ascii bigint blob boolean counter decimal double float frozen inet int list map static text timestamp timeuuid tuple uuid varchar varint\"),atoms:a(\"false true infinity NaN\"),operatorChars:/^[<>=]/,dateSQL:{},support:a(\"commentSlashSlash decimallessFloat\"),hooks:{}});d.defineMIME(\"text/x-plsql\",{name:\"sql\",client:a(\"appinfo arraysize autocommit autoprint autorecovery autotrace blockterminator break btitle cmdsep colsep compatibility compute concat copycommit copytypecheck define describe echo editfile embedded escape exec execute feedback flagger flush heading headsep instance linesize lno loboffset logsource long longchunksize markup native newpage numformat numwidth pagesize pause pno recsep recsepchar release repfooter repheader serveroutput shiftinout show showmode size spool sqlblanklines sqlcase sqlcode sqlcontinue sqlnumber sqlpluscompatibility sqlprefix sqlprompt sqlterminator suffix tab term termout time timing trimout trimspool ttitle underline verify version wrap\"),\nkeywords:a(\"abort accept access add all alter and any array arraylen as asc assert assign at attributes audit authorization avg base_table begin between binary_integer body boolean by case cast char char_base check close cluster clusters colauth column comment commit compress connect connected constant constraint crash create current currval cursor data_base database date dba deallocate debugoff debugon decimal declare default definition delay delete desc digits dispose distinct do drop else elseif elsif enable end entry escape exception exception_init exchange exclusive exists exit external fast fetch file for force form from function generic goto grant group having identified if immediate in increment index indexes indicator initial initrans insert interface intersect into is key level library like limited local lock log logging long loop master maxextents maxtrans member minextents minus mislabel mode modify multiset new next no noaudit nocompress nologging noparallel not nowait number_base object of off offline on online only open option or order out package parallel partition pctfree pctincrease pctused pls_integer positive positiven pragma primary prior private privileges procedure public raise range raw read rebuild record ref references refresh release rename replace resource restrict return returning returns reverse revoke rollback row rowid rowlabel rownum rows run savepoint schema segment select separate session set share snapshot some space split sql start statement storage subtype successful synonym tabauth table tables tablespace task terminate then to trigger truncate type union unique unlimited unrecoverable unusable update use using validate value values variable view views when whenever where while with work\"),\nbuiltin:a(\"abs acos add_months ascii asin atan atan2 average bfile bfilename bigserial bit blob ceil character chartorowid chr clob concat convert cos cosh count dec decode deref dual dump dup_val_on_index empty error exp false float floor found glb greatest hextoraw initcap instr instrb int integer isopen last_day least length lengthb ln lower lpad ltrim lub make_ref max min mlslabel mod months_between natural naturaln nchar nclob new_time next_day nextval nls_charset_decl_len nls_charset_id nls_charset_name nls_initcap nls_lower nls_sort nls_upper nlssort no_data_found notfound null number numeric nvarchar2 nvl others power rawtohex real reftohex round rowcount rowidtochar rowtype rpad rtrim serial sign signtype sin sinh smallint soundex sqlcode sqlerrm sqrt stddev string substr substrb sum sysdate tan tanh to_char text to_date to_label to_multi_byte to_number to_single_byte translate true trunc uid unlogged upper user userenv varchar varchar2 variance varying vsize xml\"),\noperatorChars:/^[*+\\-%<>!=~]/,dateSQL:a(\"date time timestamp\"),support:a(\"doubleQuote nCharCast zerolessFloat binaryNumber hexNumber\")});d.defineMIME(\"text/x-hive\",{name:\"sql\",keywords:a(\"select alter $elem$ $key$ $value$ add after all analyze and archive as asc before between binary both bucket buckets by cascade case cast change cluster clustered clusterstatus collection column columns comment compute concatenate continue create cross cursor data database databases dbproperties deferred delete delimited desc describe directory disable distinct distribute drop else enable end escaped exclusive exists explain export extended external false fetch fields fileformat first format formatted from full function functions grant group having hold_ddltime idxproperties if import in index indexes inpath inputdriver inputformat insert intersect into is items join keys lateral left like limit lines load local location lock locks mapjoin materialized minus msck no_drop nocompress not of offline on option or order out outer outputdriver outputformat overwrite partition partitioned partitions percent plus preserve procedure purge range rcfile read readonly reads rebuild recordreader recordwriter recover reduce regexp rename repair replace restrict revoke right rlike row schema schemas semi sequencefile serde serdeproperties set shared show show_database sort sorted ssl statistics stored streamtable table tables tablesample tblproperties temporary terminated textfile then tmp to touch transform trigger true unarchive undo union uniquejoin unlock update use using utc utc_tmestamp view when where while with\"),\nbuiltin:a(\"bool boolean long timestamp tinyint smallint bigint int float double date datetime unsigned string array struct map uniontype\"),atoms:a(\"false true null unknown\"),operatorChars:/^[*+\\-%<>!=]/,dateSQL:a(\"date timestamp\"),support:a(\"ODBCdotTable doubleQuote binaryNumber hexNumber\")});d.defineMIME(\"text/x-pgsql\",{name:\"sql\",client:a(\"source\"),keywords:a(\"alter and as asc between by count create delete desc distinct drop from group having in insert into is join like not on or order select set table union update values where limit a abort abs absent absolute access according action ada add admin after aggregate all allocate also always analyse analyze any are array array_agg array_max_cardinality asensitive assertion assignment asymmetric at atomic attribute attributes authorization avg backward base64 before begin begin_frame begin_partition bernoulli binary bit_length blob blocked bom both breadth c cache call called cardinality cascade cascaded case cast catalog catalog_name ceil ceiling chain characteristics characters character_length character_set_catalog character_set_name character_set_schema char_length check checkpoint class class_origin clob close cluster coalesce cobol collate collation collation_catalog collation_name collation_schema collect column columns column_name command_function command_function_code comment comments commit committed concurrently condition condition_number configuration conflict connect connection connection_name constraint constraints constraint_catalog constraint_name constraint_schema constructor contains content continue control conversion convert copy corr corresponding cost covar_pop covar_samp cross csv cube cume_dist current current_catalog current_date current_default_transform_group current_path current_role current_row current_schema current_time current_timestamp current_transform_group_for_type current_user cursor cursor_name cycle data database datalink datetime_interval_code datetime_interval_precision day db deallocate dec declare default defaults deferrable deferred defined definer degree delimiter delimiters dense_rank depth deref derived describe descriptor deterministic diagnostics dictionary disable discard disconnect dispatch dlnewcopy dlpreviouscopy dlurlcomplete dlurlcompleteonly dlurlcompletewrite dlurlpath dlurlpathonly dlurlpathwrite dlurlscheme dlurlserver dlvalue do document domain dynamic dynamic_function dynamic_function_code each element else empty enable encoding encrypted end end-exec end_frame end_partition enforced enum equals escape event every except exception exclude excluding exclusive exec execute exists exp explain expression extension external extract false family fetch file filter final first first_value flag float floor following for force foreign fortran forward found frame_row free freeze fs full function functions fusion g general generated get global go goto grant granted greatest grouping groups handler header hex hierarchy hold hour id identity if ignore ilike immediate immediately immutable implementation implicit import including increment indent index indexes indicator inherit inherits initially inline inner inout input insensitive instance instantiable instead integrity intersect intersection invoker isnull isolation k key key_member key_type label lag language large last last_value lateral lead leading leakproof least left length level library like_regex link listen ln load local localtime localtimestamp location locator lock locked logged lower m map mapping match matched materialized max maxvalue max_cardinality member merge message_length message_octet_length message_text method min minute minvalue mod mode modifies module month more move multiset mumps name names namespace national natural nchar nclob nesting new next nfc nfd nfkc nfkd nil no none normalize normalized nothing notify notnull nowait nth_value ntile null nullable nullif nulls number object occurrences_regex octets octet_length of off offset oids old only open operator option options ordering ordinality others out outer output over overlaps overlay overriding owned owner p pad parameter parameter_mode parameter_name parameter_ordinal_position parameter_specific_catalog parameter_specific_name parameter_specific_schema parser partial partition pascal passing passthrough password percent percentile_cont percentile_disc percent_rank period permission placing plans pli policy portion position position_regex power precedes preceding prepare prepared preserve primary prior privileges procedural procedure program public quote range rank read reads reassign recheck recovery recursive ref references referencing refresh regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy regr_syy reindex relative release rename repeatable replace replica requiring reset respect restart restore restrict result return returned_cardinality returned_length returned_octet_length returned_sqlstate returning returns revoke right role rollback rollup routine routine_catalog routine_name routine_schema row rows row_count row_number rule savepoint scale schema schema_name scope scope_catalog scope_name scope_schema scroll search second section security selective self sensitive sequence sequences serializable server server_name session session_user setof sets share show similar simple size skip snapshot some source space specific specifictype specific_name sql sqlcode sqlerror sqlexception sqlstate sqlwarning sqrt stable standalone start state statement static statistics stddev_pop stddev_samp stdin stdout storage strict strip structure style subclass_origin submultiset substring substring_regex succeeds sum symmetric sysid system system_time system_user t tables tablesample tablespace table_name temp template temporary then ties timezone_hour timezone_minute to token top_level_count trailing transaction transactions_committed transactions_rolled_back transaction_active transform transforms translate translate_regex translation treat trigger trigger_catalog trigger_name trigger_schema trim trim_array true truncate trusted type types uescape unbounded uncommitted under unencrypted unique unknown unlink unlisten unlogged unnamed unnest until untyped upper uri usage user user_defined_type_catalog user_defined_type_code user_defined_type_name user_defined_type_schema using vacuum valid validate validator value value_of varbinary variadic var_pop var_samp verbose version versioning view views volatile when whenever whitespace width_bucket window within work wrapper write xmlagg xmlattributes xmlbinary xmlcast xmlcomment xmlconcat xmldeclaration xmldocument xmlelement xmlexists xmlforest xmliterate xmlnamespaces xmlparse xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltext xmlvalidate year yes loop repeat\"),\nbuiltin:a(\"bigint int8 bigserial serial8 bit varying varbit boolean bool box bytea character char varchar cidr circle date double precision float8 inet integer int int4 interval json jsonb line lseg macaddr money numeric decimal path pg_lsn point polygon real float4 smallint int2 smallserial serial2 serial serial4 text time without zone with timetz timestamp timestamptz tsquery tsvector txid_snapshot uuid xml\"),atoms:a(\"false true null unknown\"),operatorChars:/^[*+\\-%<>!=&|^\\/#@?~]/,dateSQL:a(\"date time timestamp\"),\nsupport:a(\"ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber nCharCast charsetCast\")});d.defineMIME(\"text/x-gql\",{name:\"sql\",keywords:a(\"ancestor and asc by contains desc descendant distinct from group has in is limit offset on order select superset where\"),atoms:a(\"false true\"),builtin:a(\"blob datetime first key __key__ string integer double boolean null\"),operatorChars:/^[*+\\-%<>!=]/})})()});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/stex/stex.js",
    "content": "'use strict';(function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],e):e(CodeMirror)})(function(e){e.defineMode(\"stex\",function(){function e(a){a=a.cmdState;for(var b=a.length-1;0<=b;b--){var c=a[b];if(\"DEFAULT\"!=c.name)return c}return{styleIdentifier:function(){return null}}}function h(a,b,c){return function(){this.name=a;this.bracketNo=0;this.style=b;this.styles=c;this.argument=null;\nthis.styleIdentifier=function(){return this.styles[this.bracketNo-1]||null};this.openBracket=function(){this.bracketNo++;return\"bracket\"};this.closeBracket=function(){}}}function k(a,b){a.f=b}function g(a,b){var c;if(a.match(/^\\\\[a-zA-Z@]+/))return a=a.current().slice(1),c=f[a]||f.DEFAULT,c=new c,b.cmdState.push(c),b.f=m,c.style;if(a.match(/^\\\\[$&%#{}_]/)||a.match(/^\\\\[,;!\\/\\\\]/))return\"tag\";if(a.match(\"\\\\[\"))return k(b,function(a,b){return l(a,b,\"\\\\]\")}),\"keyword\";if(a.match(\"$$\"))return k(b,function(a,\nb){return l(a,b,\"$$\")}),\"keyword\";if(a.match(\"$\"))return k(b,function(a,b){return l(a,b,\"$\")}),\"keyword\";var d=a.next();if(\"%\"==d)return a.skipToEnd(),\"comment\";if(\"}\"==d||\"]\"==d){if(c=0<b.cmdState.length?b.cmdState[b.cmdState.length-1]:null)c.closeBracket(d),b.f=m;else return\"error\";return\"bracket\"}if(\"{\"==d||\"[\"==d)return c=f.DEFAULT,c=new c,b.cmdState.push(c),\"bracket\";if(/\\d/.test(d))return a.eatWhile(/[\\w.%]/),\"atom\";a.eatWhile(/[\\w\\-_]/);c=e(b);\"begin\"==c.name&&(c.argument=a.current());return c.styleIdentifier()}\nfunction l(a,b,c){if(a.eatSpace())return null;if(a.match(c))return b.f=g,\"keyword\";if(a.match(/^\\\\[a-zA-Z@]+/))return\"tag\";if(a.match(/^[a-zA-Z]+/))return\"variable-2\";if(a.match(/^\\\\[$&%#{}_]/)||a.match(/^\\\\[,;!\\/]/)||a.match(/^[\\^_&]/))return\"tag\";if(a.match(/^[+\\-<>|=,\\/@!*:;'\"`~#?]/))return null;if(a.match(/^(\\d+\\.\\d*|\\d*\\.\\d+|\\d+)/))return\"number\";b=a.next();return\"{\"==b||\"}\"==b||\"[\"==b||\"]\"==b||\"(\"==b||\")\"==b?\"bracket\":\"%\"==b?(a.skipToEnd(),\"comment\"):\"error\"}function m(a,b){var c=a.peek(),d;\nif(\"{\"==c||\"[\"==c)return d=0<b.cmdState.length?b.cmdState[b.cmdState.length-1]:null,d.openBracket(c),a.eat(c),b.f=g,\"bracket\";if(/[ \\t\\r]/.test(c))return a.eat(c),null;b.f=g;(c=b.cmdState.pop())&&c.closeBracket();return g(a,b)}var f={};f.importmodule=h(\"importmodule\",\"tag\",[\"string\",\"builtin\"]);f.documentclass=h(\"documentclass\",\"tag\",[\"\",\"atom\"]);f.usepackage=h(\"usepackage\",\"tag\",[\"atom\"]);f.begin=h(\"begin\",\"tag\",[\"atom\"]);f.end=h(\"end\",\"tag\",[\"atom\"]);f.DEFAULT=function(){this.name=\"DEFAULT\";this.style=\n\"tag\";this.styleIdentifier=this.openBracket=this.closeBracket=function(){}};return{startState:function(){return{cmdState:[],f:g}},copyState:function(a){return{cmdState:a.cmdState.slice(),f:a.f}},token:function(a,b){return b.f(a,b)},blankLine:function(a){a.f=g;a.cmdState.length=0},lineComment:\"%\"}});e.defineMIME(\"text/x-stex\",\"stex\");e.defineMIME(\"text/x-latex\",\"stex\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/stylus/stylus.js",
    "content": "'use strict';(function(g){\"object\"==typeof exports&&\"object\"==typeof module?g(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],g):g(CodeMirror)})(function(g){function E(f){f=f.sort(function(f,p){return p>f});return new RegExp(\"^((\"+f.join(\")|(\")+\"))\\\\b\")}function f(f){for(var g={},p=0;p<f.length;++p)g[f[p]]=!0;return g}g.defineMode(\"stylus\",function(g){function D(a,b){y=a.string.match(/(^[\\w-]+\\s*=\\s*$)|(^\\s*[\\w-]+\\s*=\\s*[\\w-])|(^\\s*(\\.|#|@|\\$|\\&|\\[|\\d|\\+|::?|\\{|\\>|~|\\/)?\\s*[\\w-]*([a-z0-9-]|\\*|\\/\\*)(\\(|,)?)/);\nb.context.line.firstWord=y?y[0].replace(/^\\s*/,\"\"):\"\";b.context.line.indent=a.indentation();m=a.peek();if(a.match(\"//\"))return a.skipToEnd(),[\"comment\",\"comment\"];if(a.match(\"/*\"))return b.tokenize=p,p(a,b);if('\"'==m||\"'\"==m)return a.next(),b.tokenize=F(m),b.tokenize(a,b);if(\"@\"==m)return a.next(),a.eatWhile(/[\\w\\\\-]/),[\"def\",a.current()];if(\"#\"==m){a.next();if(a.match(/^[0-9a-f]{6}|[0-9a-f]{3}/i))return[\"atom\",\"atom\"];if(a.match(/^[a-z][\\w-]*/i))return[\"builtin\",\"hash\"]}if(a.match(z))return[\"meta\",\n\"vendor-prefixes\"];if(a.match(/^-?[0-9]?\\.?[0-9]/))return a.eatWhile(/[a-z%]/i),[\"number\",\"unit\"];if(\"!\"==m)return a.next(),[a.match(/^(important|optional)/i)?\"keyword\":\"operator\",\"important\"];if(\".\"==m&&a.match(/^\\.[a-z][\\w-]*/i))return[\"qualifier\",\"qualifier\"];if(a.match(U))return\"(\"==a.peek()&&(b.tokenize=V),[\"property\",\"word\"];if(a.match(/^[a-z][\\w-]*\\(/i))return a.backUp(1),[\"keyword\",\"mixin\"];if(a.match(/^(\\+|-)[a-z][\\w-]*\\(/i))return a.backUp(1),[\"keyword\",\"block-mixin\"];if(a.string.match(/^\\s*&/)&&\na.match(/^[-_]+[a-z][\\w-]*/))return[\"qualifier\",\"qualifier\"];if(a.match(/^(\\/|&)(-|_|:|\\.|#|[a-z])/))return a.backUp(1),[\"variable-3\",\"reference\"];if(a.match(/^&{1}\\s*$/))return[\"variable-3\",\"reference\"];if(a.match(W))return[\"operator\",\"operator\"];if(a.match(/^\\$?[-_]*[a-z0-9]+[\\w-]*/i))return a.match(/^(\\.|\\[)[\\w-\\'\\\"\\]]+/i,!1)&&!n(a.current())?(a.match(/\\./),[\"variable-2\",\"variable-name\"]):[\"variable-2\",\"word\"];if(a.match(X))return[\"operator\",a.current()];if(/[:;,{}\\[\\]\\(\\)]/.test(m))return a.next(),\n[null,m];a.next();return[null,null]}function p(a,b){for(var c=!1,d;null!=(d=a.next());){if(c&&\"/\"==d){b.tokenize=null;break}c=\"*\"==d}return[\"comment\",\"comment\"]}function F(a){return function(b,c){for(var d=!1,e;null!=(e=b.next());){if(e==a&&!d){\")\"==a&&b.backUp(1);break}d=!d&&\"\\\\\"==e}if(e==a||!d&&\")\"!=a)c.tokenize=null;return[\"string\",\"string\"]}}function V(a,b){a.next();a.match(/\\s*[\\\"\\')]/,!1)?b.tokenize=null:b.tokenize=F(\")\");return[null,\"(\"]}function G(a,b,c,d){this.type=a;this.indent=b;this.prev=\nc;this.line=d||{firstWord:\"\",indent:0}}function d(a,b,c,d){d=0<=d?d:q;a.context=new G(c,b.indentation()+d,a.context);return c}function r(a,b){var c=a.context.indent-q;a.context=a.context.prev;b&&(a.context.indent=c);return a.context.type}function A(a,b,c,d){for(d=d||1;0<d;d--)c.context=c.context.prev;return h[c.context.type](a,b,c)}function n(a){return a.toLowerCase()in Y}function t(a){a=a.toLowerCase();return a in Z||a in aa}function u(a){return a.toLowerCase()in ba}function v(a){var b=a.toLowerCase(),\nc=\"variable-2\";n(a)?c=\"tag\":u(a)?c=\"block-keyword\":t(a)?c=\"property\":b in ca||b in da?c=\"atom\":\"return\"==b||b in ea?c=\"keyword\":a.match(/^[A-Z]/)&&(c=\"string\");return c}function H(a,b){return k(b)&&(\"{\"==a||\"]\"==a||\"hash\"==a||\"qualifier\"==a)||\"block-mixin\"==a}function w(a){return a.sol()||a.string.match(new RegExp(\"^\\\\s*\"+a.current().replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g,\"\\\\$&\")))}function k(a){return a.eol()||a.match(/^\\s*$/,!1)}function l(a){var b=/^\\s*[-_]*[a-z0-9]+[\\w-]*/i;return(a=\"string\"==typeof a?\na.match(b):a.string.match(b))?a[0].replace(/^\\s*/,\"\"):\"\"}var q=g.indentUnit,Y=f(I),B=/^(a|b|i|s|col|em)$/i,Z=f(J),fa=f(K),ca=f(L),ea=f(M),ga=f(C),U=E(C),ha=f(N),ia=f(O),aa=f(P),X=/^\\s*([.]{2,3}|&&|\\|\\||\\*\\*|[?!=:]?=|[-+*\\/%<>]=?|\\?:|\\~)/,W=E(Q),ba=f(R),z=new RegExp(/^\\-(moz|ms|o|webkit)-/i),da=f(S),y=\"\",h={},m,x,T,e;h.block=function(a,b,c){if(\"comment\"==a&&w(b)||\",\"==a&&k(b)||\"mixin\"==a)return d(c,b,\"block\",0);if(\"{\"==a&&b.match(/^\\s*\\$?[\\w-]+/i,!1))return d(c,b,\"interpolation\");if(k(b)&&\"]\"==a&&\n!/^\\s*(\\.|#|:|\\[|\\*|&)/.test(b.string)&&!n(l(b)))return d(c,b,\"block\",0);if(H(a,b,c))return d(c,b,\"block\");if(\"}\"==a&&k(b))return d(c,b,\"block\",0);if(\"variable-name\"==a)return b.string.match(/^\\s?\\$[\\w-\\.\\[\\]\\'\\\"]+$/)||u(l(b))?d(c,b,\"variableName\"):d(c,b,\"variableName\",0);if(\"=\"==a)return k(b)||u(l(b))?d(c,b,\"block\"):d(c,b,\"block\",0);if(\"*\"==a&&(k(b)||b.match(/\\s*(,|\\.|#|\\[|:|{)/,!1)))return e=\"tag\",d(c,b,\"block\");if(\":\"==a&&b.match(/^[a-z-]+/,!1))return d(c,b,\"pseudo\");if(/@(font-face|media|supports|(-moz-)?document)/.test(a))return d(c,\nb,k(b)?\"block\":\"atBlock\");if(/@(-(moz|ms|o|webkit)-)?keyframes$/.test(a))return d(c,b,\"keyframes\");if(/@extends?/.test(a))return d(c,b,\"extend\",0);if(a&&\"@\"==a.charAt(0))return 0<b.indentation()&&t(b.current().slice(1))?(e=\"variable-2\",\"block\"):/(@import|@require|@charset)/.test(a)?d(c,b,\"block\",0):d(c,b,\"block\");if(\"reference\"==a&&k(b))return d(c,b,\"block\");if(\"(\"==a)return d(c,b,\"parens\");if(\"vendor-prefixes\"==a)return d(c,b,\"vendorPrefixes\");if(\"word\"==a){a=b.current();e=v(a);if(\"property\"==e){if(w(b))return d(c,\nb,\"block\",0);e=\"atom\";return\"block\"}if(\"tag\"==e){if(/embed|menu|pre|progress|sub|table/.test(a)&&t(l(b))||b.string.match(new RegExp(\"\\\\[\\\\s*\"+a+\"|\"+a+\"\\\\s*\\\\]\")))return e=\"atom\",\"block\";if(B.test(a)&&(w(b)&&b.string.match(/=/)||!w(b)&&!b.string.match(/^(\\s*\\.|#|\\&|\\[|\\/|>|\\*)/)&&!n(l(b))))return e=\"variable-2\",u(l(b))?\"block\":d(c,b,\"block\",0);if(k(b))return d(c,b,\"block\")}if(\"block-keyword\"==e)return e=\"keyword\",b.current(/(if|unless)/)&&!w(b)?\"block\":d(c,b,\"block\");if(\"return\"==a)return d(c,b,\"block\",\n0);if(\"variable-2\"==e&&b.string.match(/^\\s?\\$[\\w-\\.\\[\\]\\'\\\"]+$/))return d(c,b,\"block\")}return c.context.type};h.parens=function(a,b,c){if(\"(\"==a)return d(c,b,\"parens\");if(\")\"==a)return\"parens\"==c.context.prev.type?r(c):b.string.match(/^[a-z][\\w-]*\\(/i)&&k(b)||u(l(b))||/(\\.|#|:|\\[|\\*|&|>|~|\\+|\\/)/.test(l(b))||!b.string.match(/^-?[a-z][\\w-\\.\\[\\]\\'\\\"]*\\s*=/)&&n(l(b))?d(c,b,\"block\"):b.string.match(/^[\\$-]?[a-z][\\w-\\.\\[\\]\\'\\\"]*\\s*=/)||b.string.match(/^\\s*(\\(|\\)|[0-9])/)||b.string.match(/^\\s+[a-z][\\w-]*\\(/i)||\nb.string.match(/^\\s+[\\$-]?[a-z]/i)?d(c,b,\"block\",0):k(b)?d(c,b,\"block\"):d(c,b,\"block\",0);a&&\"@\"==a.charAt(0)&&t(b.current().slice(1))&&(e=\"variable-2\");if(\"word\"==a){var f=b.current();e=v(f);\"tag\"==e&&B.test(f)&&(e=\"variable-2\");if(\"property\"==e||\"to\"==f)e=\"atom\"}return\"variable-name\"==a?d(c,b,\"variableName\"):\":\"==a&&b.match(/^[a-z-]+/,!1)?d(c,b,\"pseudo\"):c.context.type};h.vendorPrefixes=function(a,b,c){return\"word\"==a?(e=\"property\",d(c,b,\"block\",0)):r(c)};h.pseudo=function(a,b,c){return t(l(b.string))?\nA(a,b,c):(b.match(/^[a-z-]+/),e=\"variable-3\",k(b)?d(c,b,\"block\"):r(c))};h.atBlock=function(a,b,c){if(\"(\"==a)return d(c,b,\"atBlock_parens\");if(H(a,b,c))return d(c,b,\"block\");if(\"{\"==a&&b.match(/^\\s*\\$?[\\w-]+/i,!1))return d(c,b,\"interpolation\");if(\"word\"==a){var f=b.current().toLowerCase();e=/^(only|not|and|or)$/.test(f)?\"keyword\":ga.hasOwnProperty(f)?\"tag\":ia.hasOwnProperty(f)?\"attribute\":ha.hasOwnProperty(f)?\"property\":fa.hasOwnProperty(f)?\"string-2\":v(b.current());if(\"tag\"==e&&k(b))return d(c,b,\n\"block\")}\"operator\"==a&&/^(not|and|or)$/.test(b.current())&&(e=\"keyword\");return c.context.type};h.atBlock_parens=function(a,b,c){return\"{\"==a||\"}\"==a?c.context.type:\")\"==a?k(b)?d(c,b,\"block\"):d(c,b,\"atBlock\"):\"word\"==a?(a=b.current().toLowerCase(),e=v(a),/^(max|min)/.test(a)&&(e=\"property\"),\"tag\"==e&&(B.test(a)?e=\"variable-2\":e=\"atom\"),c.context.type):h.atBlock(a,b,c)};h.keyframes=function(a,b,c){return\"0\"==b.indentation()&&(\"}\"==a&&w(b)||\"]\"==a||\"hash\"==a||\"qualifier\"==a||n(b.current()))?A(a,b,\nc):\"{\"==a?d(c,b,\"keyframes\"):\"}\"==a?w(b)?r(c,!0):d(c,b,\"keyframes\"):\"unit\"==a&&/^[0-9]+\\%$/.test(b.current())?d(c,b,\"keyframes\"):\"word\"==a&&(e=v(b.current()),\"block-keyword\"==e)?(e=\"keyword\",d(c,b,\"keyframes\")):/@(font-face|media|supports|(-moz-)?document)/.test(a)?d(c,b,k(b)?\"block\":\"atBlock\"):\"mixin\"==a?d(c,b,\"block\",0):c.context.type};h.interpolation=function(a,b,c){\"{\"==a&&r(c)&&d(c,b,\"block\");if(\"}\"==a)return b.string.match(/^\\s*(\\.|#|:|\\[|\\*|&|>|~|\\+|\\/)/i)||b.string.match(/^\\s*[a-z]/i)&&n(l(b))?\nd(c,b,\"block\"):!b.string.match(/^(\\{|\\s*\\&)/)||b.match(/\\s*[\\w-]/,!1)?d(c,b,\"block\",0):d(c,b,\"block\");if(\"variable-name\"==a)return d(c,b,\"variableName\",0);\"word\"==a&&(e=v(b.current()),\"tag\"==e&&(e=\"atom\"));return c.context.type};h.extend=function(a,b,c){return\"[\"==a||\"=\"==a?\"extend\":\"]\"==a?r(c):\"word\"==a?(e=v(b.current()),\"extend\"):r(c)};h.variableName=function(a,b,c){return\"string\"==a||\"[\"==a||\"]\"==a||b.current().match(/^(\\.|\\$)/)?(b.current().match(/^\\.[\\w-]+/i)&&(e=\"variable-2\"),\"variableName\"):\nA(a,b,c)};return{startState:function(a){return{tokenize:null,state:\"block\",context:new G(\"block\",a||0,null)}},token:function(a,b){if(!b.tokenize&&a.eatSpace())return null;(x=(b.tokenize||D)(a,b))&&\"object\"==typeof x&&(T=x[1],x=x[0]);e=x;b.state=h[b.state](T,a,b);return e},indent:function(a,b,c){var d=a.context,e=b&&b.charAt(0),f=d.indent,k=l(b),h=c.length-c.replace(/^\\s*/,\"\").length,g=a.context.prev?a.context.prev.line.firstWord:\"\";a=a.context.prev?a.context.prev.line.indent:h;d.prev&&(\"}\"==e&&(\"block\"==\nd.type||\"atBlock\"==d.type||\"keyframes\"==d.type)||\")\"==e&&(\"parens\"==d.type||\"atBlock_parens\"==d.type)||\"{\"==e&&\"at\"==d.type)?f=d.indent-q:/(\\})/.test(e)||(/@|\\$|\\d/.test(e)||/^\\{/.test(b)||/^\\s*\\/(\\/|\\*)/.test(b)||/^\\s*\\/\\*/.test(g)||/^\\s*[\\w-\\.\\[\\]\\'\\\"]+\\s*(\\?|:|\\+)?=/i.test(b)||/^(\\+|-)?[a-z][\\w-]*\\(/i.test(b)||/^return/.test(b)||u(k)?f=h:/(\\.|#|:|\\[|\\*|&|>|~|\\+|\\/)/.test(e)||n(k)?f=/\\,\\s*$/.test(g)?a:/^\\s+/.test(c)&&(/(\\.|#|:|\\[|\\*|&|>|~|\\+|\\/)/.test(g)||n(g))?h<=a?a:a+q:h:/,\\s*$/.test(c)||!k.toLowerCase().match(z)&&\n!t(k)||(f=u(g)?h<=a?a:a+q:/^\\{/.test(g)?h<=a?h:a+q:g.toLowerCase().match(z)||t(g)?h>=a?a:h:/^(\\.|#|:|\\[|\\*|&|@|\\+|\\-|>|~|\\/)/.test(g)||/=\\s*$/.test(g)||n(g)||/^\\$[\\w-\\.\\[\\]\\'\\\"]/.test(g)?a+q:h));return f},electricChars:\"}\",lineComment:\"//\",fold:\"indent\"}});var I=\"a abbr address area article aside audio b base bdi bdo bgsound blockquote body br button canvas caption cite code col colgroup data datalist dd del details dfn div dl dt em embed fieldset figcaption figure footer form h1 h2 h3 h4 h5 h6 head header hgroup hr html i iframe img input ins kbd keygen label legend li link main map mark marquee menu menuitem meta meter nav nobr noframes noscript object ol optgroup option output p param pre progress q rp rt ruby s samp script section select small source span strong style sub summary sup table tbody td textarea tfoot th thead time tr track u ul var video\".split(\" \"),\nC=[\"domain\",\"regexp\",\"url\",\"url-prefix\"],O=\"all aural braille handheld print projection screen tty tv embossed\".split(\" \"),N=\"width min-width max-width height min-height max-height device-width min-device-width max-device-width device-height min-device-height max-device-height aspect-ratio min-aspect-ratio max-aspect-ratio device-aspect-ratio min-device-aspect-ratio max-device-aspect-ratio color min-color max-color color-index min-color-index max-color-index monochrome min-monochrome max-monochrome resolution min-resolution max-resolution scan grid\".split(\" \"),\nJ=\"align-content align-items align-self alignment-adjust alignment-baseline anchor-point animation animation-delay animation-direction animation-duration animation-fill-mode animation-iteration-count animation-name animation-play-state animation-timing-function appearance azimuth backface-visibility background background-attachment background-clip background-color background-image background-origin background-position background-repeat background-size baseline-shift binding bleed bookmark-label bookmark-level bookmark-state bookmark-target border border-bottom border-bottom-color border-bottom-left-radius border-bottom-right-radius border-bottom-style border-bottom-width border-collapse border-color border-image border-image-outset border-image-repeat border-image-slice border-image-source border-image-width border-left border-left-color border-left-style border-left-width border-radius border-right border-right-color border-right-style border-right-width border-spacing border-style border-top border-top-color border-top-left-radius border-top-right-radius border-top-style border-top-width border-width bottom box-decoration-break box-shadow box-sizing break-after break-before break-inside caption-side clear clip color color-profile column-count column-fill column-gap column-rule column-rule-color column-rule-style column-rule-width column-span column-width columns content counter-increment counter-reset crop cue cue-after cue-before cursor direction display dominant-baseline drop-initial-after-adjust drop-initial-after-align drop-initial-before-adjust drop-initial-before-align drop-initial-size drop-initial-value elevation empty-cells fit fit-position flex flex-basis flex-direction flex-flow flex-grow flex-shrink flex-wrap float float-offset flow-from flow-into font font-feature-settings font-family font-kerning font-language-override font-size font-size-adjust font-stretch font-style font-synthesis font-variant font-variant-alternates font-variant-caps font-variant-east-asian font-variant-ligatures font-variant-numeric font-variant-position font-weight grid grid-area grid-auto-columns grid-auto-flow grid-auto-position grid-auto-rows grid-column grid-column-end grid-column-start grid-row grid-row-end grid-row-start grid-template grid-template-areas grid-template-columns grid-template-rows hanging-punctuation height hyphens icon image-orientation image-rendering image-resolution inline-box-align justify-content left letter-spacing line-break line-height line-stacking line-stacking-ruby line-stacking-shift line-stacking-strategy list-style list-style-image list-style-position list-style-type margin margin-bottom margin-left margin-right margin-top marker-offset marks marquee-direction marquee-loop marquee-play-count marquee-speed marquee-style max-height max-width min-height min-width move-to nav-down nav-index nav-left nav-right nav-up object-fit object-position opacity order orphans outline outline-color outline-offset outline-style outline-width overflow overflow-style overflow-wrap overflow-x overflow-y padding padding-bottom padding-left padding-right padding-top page page-break-after page-break-before page-break-inside page-policy pause pause-after pause-before perspective perspective-origin pitch pitch-range play-during position presentation-level punctuation-trim quotes region-break-after region-break-before region-break-inside region-fragment rendering-intent resize rest rest-after rest-before richness right rotation rotation-point ruby-align ruby-overhang ruby-position ruby-span shape-image-threshold shape-inside shape-margin shape-outside size speak speak-as speak-header speak-numeral speak-punctuation speech-rate stress string-set tab-size table-layout target target-name target-new target-position text-align text-align-last text-decoration text-decoration-color text-decoration-line text-decoration-skip text-decoration-style text-emphasis text-emphasis-color text-emphasis-position text-emphasis-style text-height text-indent text-justify text-outline text-overflow text-shadow text-size-adjust text-space-collapse text-transform text-underline-position text-wrap top transform transform-origin transform-style transition transition-delay transition-duration transition-property transition-timing-function unicode-bidi vertical-align visibility voice-balance voice-duration voice-family voice-pitch voice-range voice-rate voice-stress voice-volume volume white-space widows width word-break word-spacing word-wrap z-index clip-path clip-rule mask enable-background filter flood-color flood-opacity lighting-color stop-color stop-opacity pointer-events color-interpolation color-interpolation-filters color-rendering fill fill-opacity fill-rule image-rendering marker marker-end marker-mid marker-start shape-rendering stroke stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-rendering baseline-shift dominant-baseline glyph-orientation-horizontal glyph-orientation-vertical text-anchor writing-mode font-smoothing osx-font-smoothing\".split(\" \"),\nK=\"scrollbar-arrow-color scrollbar-base-color scrollbar-dark-shadow-color scrollbar-face-color scrollbar-highlight-color scrollbar-shadow-color scrollbar-3d-light-color scrollbar-track-color shape-inside searchfield-cancel-button searchfield-decoration searchfield-results-button searchfield-results-decoration zoom\".split(\" \"),P=\"font-family src unicode-range font-variant font-feature-settings font-stretch font-weight font-style\".split(\" \"),M=\"aliceblue antiquewhite aqua aquamarine azure beige bisque black blanchedalmond blue blueviolet brown burlywood cadetblue chartreuse chocolate coral cornflowerblue cornsilk crimson cyan darkblue darkcyan darkgoldenrod darkgray darkgreen darkkhaki darkmagenta darkolivegreen darkorange darkorchid darkred darksalmon darkseagreen darkslateblue darkslategray darkturquoise darkviolet deeppink deepskyblue dimgray dodgerblue firebrick floralwhite forestgreen fuchsia gainsboro ghostwhite gold goldenrod gray grey green greenyellow honeydew hotpink indianred indigo ivory khaki lavender lavenderblush lawngreen lemonchiffon lightblue lightcoral lightcyan lightgoldenrodyellow lightgray lightgreen lightpink lightsalmon lightseagreen lightskyblue lightslategray lightsteelblue lightyellow lime limegreen linen magenta maroon mediumaquamarine mediumblue mediumorchid mediumpurple mediumseagreen mediumslateblue mediumspringgreen mediumturquoise mediumvioletred midnightblue mintcream mistyrose moccasin navajowhite navy oldlace olive olivedrab orange orangered orchid palegoldenrod palegreen paleturquoise palevioletred papayawhip peachpuff peru pink plum powderblue purple rebeccapurple red rosybrown royalblue saddlebrown salmon sandybrown seagreen seashell sienna silver skyblue slateblue slategray snow springgreen steelblue tan teal thistle tomato turquoise violet wheat white whitesmoke yellow yellowgreen\".split(\" \"),\nL=\"above absolute activeborder additive activecaption afar after-white-space ahead alias all all-scroll alphabetic alternate always amharic amharic-abegede antialiased appworkspace arabic-indic armenian asterisks attr auto avoid avoid-column avoid-page avoid-region background backwards baseline below bidi-override binary bengali blink block block-axis bold bolder border border-box both bottom break break-all break-word bullets button button-bevel buttonface buttonhighlight buttonshadow buttontext calc cambodian capitalize caps-lock-indicator caption captiontext caret cell center checkbox circle cjk-decimal cjk-earthly-branch cjk-heavenly-stem cjk-ideographic clear clip close-quote col-resize collapse column compact condensed contain content content-box context-menu continuous copy counter counters cover crop cross crosshair currentcolor cursive cyclic dashed decimal decimal-leading-zero default default-button destination-atop destination-in destination-out destination-over devanagari disc discard disclosure-closed disclosure-open document dot-dash dot-dot-dash dotted double down e-resize ease ease-in ease-in-out ease-out element ellipse ellipsis embed end ethiopic ethiopic-abegede ethiopic-abegede-am-et ethiopic-abegede-gez ethiopic-abegede-ti-er ethiopic-abegede-ti-et ethiopic-halehame-aa-er ethiopic-halehame-aa-et ethiopic-halehame-am-et ethiopic-halehame-gez ethiopic-halehame-om-et ethiopic-halehame-sid-et ethiopic-halehame-so-et ethiopic-halehame-ti-er ethiopic-halehame-ti-et ethiopic-halehame-tig ethiopic-numeric ew-resize expanded extends extra-condensed extra-expanded fantasy fast fill fixed flat flex footnotes forwards from geometricPrecision georgian graytext groove gujarati gurmukhi hand hangul hangul-consonant hebrew help hidden hide higher highlight highlighttext hiragana hiragana-iroha horizontal hsl hsla icon ignore inactiveborder inactivecaption inactivecaptiontext infinite infobackground infotext inherit initial inline inline-axis inline-block inline-flex inline-table inset inside intrinsic invert italic japanese-formal japanese-informal justify kannada katakana katakana-iroha keep-all khmer korean-hangul-formal korean-hanja-formal korean-hanja-informal landscape lao large larger left level lighter line-through linear linear-gradient lines list-item listbox listitem local logical loud lower lower-alpha lower-armenian lower-greek lower-hexadecimal lower-latin lower-norwegian lower-roman lowercase ltr malayalam match matrix matrix3d media-controls-background media-current-time-display media-fullscreen-button media-mute-button media-play-button media-return-to-realtime-button media-rewind-button media-seek-back-button media-seek-forward-button media-slider media-sliderthumb media-time-remaining-display media-volume-slider media-volume-slider-container media-volume-sliderthumb medium menu menulist menulist-button menulist-text menulist-textfield menutext message-box middle min-intrinsic mix mongolian monospace move multiple myanmar n-resize narrower ne-resize nesw-resize no-close-quote no-drop no-open-quote no-repeat none normal not-allowed nowrap ns-resize numbers numeric nw-resize nwse-resize oblique octal open-quote optimizeLegibility optimizeSpeed oriya oromo outset outside outside-shape overlay overline padding padding-box painted page paused persian perspective plus-darker plus-lighter pointer polygon portrait pre pre-line pre-wrap preserve-3d progress push-button radial-gradient radio read-only read-write read-write-plaintext-only rectangle region relative repeat repeating-linear-gradient repeating-radial-gradient repeat-x repeat-y reset reverse rgb rgba ridge right rotate rotate3d rotateX rotateY rotateZ round row-resize rtl run-in running s-resize sans-serif scale scale3d scaleX scaleY scaleZ scroll scrollbar se-resize searchfield searchfield-cancel-button searchfield-decoration searchfield-results-button searchfield-results-decoration semi-condensed semi-expanded separate serif show sidama simp-chinese-formal simp-chinese-informal single skew skewX skewY skip-white-space slide slider-horizontal slider-vertical sliderthumb-horizontal sliderthumb-vertical slow small small-caps small-caption smaller solid somali source-atop source-in source-out source-over space spell-out square square-button start static status-bar stretch stroke sub subpixel-antialiased super sw-resize symbolic symbols table table-caption table-cell table-column table-column-group table-footer-group table-header-group table-row table-row-group tamil telugu text text-bottom text-top textarea textfield thai thick thin threeddarkshadow threedface threedhighlight threedlightshadow threedshadow tibetan tigre tigrinya-er tigrinya-er-abegede tigrinya-et tigrinya-et-abegede to top trad-chinese-formal trad-chinese-informal translate translate3d translateX translateY translateZ transparent ultra-condensed ultra-expanded underline up upper-alpha upper-armenian upper-greek upper-hexadecimal upper-latin upper-norwegian upper-roman uppercase urdu url var vertical vertical-text visible visibleFill visiblePainted visibleStroke visual w-resize wait wave wider window windowframe windowtext words x-large x-small xor xx-large xx-small bicubic optimizespeed grayscale row row-reverse wrap wrap-reverse column-reverse flex-start flex-end space-between space-around\".split(\" \"),\nQ=\"in;and;or;not;is not;is a;is;isnt;defined;if unless\".split(\";\"),R=\"for if else unless from to\".split(\" \"),S=\"null true false href title type not-allowed readonly disabled\".split(\" \"),D=I.concat(C,O,N,J,K,M,L,P,Q,R,S,\"@font-face @keyframes @media @viewport @page @host @supports @block @css\".split(\" \"));g.registerHelper(\"hintWords\",\"stylus\",D);g.defineMIME(\"text/x-styl\",\"stylus\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/swift/swift.js",
    "content": "'use strict';(function(f){\"object\"==typeof exports&&\"object\"==typeof module?f(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],f):f(CodeMirror)})(function(f){function g(a){for(var b={},c=0;c<a.length;c++)b[a[c]]=!0;return b}function h(a,b,c){a.sol()&&(b.indented=a.indentation());if(a.eatSpace())return null;var d=a.peek();if(\"/\"==d){if(a.match(\"//\"))return a.skipToEnd(),\"comment\";if(a.match(\"/*\"))return b.tokenize.push(k),k(a,b);if(a.match(l))return\"string-2\"}if(-1<\n\"+-/*%=|&<>#\".indexOf(d))return a.next(),\"operator\";if(-1<\";,.(){}[]\".indexOf(d))return a.next(),a.match(\"..\"),\"punctuation\";if('\"'==d||\"'\"==d)return a.next(),c=m(d),b.tokenize.push(c),c(a,b);if(a.match(n))return\"number\";if(a.match(p))return\"property\";if(a.match(q))return a=a.current(),r.hasOwnProperty(a)?(t.hasOwnProperty(a)&&(b.prev=\"define\"),\"keyword\"):u.hasOwnProperty(a)?\"variable-2\":v.hasOwnProperty(a)?\"atom\":\"define\"==c?\"def\":\"variable\";a.next();return null}function w(){var a=0;return function(b,\nc,d){d=h(b,c,d);if(\"punctuation\"==d)if(\"(\"==b.current())++a;else if(\")\"==b.current()){if(0==a)return b.backUp(1),c.tokenize.pop(),c.tokenize[c.tokenize.length-1](b,c);--a}return d}}function m(a){return function(b,c){for(var d,e=!1;d=b.next();)if(e){if(\"(\"==d)return c.tokenize.push(w()),\"string\";e=!1}else if(d==a)break;else e=\"\\\\\"==d;c.tokenize.pop();return\"string\"}}function k(a,b){a.match(/^(?:[^*]|\\*(?!\\/))*/);a.match(\"*/\")&&b.tokenize.pop();return\"comment\"}function x(a,b,c){this.prev=a;this.align=\nb;this.indented=c}function y(a,b){b=b.match(/^\\s*($|\\/[\\/\\*])/,!1)?null:b.column()+1;a.context=new x(a.context,b,a.indented)}function z(a){a.context&&(a.indented=a.context.indented,a.context=a.context.prev)}var r=g(\"var let class deinit enum extension func import init protocol static struct subscript typealias as dynamicType is new super self Self Type __COLUMN__ __FILE__ __FUNCTION__ __LINE__ break case continue default do else fallthrough if in for return switch where while associativity didSet get infix inout left mutating none nonmutating operator override postfix precedence prefix right set unowned weak willSet\".split(\" \")),\nt=g(\"var let class enum extension func import protocol struct typealias dynamicType for\".split(\" \")),v=g(\"Infinity NaN undefined null true false on off yes no nil null this super\".split(\" \")),u=g(\"String bool int string double Double Int Float float public private extension\".split(\" \")),n=/^-?(?:(?:[\\d_]+\\.[_\\d]*|\\.[_\\d]+|0o[0-7_\\.]+|0b[01_\\.]+)(?:e-?[\\d_]+)?|0x[\\d_a-f\\.]+(?:p-?[\\d_]+)?)/i,q=/^[_A-Za-z$][_A-Za-z$0-9]*/,p=/^[@\\.][_A-Za-z$][_A-Za-z$0-9]*/,l=/^\\/(?!\\s)(?:\\/\\/)?(?:\\\\.|[^\\/])+\\//;f.defineMode(\"swift\",\nfunction(a){return{startState:function(){return{prev:null,context:null,indented:0,tokenize:[]}},token:function(a,c){var b=c.prev;c.prev=null;var e=(c.tokenize[c.tokenize.length-1]||h)(a,c,b);e&&\"comment\"!=e?c.prev||(c.prev=e):c.prev=b;\"punctuation\"==e&&(b=/[\\(\\[\\{]|([\\]\\)\\}])/.exec(a.current()))&&(b[1]?z:y)(c,a);return e},indent:function(b,c){b=b.context;if(!b)return 0;c=/^[\\]\\}\\)]/.test(c);return null!=b.align?b.align-(c?1:0):b.indented+(c?0:a.indentUnit)},electricInput:/^\\s*[\\)\\}\\]]$/,lineComment:\"//\",\nblockCommentStart:\"/*\",blockCommentEnd:\"*/\"}});f.defineMIME(\"text/x-swift\",\"swift\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/tcl/tcl.js",
    "content": "'use strict';(function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],e):e(CodeMirror)})(function(e){e.defineMode(\"tcl\",function(){function e(a){var b={};a=a.split(\" \");for(var d=0;d<a.length;++d)b[a[d]]=!0;return b}function f(a,b,d){b.tokenize=d;return d(a,b)}function g(a,b){var d=b.beforeParams;b.beforeParams=!1;var c=a.next();if('\"'!=c&&\"'\"!=c||!b.inParams){if(/[\\[\\]{}\\(\\),;\\.]/.test(c))return\"(\"==\nc&&d?b.inParams=!0:\")\"==c&&(b.inParams=!1),null;if(/\\d/.test(c))return a.eatWhile(/[\\w\\.]/),\"number\";if(\"#\"==c){if(a.eat(\"*\"))return f(a,b,m);if(\"#\"==c&&a.match(/ *\\[ *\\[/))return f(a,b,n);a.skipToEnd();return\"comment\"}if('\"'==c)return a.skipTo(/\"/),\"comment\";if(\"$\"==c)return a.eatWhile(/[$_a-z0-9A-Z\\.{:]/),a.eatWhile(/}/),b.beforeParams=!0,\"builtin\";if(h.test(c))return a.eatWhile(h),\"comment\";a.eatWhile(/[\\w\\$_{}\\xa1-\\uffff]/);a=a.current().toLowerCase();return k&&k.propertyIsEnumerable(a)?\"keyword\":\nl&&l.propertyIsEnumerable(a)?(b.beforeParams=!0,\"keyword\"):null}return f(a,b,p(c))}function p(a){return function(b,d){for(var c=!1,e,f=!1;null!=(e=b.next());){if(e==a&&!c){f=!0;break}c=!c&&\"\\\\\"==e}f&&(d.tokenize=g);return\"string\"}}function m(a,b){for(var d=!1,c;c=a.next();){if(\"#\"==c&&d){b.tokenize=g;break}d=\"*\"==c}return\"comment\"}function n(a,b){for(var d=0,c;c=a.next();){if(\"#\"==c&&2==d){b.tokenize=g;break}\"]\"==c?d++:\" \"!=c&&(d=0)}return\"meta\"}var k=e(\"Tcl safe after append array auto_execok auto_import auto_load auto_mkindex auto_mkindex_old auto_qualify auto_reset bgerror binary break catch cd close concat continue dde eof encoding error eval exec exit expr fblocked fconfigure fcopy file fileevent filename filename flush for foreach format gets glob global history http if incr info interp join lappend lindex linsert list llength load lrange lreplace lsearch lset lsort memory msgcat namespace open package parray pid pkg::create pkg_mkIndex proc puts pwd re_syntax read regex regexp registry regsub rename resource return scan seek set socket source split string subst switch tcl_endOfWord tcl_findLibrary tcl_startOfNextWord tcl_wordBreakAfter tcl_startOfPreviousWord tcl_wordBreakBefore tcltest tclvars tell time trace unknown unset update uplevel upvar variable vwait\"),\nl=e(\"if elseif else and not or eq ne in ni for foreach while switch\"),h=/[+\\-*&%=<>!?^\\/\\|]/;return{startState:function(){return{tokenize:g,beforeParams:!1,inParams:!1}},token:function(a,b){return a.eatSpace()?null:b.tokenize(a,b)}}});e.defineMIME(\"text/x-tcl\",\"tcl\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/textile/textile.js",
    "content": "'use strict';(function(m){\"object\"==typeof exports&&\"object\"==typeof module?m(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],m):m(CodeMirror)})(function(m){function p(b,a,c){return\"_\"===c?b.eat(\"_\")?g(b,a,\"italic\",/__/,2):g(b,a,\"em\",/_/,1):\"*\"===c?b.eat(\"*\")?g(b,a,\"bold\",/\\*\\*/,2):g(b,a,\"strong\",/\\*/,1):\"[\"===c?(b.match(/\\d+\\]/)&&(a.footCite=!0),h(a)):\"(\"===c&&b.match(/^(r|tm|c)\\)/)?l(a,k.specialChar):\"<\"===c&&b.match(/(\\w+)[^>]+>[^<]+<\\/\\1>/)?\nl(a,k.html):\"?\"===c&&b.eat(\"?\")?g(b,a,\"cite\",/\\?\\?/,2):\"=\"===c&&b.eat(\"=\")?g(b,a,\"notextile\",/==/,2):\"-\"!==c||b.eat(\"-\")?\"+\"===c?g(b,a,\"addition\",/\\+/,1):\"~\"===c?g(b,a,\"sub\",/~/,1):\"^\"===c?g(b,a,\"sup\",/\\^/,1):\"%\"===c?g(b,a,\"span\",/%/,1):\"@\"===c?g(b,a,\"code\",/@/,1):\"!\"===c?(a=g(b,a,\"image\",/(?:\\([^\\)]+\\))?!/,1),b.match(/^:\\S+/),a):h(a):g(b,a,\"deletion\",/-/,1)}function g(b,a,c,d,e){e=b.pos>e?b.string.charAt(b.pos-e-1):null;var g=b.peek();if(a[c]){if((!g||/\\W/.test(g))&&e&&/\\S/.test(e))return b=h(a),\na[c]=!1,b}else(!e||/\\W/.test(e))&&g&&/\\S/.test(g)&&b.match(new RegExp(\"^.*\\\\S\"+d.source+\"(?:\\\\W|$)\"),!1)&&(a[c]=!0,a.mode=f.attributes);return h(a)}function h(b){var a=n(b);if(a)return a;a=[];b.layoutType&&a.push(k[b.layoutType]);a=a.concat(q(b,\"addition\",\"bold\",\"cite\",\"code\",\"deletion\",\"em\",\"footCite\",\"image\",\"italic\",\"link\",\"span\",\"strong\",\"sub\",\"sup\",\"table\",\"tableHeading\"));\"header\"===b.layoutType&&a.push(k.header+\"-\"+b.header);return a.length?a.join(\" \"):null}function n(b){var a=b.layoutType;\nswitch(a){case \"notextile\":case \"code\":case \"pre\":return k[a];default:return b.notextile?k.notextile+(a?\" \"+k[a]:\"\"):null}}function l(b,a){var c=n(b);if(c)return c;b=h(b);return a?b?b+\" \"+a:a:b}function q(b){for(var a=[],c=1;c<arguments.length;++c)b[arguments[c]]&&a.push(k[arguments[c]]);return a}function r(b){var a=b.spanningLayout,c=b.layoutType,d;for(d in b)b.hasOwnProperty(d)&&delete b[d];b.mode=f.newLayout;a&&(b.layoutType=c,b.spanningLayout=!0)}function e(b){return d.cache[b]||(d.cache[b]=d.createRe(b))}\nvar k={addition:\"positive\",attributes:\"attribute\",bold:\"strong\",cite:\"keyword\",code:\"atom\",definitionList:\"number\",deletion:\"negative\",div:\"punctuation\",em:\"em\",footnote:\"variable\",footCite:\"qualifier\",header:\"header\",html:\"comment\",image:\"string\",italic:\"em\",link:\"link\",linkDefinition:\"link\",list1:\"variable-2\",list2:\"variable-3\",list3:\"keyword\",notextile:\"string-2\",pre:\"operator\",p:\"property\",quote:\"bracket\",span:\"quote\",specialChar:\"tag\",strong:\"strong\",sub:\"builtin\",sup:\"builtin\",table:\"variable-3\",\ntableHeading:\"operator\"},d={cache:{},single:{bc:\"bc\",bq:\"bq\",definitionList:/- [^(?::=)]+:=+/,definitionListEnd:/.*=:\\s*$/,div:\"div\",drawTable:/\\|.*\\|/,foot:/fn\\d+/,header:/h[1-6]/,html:/\\s*<(?:\\/)?(\\w+)(?:[^>]+)?>(?:[^<]+<\\/\\1>)?/,link:/[^\"]+\":\\S/,linkDefinition:/\\[[^\\s\\]]+\\]\\S+/,list:/(?:#+|\\*+)/,notextile:\"notextile\",para:\"p\",pre:\"pre\",table:\"table\",tableCellAttributes:/[\\/\\\\]\\d+/,tableHeading:/\\|_\\./,tableText:/[^\"_\\*\\[\\(\\?\\+~\\^%@|-]+/,text:/[^!\"_=\\*\\[\\(<\\?\\+~\\^%@-]+/},attributes:{align:/(?:<>|<|>|=)/,\nselector:/\\([^\\(][^\\)]+\\)/,lang:/\\[[^\\[\\]]+\\]/,pad:/(?:\\(+|\\)+){1,2}/,css:/\\{[^\\}]+\\}/},createRe:function(b){switch(b){case \"drawTable\":return d.makeRe(\"^\",d.single.drawTable,\"$\");case \"html\":return d.makeRe(\"^\",d.single.html,\"(?:\",d.single.html,\")*\",\"$\");case \"linkDefinition\":return d.makeRe(\"^\",d.single.linkDefinition,\"$\");case \"listLayout\":return d.makeRe(\"^\",d.single.list,e(\"allAttributes\"),\"*\\\\s+\");case \"tableCellAttributes\":return d.makeRe(\"^\",d.choiceRe(d.single.tableCellAttributes,e(\"allAttributes\")),\n\"+\\\\.\");case \"type\":return d.makeRe(\"^\",e(\"allTypes\"));case \"typeLayout\":return d.makeRe(\"^\",e(\"allTypes\"),e(\"allAttributes\"),\"*\\\\.\\\\.?\",\"(\\\\s+|$)\");case \"attributes\":return d.makeRe(\"^\",e(\"allAttributes\"),\"+\");case \"allTypes\":return d.choiceRe(d.single.div,d.single.foot,d.single.header,d.single.bc,d.single.bq,d.single.notextile,d.single.pre,d.single.table,d.single.para);case \"allAttributes\":return d.choiceRe(d.attributes.selector,d.attributes.css,d.attributes.lang,d.attributes.align,d.attributes.pad);\ndefault:return d.makeRe(\"^\",d.single[b])}},makeRe:function(){for(var b=\"\",a=0;a<arguments.length;++a)var c=arguments[a],b=b+(\"string\"===typeof c?c:c.source);return new RegExp(b)},choiceRe:function(){for(var b=[arguments[0]],a=1;a<arguments.length;++a)b[2*a-1]=\"|\",b[2*a]=arguments[a];b.unshift(\"(?:\");b.push(\")\");return d.makeRe.apply(null,b)}},f={newLayout:function(b,a){if(b.match(e(\"typeLayout\"),!1))return a.spanningLayout=!1,(a.mode=f.blockType)(b,a);var c;n(a)||(b.match(e(\"listLayout\"),!1)?c=f.list:\nb.match(e(\"drawTable\"),!1)?c=f.table:b.match(e(\"linkDefinition\"),!1)?c=f.linkDefinition:b.match(e(\"definitionList\"))?c=f.definitionList:b.match(e(\"html\"),!1)&&(c=f.html));return(a.mode=c||f.text)(b,a)},blockType:function(b,a){var c;a.layoutType=null;if(c=b.match(e(\"type\")))b=c[0];else return(a.mode=f.text)(b,a);(c=b.match(e(\"header\")))?(a.layoutType=\"header\",a.header=parseInt(c[0][1])):b.match(e(\"bq\"))?a.layoutType=\"quote\":b.match(e(\"bc\"))?a.layoutType=\"code\":b.match(e(\"foot\"))?a.layoutType=\"footnote\":\nb.match(e(\"notextile\"))?a.layoutType=\"notextile\":b.match(e(\"pre\"))?a.layoutType=\"pre\":b.match(e(\"div\"))?a.layoutType=\"div\":b.match(e(\"table\"))&&(a.layoutType=\"table\");a.mode=f.attributes;return h(a)},text:function(b,a){if(b.match(e(\"text\")))return h(a);var c=b.next();return'\"'===c?(a.mode=f.link)(b,a):p(b,a,c)},attributes:function(b,a){a.mode=f.layoutLength;return b.match(e(\"attributes\"))?l(a,k.attributes):h(a)},layoutLength:function(b,a){b.eat(\".\")&&b.eat(\".\")&&(a.spanningLayout=!0);a.mode=f.text;\nreturn h(a)},list:function(b,a){b=b.match(e(\"list\"));a.listDepth=b[0].length;b=(a.listDepth-1)%3;a.layoutType=b?1===b?\"list2\":\"list3\":\"list1\";a.mode=f.attributes;return h(a)},link:function(b,a){a.mode=f.text;return b.match(e(\"link\"))?(b.match(/\\S+/),l(a,k.link)):h(a)},linkDefinition:function(b,a){b.skipToEnd();return l(a,k.linkDefinition)},definitionList:function(b,a){b.match(e(\"definitionList\"));a.layoutType=\"definitionList\";b.match(/\\s*$/)?a.spanningLayout=!0:a.mode=f.attributes;return h(a)},html:function(b,\na){b.skipToEnd();return l(a,k.html)},table:function(b,a){a.layoutType=\"table\";return(a.mode=f.tableCell)(b,a)},tableCell:function(b,a){b.match(e(\"tableHeading\"))?a.tableHeading=!0:b.eat(\"|\");a.mode=f.tableCellAttributes;return h(a)},tableCellAttributes:function(b,a){a.mode=f.tableText;return b.match(e(\"tableCellAttributes\"))?l(a,k.attributes):h(a)},tableText:function(b,a){return b.match(e(\"tableText\"))?h(a):\"|\"===b.peek()?(a.mode=f.tableCell,h(a)):p(b,a,b.next())}};m.defineMode(\"textile\",function(){return{startState:function(){return{mode:f.newLayout}},\ntoken:function(b,a){b.sol()&&(a.mode=f.newLayout,a.tableHeading=!1,\"definitionList\"===a.layoutType&&a.spanningLayout&&b.match(e(\"definitionListEnd\"),!1)&&(a.spanningLayout=!1));return a.mode(b,a)},blankLine:r}});m.defineMIME(\"text/x-textile\",\"textile\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/tiddlywiki/tiddlywiki.css",
    "content": "span.cm-underlined{text-decoration:underline}span.cm-strikethrough{text-decoration:line-through}span.cm-brace{color:#170;font-weight:700}span.cm-table{color:#00f;font-weight:700}"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/tiddlywiki/tiddlywiki.js",
    "content": "'use strict';(function(f){\"object\"==typeof exports&&\"object\"==typeof module?f(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],f):f(CodeMirror)})(function(f){f.defineMode(\"tiddlywiki\",function(){function g(a,c,d){c.tokenize=d;return d(a,c)}function e(a,c){var d=a.sol(),b=a.peek();c.block=!1;if(d&&/[<\\/\\*{}\\-]/.test(b)){if(a.match(k))return c.block=!0,g(a,c,h);if(a.match(l))return\"quote\";if(a.match(m)||a.match(n)||a.match(p)||a.match(q)||a.match(r)||\na.match(t))return\"comment\";if(a.match(u))return\"hr\"}a.next();if(d&&/[\\/\\*!#;:>|]/.test(b)){if(\"!\"==b)return a.skipToEnd(),\"header\";if(\"*\"==b)return a.eatWhile(\"*\"),\"comment\";if(\"#\"==b)return a.eatWhile(\"#\"),\"comment\";if(\";\"==b)return a.eatWhile(\";\"),\"comment\";if(\":\"==b)return a.eatWhile(\":\"),\"comment\";if(\">\"==b)return a.eatWhile(\">\"),\"quote\";if(\"|\"==b)return\"header\"}if(\"{\"==b&&a.match(/\\{\\{/))return g(a,c,h);if(/[hf]/i.test(b)&&/[ti]/i.test(a.peek())&&a.match(/\\b(ttps?|tp|ile):\\/\\/[\\-A-Z0-9+&@#\\/%?=~_|$!:,.;]*[A-Z0-9+&@#\\/%=~_|$]/i))return\"link\";\nif('\"'==b)return\"string\";if(\"~\"==b||/[\\[\\]]/.test(b)&&a.match(b))return\"brace\";if(\"@\"==b)return a.eatWhile(v),\"link\";if(/\\d/.test(b))return a.eatWhile(/\\d/),\"number\";if(\"/\"==b){if(a.eat(\"%\"))return g(a,c,f);if(a.eat(\"/\"))return g(a,c,w)}if(\"_\"==b&&a.eat(\"_\"))return g(a,c,x);if(\"-\"==b&&a.eat(\"-\")){if(\" \"!=a.peek())return g(a,c,y);if(\" \"==a.peek())return\"brace\"}if(\"'\"==b&&a.eat(\"'\"))return g(a,c,z);if(\"<\"==b&&a.eat(\"<\"))return g(a,c,A);a.eatWhile(/[\\w\\$_]/);return B.propertyIsEnumerable(a.current())?\n\"keyword\":null}function f(a,c){for(var d=!1,b;b=a.next();){if(\"/\"==b&&d){c.tokenize=e;break}d=\"%\"==b}return\"comment\"}function z(a,c){for(var d=!1,b;b=a.next();){if(\"'\"==b&&d){c.tokenize=e;break}d=\"'\"==b}return\"strong\"}function h(a,c){var d=c.block;if(d&&a.current())return\"comment\";if(!d&&a.match(C)||d&&a.sol()&&a.match(D))return c.tokenize=e,\"comment\";a.next();return\"comment\"}function w(a,c){for(var d=!1,b;b=a.next();){if(\"/\"==b&&d){c.tokenize=e;break}d=\"/\"==b}return\"em\"}function x(a,c){for(var d=\n!1,b;b=a.next();){if(\"_\"==b&&d){c.tokenize=e;break}d=\"_\"==b}return\"underlined\"}function y(a,c){for(var d=!1,b;b=a.next();){if(\"-\"==b&&d){c.tokenize=e;break}d=\"-\"==b}return\"strikethrough\"}function A(a,c){if(\"<<\"==a.current())return\"macro\";var d=a.next();if(!d)return c.tokenize=e,null;if(\">\"==d&&\">\"==a.peek())return a.next(),c.tokenize=e,\"macro\";a.eatWhile(/[\\w\\$_]/);return E.propertyIsEnumerable(a.current())?\"keyword\":null}var B={},E={allTags:!0,closeAll:!0,list:!0,newJournal:!0,newTiddler:!0,permaview:!0,\nsaveChanges:!0,search:!0,slider:!0,tabs:!0,tag:!0,tagging:!0,tags:!0,tiddler:!0,timeline:!0,today:!0,version:!0,option:!0,\"with\":!0,filter:!0},v=/[\\w_\\-]/i,u=/^\\-\\-\\-\\-+$/,m=/^\\/\\*\\*\\*$/,n=/^\\*\\*\\*\\/$/,l=/^<<<$/,p=/^\\/\\/\\{\\{\\{$/,q=/^\\/\\/\\}\\}\\}$/,r=/^\\x3c!--\\{\\{\\{--\\x3e$/,t=/^\\x3c!--\\}\\}\\}--\\x3e$/,k=/^\\{\\{\\{$/,D=/^\\}\\}\\}$/,C=/.*?\\}\\}\\}/;return{startState:function(){return{tokenize:e}},token:function(a,c){return a.eatSpace()?null:c.tokenize(a,c)}}});f.defineMIME(\"text/x-tiddlywiki\",\"tiddlywiki\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/tiki/tiki.css",
    "content": ".cm-tw-syntaxerror{color:#FFF;background-color:#900}.cm-tw-deleted{text-decoration:line-through}.cm-tw-header5{font-weight:700}.cm-tw-listitem:first-child{padding-left:10px}.cm-tw-box{border-top-width:0!important;border-style:solid;border-width:1px;border-color:inherit}.cm-tw-underline{text-decoration:underline}"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/tiki/tiki.js",
    "content": "'use strict';(function(h){\"object\"==typeof exports&&\"object\"==typeof module?h(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],h):h(CodeMirror)})(function(h){h.defineMode(\"tiki\",function(h){function e(a,b,c){return function(d,e){for(;!d.eol();){if(d.match(b)){e.tokenize=g;break}d.next()}c&&(e.tokenize=c);return a}}function r(a){return function(b,c){for(;!b.eol();)b.next();c.tokenize=g;return a}}function g(a,b){function c(c){b.tokenize=c;return c(a,\nb)}var d=a.sol(),f=a.next();switch(f){case \"{\":return a.eat(\"/\"),a.eatSpace(),a.eatWhile(/[^\\s\\u00a0=\\\"\\'\\/?(}]/),b.tokenize=n,\"tag\";case \"_\":if(a.eat(\"_\"))return c(e(\"strong\",\"__\",g));break;case \"'\":if(a.eat(\"'\"))return c(e(\"em\",\"''\",g));break;case \"(\":if(a.eat(\"(\"))return c(e(\"variable-2\",\"))\",g));break;case \"[\":return c(e(\"variable-3\",\"]\",g));case \"|\":if(a.eat(\"|\"))return c(e(\"comment\",\"||\"));break;case \"-\":if(a.eat(\"=\"))return c(e(\"header string\",\"=-\",g));if(a.eat(\"-\"))return c(e(\"error tw-deleted\",\n\"--\",g));break;case \"=\":if(a.match(\"==\"))return c(e(\"tw-underline\",\"===\",g));break;case \":\":if(a.eat(\":\"))return c(e(\"comment\",\"::\"));break;case \"^\":return c(e(\"tw-box\",\"^\"));case \"~\":if(a.match(\"np~\"))return c(e(\"meta\",\"~/np~\"))}if(d)switch(f){case \"!\":return a.match(\"!!!!!\")||a.match(\"!!!!\")||a.match(\"!!!\")||a.match(\"!!\"),c(r(\"header string\"));case \"*\":case \"#\":case \"+\":return c(r(\"tw-listitem bracket\"))}return null}function n(a,b){var c=a.next(),d=a.peek();if(\"}\"==c)return b.tokenize=g,\"tag\";if(\"(\"==\nc||\")\"==c)return\"bracket\";if(\"=\"==c)return m=\"equals\",\">\"==d&&(a.next(),d=a.peek()),/[\\'\\\"]/.test(d)||(b.tokenize=v()),\"operator\";if(/[\\'\\\"]/.test(c))return b.tokenize=w(c),b.tokenize(a,b);a.eatWhile(/[^\\s\\u00a0=\\\"\\'\\/?]/);return\"keyword\"}function w(a){return function(b,c){for(;!b.eol();)if(b.next()==a){c.tokenize=n;break}return\"string\"}}function v(){return function(a,b){for(;!a.eol();){var c=a.next(),d=a.peek();if(\" \"==c||\",\"==c||/[ )}]/.test(d)){b.tokenize=n;break}}return\"string\"}}function l(){for(var a=\narguments.length-1;0<=a;a--)d.cc.push(arguments[a])}function f(){l.apply(null,arguments);return!0}function t(a,b){d.context={prev:d.context,pluginName:a,indent:d.indented,startOfLine:b,noIndent:d.context&&d.context.noIndent}}function x(a){if(\"openPlugin\"==a)return d.pluginName=p,f(q,y(d.startOfLine));if(\"closePlugin\"==a)return d.context?(a=d.context.pluginName!=p,d.context&&(d.context=d.context.prev)):a=!0,a&&(k=\"error\"),f(z(a));\"string\"==a&&(d.context&&\"!cdata\"==d.context.name||t(\"!cdata\"),d.tokenize==\ng&&d.context&&(d.context=d.context.prev));return f()}function y(a){return function(b){if(\"selfclosePlugin\"==b||\"endPlugin\"==b)return f();\"endPlugin\"==b&&t(d.pluginName,a);return f()}}function z(a){return function(b){a&&(k=\"error\");return\"endPlugin\"==b?f():l()}}function q(a){return\"keyword\"==a?(k=\"attribute\",f(q)):\"equals\"==a?f(A,q):l()}function A(a){return\"keyword\"==a?(k=\"string\",f()):\"string\"==a?f(u):l()}function u(a){return\"string\"==a?f(u):l()}var B=h.indentUnit,p,m,d,k;return{startState:function(){return{tokenize:g,\ncc:[],indented:0,startOfLine:!0,pluginName:null,context:null}},token:function(a,b){a.sol()&&(b.startOfLine=!0,b.indented=a.indentation());if(a.eatSpace())return null;k=m=p=null;if(((a=b.tokenize(a,b))||m)&&\"comment\"!=a)for(d=b;!(b.cc.pop()||x)(m||a););b.startOfLine=!1;return k||a},indent:function(a,b){if((a=a.context)&&a.noIndent)return 0;a&&/^{\\//.test(b)&&(a=a.prev);for(;a&&!a.startOfLine;)a=a.prev;return a?a.indent+B:0},electricChars:\"/\"}});h.defineMIME(\"text/tiki\",\"tiki\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/toml/toml.js",
    "content": "'use strict';(function(c){\"object\"==typeof exports&&\"object\"==typeof module?c(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],c):c(CodeMirror)})(function(c){c.defineMode(\"toml\",function(){return{startState:function(){return{inString:!1,stringType:\"\",lhs:!0,inArray:0}},token:function(a,b){b.inString||'\"'!=a.peek()&&\"'\"!=a.peek()||(b.stringType=a.peek(),a.next(),b.inString=!0);a.sol()&&0===b.inArray&&(b.lhs=!0);if(b.inString){for(;b.inString&&!a.eol();)a.peek()===\nb.stringType?(a.next(),b.inString=!1):\"\\\\\"===a.peek()?(a.next(),a.next()):a.match(/^.[^\\\\\\\"\\']*/);return b.lhs?\"property string\":\"string\"}if(b.inArray&&\"]\"===a.peek())return a.next(),b.inArray--,\"bracket\";if(b.lhs&&\"[\"===a.peek()&&a.skipTo(\"]\"))return a.next(),\"]\"===a.peek()&&a.next(),\"atom\";if(\"#\"===a.peek())return a.skipToEnd(),\"comment\";if(!a.eatSpace()){if(b.lhs&&a.eatWhile(function(a){return\"=\"!=a&&\" \"!=a}))return\"property\";if(b.lhs&&\"=\"===a.peek())a.next(),b.lhs=!1;else{if(!b.lhs&&a.match(/^\\d\\d\\d\\d[\\d\\-\\:\\.T]*Z/)||\n!b.lhs&&(a.match(\"true\")||a.match(\"false\")))return\"atom\";if(b.lhs||\"[\"!==a.peek()){if(!b.lhs&&a.match(/^\\-?\\d+(?:\\.\\d+)?/))return\"number\";a.eatSpace()||a.next()}else return b.inArray++,a.next(),\"bracket\"}}return null}}});c.defineMIME(\"text/x-toml\",\"toml\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/tornado/tornado.js",
    "content": "'use strict';(function(a){\"object\"==typeof exports&&\"object\"==typeof module?a(require(\"../../lib/codemirror\"),require(\"../htmlmixed/htmlmixed\"),require(\"../../addon/mode/overlay\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\",\"../htmlmixed/htmlmixed\",\"../../addon/mode/overlay\"],a):a(CodeMirror)})(function(a){a.defineMode(\"tornado:inner\",function(){function a(a,c){a.eatWhile(/[^\\{]/);var b=a.next();if(\"{\"==b&&(b=a.eat(/\\{|%|#/)))return c.tokenize=e(b),\"tag\"}function e(b){\"{\"==\nb&&(b=\"}\");return function(c,d){return c.next()==b&&c.eat(\"}\")?(d.tokenize=a,\"tag\"):c.match(f)?\"keyword\":\"#\"==b?\"comment\":\"string\"}}var f=\"and as assert autoescape block break class comment context continue datetime def del elif else end escape except exec extends false finally for from global if import in include is json_encode lambda length linkify load module none not or pass print put raise raw return self set squeeze super true try url_escape while with without xhtml_escape yield\".split(\" \"),\nf=new RegExp(\"^((\"+f.join(\")|(\")+\"))\\\\b\");return{startState:function(){return{tokenize:a}},token:function(a,c){return c.tokenize(a,c)}}});a.defineMode(\"tornado\",function(d){var e=a.getMode(d,\"text/html\");d=a.getMode(d,\"tornado:inner\");return a.overlayMode(e,d)});a.defineMIME(\"text/x-tornado\",\"tornado\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/troff/troff.js",
    "content": "'use strict';(function(b){\"object\"==typeof exports&&\"object\"==typeof module?b(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],b):b(CodeMirror)})(function(b){b.defineMode(\"troff\",function(){function b(a){if(a.eatSpace())return null;var b=a.sol(),d=a.next();if(\"\\\\\"===d){if(a.match(\"fB\")||a.match(\"fR\")||a.match(\"fI\")||a.match(\"u\")||a.match(\"d\")||a.match(\"%\")||a.match(\"&\"))return\"string\";if(a.match(\"m[\"))return a.skipTo(\"]\"),a.next(),\"string\";if(a.match(\"s+\")||\na.match(\"s-\"))return a.eatWhile(/[\\d-]/),\"string\";(a.match(\"(\")||a.match(\"*(\"))&&a.eatWhile(/[\\w-]/);return\"string\"}if(b&&(\".\"===d||\"'\"===d)&&a.eat(\"\\\\\")&&a.eat('\"'))return a.skipToEnd(),\"comment\";if(b&&\".\"===d){if(a.match(\"B \")||a.match(\"I \")||a.match(\"R \"))return\"attribute\";if(a.match(\"TH \")||a.match(\"SH \")||a.match(\"SS \")||a.match(\"HP \"))return a.skipToEnd(),\"quote\";if(a.match(/[A-Z]/)&&a.match(/[A-Z]/)||a.match(/[a-z]/)&&a.match(/[a-z]/))return\"attribute\"}a.eatWhile(/[\\w-]/);a=a.current();return c.hasOwnProperty(a)?\nc[a]:null}var c={};return{startState:function(){return{tokens:[]}},token:function(a,c){return(c.tokens[0]||b)(a,c)}}});b.defineMIME(\"text/troff\",\"troff\");b.defineMIME(\"text/x-troff\",\"troff\");b.defineMIME(\"application/x-troff\",\"troff\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/ttcn/ttcn.js",
    "content": "'use strict';(function(h){\"object\"==typeof exports&&\"object\"==typeof module?h(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],h):h(CodeMirror)})(function(h){function a(a){var c={};a=a.split(\" \");for(var g=0;g<a.length;++g)c[a[g]]=!0;return c}h.defineMode(\"ttcn\",function(a,c){function g(b,f){var d=b.next();if('\"'==d||\"'\"==d)return f.tokenize=h(d),f.tokenize(b,f);if(/[\\[\\]{}\\(\\),;\\\\:\\?\\.]/.test(d))return e=d,\"punctuation\";if(\"#\"==d)return b.skipToEnd(),\n\"atom preprocessor\";if(\"%\"==d)return b.eatWhile(/\\b/),\"atom ttcn3Macros\";if(/\\d/.test(d))return b.eatWhile(/[\\w\\.]/),\"number\";if(\"/\"==d){if(b.eat(\"*\"))return f.tokenize=p,p(b,f);if(b.eat(\"/\"))return b.skipToEnd(),\"comment\"}if(q.test(d)){if(\"@\"==d&&(b.match(\"try\")||b.match(\"catch\")||b.match(\"lazy\")))return\"keyword\";b.eatWhile(q);return\"operator\"}b.eatWhile(/[\\w\\$_\\xa1-\\uffff]/);b=b.current();return t.propertyIsEnumerable(b)?\"keyword\":u.propertyIsEnumerable(b)?\"builtin\":v.propertyIsEnumerable(b)?\"def timerOps\":\nw.propertyIsEnumerable(b)?\"def configOps\":x.propertyIsEnumerable(b)?\"def verdictOps\":y.propertyIsEnumerable(b)?\"def portOps\":z.propertyIsEnumerable(b)?\"def sutOps\":A.propertyIsEnumerable(b)?\"def functionOps\":B.propertyIsEnumerable(b)?\"string verdictConsts\":C.propertyIsEnumerable(b)?\"string booleanConsts\":D.propertyIsEnumerable(b)?\"string otherConsts\":E.propertyIsEnumerable(b)?\"builtin types\":F.propertyIsEnumerable(b)?\"builtin visibilityModifiers\":G.propertyIsEnumerable(b)?\"atom templateMatch\":\"variable\"}\nfunction h(b){return function(f,d){for(var c=!1,a,e=!1;null!=(a=f.next());){if(a==b&&!c){if(a=f.peek())a=a.toLowerCase(),\"b\"!=a&&\"h\"!=a&&\"o\"!=a||f.next();e=!0;break}c=!c&&\"\\\\\"==a}if(e||!c&&!H)d.tokenize=null;return\"string\"}}function p(b,f){for(var d=!1,a;a=b.next();){if(\"/\"==a&&d){f.tokenize=null;break}d=\"*\"==a}return\"comment\"}function r(b,a,d,c,e){this.indented=b;this.column=a;this.type=d;this.align=c;this.prev=e}function l(b,a,d){var c=b.indented;b.context&&\"statement\"==b.context.type&&(c=b.context.indented);\nreturn b.context=new r(c,a,d,null,b.context)}function k(b){var a=b.context.type;if(\")\"==a||\"]\"==a||\"}\"==a)b.indented=b.context.indented;return b.context=b.context.prev}var I=a.indentUnit,t=c.keywords||{},u=c.builtin||{},v=c.timerOps||{},y=c.portOps||{},w=c.configOps||{},x=c.verdictOps||{},z=c.sutOps||{},A=c.functionOps||{},B=c.verdictConsts||{},C=c.booleanConsts||{},D=c.otherConsts||{},E=c.types||{},F=c.visibilityModifiers||{},G=c.templateMatch||{},H=c.multiLineStrings,J=!1!==c.indentStatements,q=\n/[+\\-*&@=<>!\\/]/,e;return{startState:function(b){return{tokenize:null,context:new r((b||0)-I,0,\"top\",!1),indented:0,startOfLine:!0}},token:function(b,a){var c=a.context;b.sol()&&(null==c.align&&(c.align=!1),a.indented=b.indentation(),a.startOfLine=!0);if(b.eatSpace())return null;e=null;var f=(a.tokenize||g)(b,a);if(\"comment\"==f)return f;null==c.align&&(c.align=!0);if(\";\"!=e&&\":\"!=e&&\",\"!=e||\"statement\"!=c.type)if(\"{\"==e)l(a,b.column(),\"}\");else if(\"[\"==e)l(a,b.column(),\"]\");else if(\"(\"==e)l(a,b.column(),\n\")\");else if(\"}\"==e){for(;\"statement\"==c.type;)c=k(a);for(\"}\"==c.type&&(c=k(a));\"statement\"==c.type;)c=k(a)}else e==c.type?k(a):J&&((\"}\"==c.type||\"top\"==c.type)&&\";\"!=e||\"statement\"==c.type&&\"newstatement\"==e)&&l(a,b.column(),\"statement\");else k(a);a.startOfLine=!1;return f},electricChars:\"{}\",blockCommentStart:\"/*\",blockCommentEnd:\"*/\",lineComment:\"//\",fold:\"brace\"}});(function(a,c){function g(a){if(a)for(var c in a)a.hasOwnProperty(c)&&m.push(c)}\"string\"==typeof a&&(a=[a]);var m=[];g(c.keywords);\ng(c.builtin);g(c.timerOps);g(c.portOps);m.length&&(c.helperType=a[0],h.registerHelper(\"hintWords\",a[0],m));for(var n=0;n<a.length;++n)h.defineMIME(a[n],c)})([\"text/x-ttcn\",\"text/x-ttcn3\",\"text/x-ttcnpp\"],{name:\"ttcn\",keywords:a(\"activate address alive all alt altstep and and4b any break case component const continue control deactivate display do else encode enumerated except exception execute extends extension external for from function goto group if import in infinity inout interleave label language length log match message mixed mod modifies module modulepar mtc noblock not not4b nowait of on optional or or4b out override param pattern port procedure record recursive rem repeat return runs select self sender set signature system template testcase to type union value valueof var variant while with xor xor4b\"),\nbuiltin:a(\"bit2hex bit2int bit2oct bit2str char2int char2oct encvalue decomp decvalue float2int float2str hex2bit hex2int hex2oct hex2str int2bit int2char int2float int2hex int2oct int2str int2unichar isbound ischosen ispresent isvalue lengthof log2str oct2bit oct2char oct2hex oct2int oct2str regexp replace rnd sizeof str2bit str2float str2hex str2int str2oct substr unichar2int unichar2char enum2int\"),types:a(\"anytype bitstring boolean char charstring default float hexstring integer objid octetstring universal verdicttype timer\"),\ntimerOps:a(\"read running start stop timeout\"),portOps:a(\"call catch check clear getcall getreply halt raise receive reply send trigger\"),configOps:a(\"create connect disconnect done kill killed map unmap\"),verdictOps:a(\"getverdict setverdict\"),sutOps:a(\"action\"),functionOps:a(\"apply derefers refers\"),verdictConsts:a(\"error fail inconc none pass\"),booleanConsts:a(\"true false\"),otherConsts:a(\"null NULL omit\"),visibilityModifiers:a(\"private public friend\"),templateMatch:a(\"complement ifpresent subset superset permutation\"),\nmultiLineStrings:!0})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/ttcn-cfg/ttcn-cfg.js",
    "content": "'use strict';(function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],e):e(CodeMirror)})(function(e){function g(e){var f={};e=e.split(\" \");for(var h=0;h<e.length;++h)f[e[h]]=!0;return f}e.defineMode(\"ttcn-cfg\",function(e,f){function h(a,b){var c=a.next();if('\"'==c||\"'\"==c)return b.tokenize=g(c),b.tokenize(a,b);if(/[:=]/.test(c))return d=c,\"punctuation\";if(\"#\"==c)return a.skipToEnd(),\"comment\";\nif(/\\d/.test(c))return a.eatWhile(/[\\w\\.]/),\"number\";if(m.test(c))return a.eatWhile(m),\"operator\";if(\"[\"==c)return a.eatWhile(/[\\w_\\]]/),\"number sectionTitle\";a.eatWhile(/[\\w\\$_]/);a=a.current();return p.propertyIsEnumerable(a)?\"keyword\":q.propertyIsEnumerable(a)?\"negative fileNCtrlMaskOptions\":r.propertyIsEnumerable(a)?\"negative externalCommands\":\"variable\"}function g(a){return function(b,c){for(var e=!1,d,f=!1;null!=(d=b.next());){if(d==a&&!e){if(d=b.peek())d=d.toLowerCase(),\"b\"!=d&&\"h\"!=d&&\"o\"!=\nd||b.next();f=!0;break}e=!e&&\"\\\\\"==d}if(f||!e&&!t)c.tokenize=null;return\"string\"}}function n(a,b,c,d,e){this.indented=a;this.column=b;this.type=c;this.align=d;this.prev=e}function l(a,b,c){var d=a.indented;a.context&&\"statement\"==a.context.type&&(d=a.context.indented);return a.context=new n(d,b,c,null,a.context)}function k(a){var b=a.context.type;if(\")\"==b||\"]\"==b||\"}\"==b)a.indented=a.context.indented;return a.context=a.context.prev}var u=e.indentUnit,p=f.keywords||{},q=f.fileNCtrlMaskOptions||{},\nr=f.externalCommands||{},t=f.multiLineStrings,v=!1!==f.indentStatements,m=/[\\|]/,d;return{startState:function(a){return{tokenize:null,context:new n((a||0)-u,0,\"top\",!1),indented:0,startOfLine:!0}},token:function(a,b){var c=b.context;a.sol()&&(null==c.align&&(c.align=!1),b.indented=a.indentation(),b.startOfLine=!0);if(a.eatSpace())return null;d=null;var e=(b.tokenize||h)(a,b);if(\"comment\"==e)return e;null==c.align&&(c.align=!0);if(\";\"!=d&&\":\"!=d&&\",\"!=d||\"statement\"!=c.type)if(\"{\"==d)l(b,a.column(),\n\"}\");else if(\"[\"==d)l(b,a.column(),\"]\");else if(\"(\"==d)l(b,a.column(),\")\");else if(\"}\"==d){for(;\"statement\"==c.type;)c=k(b);for(\"}\"==c.type&&(c=k(b));\"statement\"==c.type;)c=k(b)}else d==c.type?k(b):v&&((\"}\"==c.type||\"top\"==c.type)&&\";\"!=d||\"statement\"==c.type&&\"newstatement\"==d)&&l(b,a.column(),\"statement\");else k(b);b.startOfLine=!1;return e},electricChars:\"{}\",lineComment:\"#\",fold:\"brace\"}});e.defineMIME(\"text/x-ttcn-cfg\",{name:\"ttcn-cfg\",keywords:g(\"Yes No LogFile FileMask ConsoleMask AppendFile TimeStampFormat LogEventTypes SourceInfoFormat LogEntityName LogSourceInfo DiskFullAction LogFileNumber LogFileSize MatchingHints Detailed Compact SubCategories Stack Single None Seconds DateTime Time Stop Error Retry Delete TCPPort KillTimer NumHCs UnixSocketsEnabled LocalAddress\"),\nfileNCtrlMaskOptions:g(\"TTCN_EXECUTOR TTCN_ERROR TTCN_WARNING TTCN_PORTEVENT TTCN_TIMEROP TTCN_VERDICTOP TTCN_DEFAULTOP TTCN_TESTCASE TTCN_ACTION TTCN_USER TTCN_FUNCTION TTCN_STATISTICS TTCN_PARALLEL TTCN_MATCHING TTCN_DEBUG EXECUTOR ERROR WARNING PORTEVENT TIMEROP VERDICTOP DEFAULTOP TESTCASE ACTION USER FUNCTION STATISTICS PARALLEL MATCHING DEBUG LOG_ALL LOG_NOTHING ACTION_UNQUALIFIED DEBUG_ENCDEC DEBUG_TESTPORT DEBUG_UNQUALIFIED DEFAULTOP_ACTIVATE DEFAULTOP_DEACTIVATE DEFAULTOP_EXIT DEFAULTOP_UNQUALIFIED ERROR_UNQUALIFIED EXECUTOR_COMPONENT EXECUTOR_CONFIGDATA EXECUTOR_EXTCOMMAND EXECUTOR_LOGOPTIONS EXECUTOR_RUNTIME EXECUTOR_UNQUALIFIED FUNCTION_RND FUNCTION_UNQUALIFIED MATCHING_DONE MATCHING_MCSUCCESS MATCHING_MCUNSUCC MATCHING_MMSUCCESS MATCHING_MMUNSUCC MATCHING_PCSUCCESS MATCHING_PCUNSUCC MATCHING_PMSUCCESS MATCHING_PMUNSUCC MATCHING_PROBLEM MATCHING_TIMEOUT MATCHING_UNQUALIFIED PARALLEL_PORTCONN PARALLEL_PORTMAP PARALLEL_PTC PARALLEL_UNQUALIFIED PORTEVENT_DUALRECV PORTEVENT_DUALSEND PORTEVENT_MCRECV PORTEVENT_MCSEND PORTEVENT_MMRECV PORTEVENT_MMSEND PORTEVENT_MQUEUE PORTEVENT_PCIN PORTEVENT_PCOUT PORTEVENT_PMIN PORTEVENT_PMOUT PORTEVENT_PQUEUE PORTEVENT_STATE PORTEVENT_UNQUALIFIED STATISTICS_UNQUALIFIED STATISTICS_VERDICT TESTCASE_FINISH TESTCASE_START TESTCASE_UNQUALIFIED TIMEROP_GUARD TIMEROP_READ TIMEROP_START TIMEROP_STOP TIMEROP_TIMEOUT TIMEROP_UNQUALIFIED USER_UNQUALIFIED VERDICTOP_FINAL VERDICTOP_GETVERDICT VERDICTOP_SETVERDICT VERDICTOP_UNQUALIFIED WARNING_UNQUALIFIED\"),\nexternalCommands:g(\"BeginControlPart EndControlPart BeginTestCase EndTestCase\"),multiLineStrings:!0})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/turtle/turtle.js",
    "content": "'use strict';(function(d){\"object\"==typeof exports&&\"object\"==typeof module?d(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],d):d(CodeMirror)})(function(d){d.defineMode(\"turtle\",function(d){function h(a,b){var c=a.next();e=null;if(\"<\"!=c||a.match(/^[\\s\\u00a0=]/,!1)){if('\"'==c||\"'\"==c)return b.tokenize=l(c),b.tokenize(a,b);if(/[{}\\(\\),\\.;\\[\\]]/.test(c))return e=c,null;if(\"#\"==c)return a.skipToEnd(),\"comment\";if(k.test(c))return a.eatWhile(k),\nnull;if(\":\"==c)return\"operator\";a.eatWhile(/[_\\w\\d]/);if(\":\"==a.peek())return\"variable-3\";a=a.current();return m.test(a)?\"meta\":\"A\"<=c&&\"Z\">=c?\"comment\":\"keyword\"}a.match(/^[^\\s\\u00a0>]*>?/);return\"atom\"}function l(a){return function(b,c){for(var d=!1,e;null!=(e=b.next());){if(e==a&&!d){c.tokenize=h;break}d=!d&&\"\\\\\"==e}return\"string\"}}function f(a,b,c){a.context={prev:a.context,indent:a.indent,col:c,type:b}}function g(a){a.indent=a.context.indent;a.context=a.context.prev}var n=d.indentUnit,e,m=/^(?:@prefix|@base|a)$/i,\nk=/[*+\\-<>=&|]/;return{startState:function(){return{tokenize:h,context:null,indent:0,col:0}},token:function(a,b){a.sol()&&(b.context&&null==b.context.align&&(b.context.align=!1),b.indent=a.indentation());if(a.eatSpace())return null;var c=b.tokenize(a,b);\"comment\"!=c&&b.context&&null==b.context.align&&\"pattern\"!=b.context.type&&(b.context.align=!0);if(\"(\"==e)f(b,\")\",a.column());else if(\"[\"==e)f(b,\"]\",a.column());else if(\"{\"==e)f(b,\"}\",a.column());else if(/[\\]\\}\\)]/.test(e)){for(;b.context&&\"pattern\"==\nb.context.type;)g(b);b.context&&e==b.context.type&&g(b)}else\".\"==e&&b.context&&\"pattern\"==b.context.type?g(b):/atom|string|variable/.test(c)&&b.context&&(/[\\}\\]]/.test(b.context.type)?f(b,\"pattern\",a.column()):\"pattern\"!=b.context.type||b.context.align||(b.context.align=!0,b.context.col=a.column()));return c},indent:function(a,b){b=b&&b.charAt(0);a=a.context;if(/[\\]\\}]/.test(b))for(;a&&\"pattern\"==a.type;)a=a.prev;b=a&&b==a.type;return a?\"pattern\"==a.type?a.col:a.align?a.col+(b?0:1):a.indent+(b?0:\nn):0},lineComment:\"#\"}});d.defineMIME(\"text/turtle\",\"turtle\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/twig/twig.js",
    "content": "'use strict';(function(c){\"object\"==typeof exports&&\"object\"==typeof module?c(require(\"../../lib/codemirror\"),require(\"../../addon/mode/multiplex\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\",\"../../addon/mode/multiplex\"],c):c(CodeMirror)})(function(c){c.defineMode(\"twig:inner\",function(){function c(a,b){var c=a.peek();if(b.incomment)return a.skipTo(\"#}\")?(a.eatWhile(/\\#|}/),b.incomment=!1):a.skipToEnd(),\"comment\";if(b.intag){if(b.operator){b.operator=!1;if(a.match(e))return\"atom\";\nif(a.match(g))return\"number\"}if(b.sign){b.sign=!1;if(a.match(e))return\"atom\";if(a.match(g))return\"number\"}if(b.instring)return c==b.instring&&(b.instring=!1),a.next(),\"string\";if(\"'\"==c||'\"'==c)return b.instring=c,a.next(),\"string\";if(a.match(b.intag+\"}\")||a.eat(\"-\")&&a.match(b.intag+\"}\"))return b.intag=!1,\"tag\";if(a.match(f))return b.operator=!0,\"operator\";if(a.match(k))b.sign=!0;else if(a.eat(\" \")||a.sol()){if(a.match(d))return\"keyword\";if(a.match(e))return\"atom\";if(a.match(g))return\"number\";a.sol()&&\na.next()}else a.next();return\"variable\"}if(a.eat(\"{\")){if(a.eat(\"#\"))return b.incomment=!0,a.skipTo(\"#}\")?(a.eatWhile(/\\#|}/),b.incomment=!1):a.skipToEnd(),\"comment\";if(c=a.eat(/\\{|%/))return b.intag=c,\"{\"==c&&(b.intag=\"}\"),a.eat(\"-\"),\"tag\"}a.next()}var d=\"and as autoescape endautoescape block do endblock else elseif extends for endfor embed endembed filter endfilter flush from if endif in is include import not or set spaceless endspaceless with endwith trans endtrans blocktrans endblocktrans macro endmacro use verbatim endverbatim\".split(\" \"),\nf=/^[+\\-*&%=<>!?|~^]/,k=/^[:\\[\\(\\{]/,e=\"true;false;null;empty;defined;divisibleby;divisible by;even;odd;iterable;sameas;same as\".split(\";\"),g=/^(\\d[+\\-\\*\\/])?\\d+(\\.\\d+)?/,d=new RegExp(\"((\"+d.join(\")|(\")+\"))\\\\b\"),e=new RegExp(\"((\"+e.join(\")|(\")+\"))\\\\b\");return{startState:function(){return{}},token:function(a,b){return c(a,b)}}});c.defineMode(\"twig\",function(h,d){var f=c.getMode(h,\"twig:inner\");return d&&d.base?c.multiplexingMode(c.getMode(h,d.base),{open:/\\{[{#%]/,close:/[}#%]\\}/,mode:f,parseDelimiters:!0}):\nf});c.defineMIME(\"text/x-twig\",\"twig\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/vb/vb.js",
    "content": "'use strict';(function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],e):e(CodeMirror)})(function(e){e.defineMode(\"vb\",function(g,u){function d(a){return new RegExp(\"^((\"+a.join(\")|(\")+\"))\\\\b\",\"i\")}function f(a,b){if(a.eatSpace())return null;if(\"'\"===a.peek())return a.skipToEnd(),\"comment\";if(a.match(/^((&H)|(&O))?[0-9\\.a-f]/i,!1)){var c=!1;a.match(/^\\d*\\.\\d+F?/i)?c=!0:a.match(/^\\d+\\.\\d*F?/)?\nc=!0:a.match(/^\\.\\d+F?/)&&(c=!0);if(c)return a.eat(/J/i),\"number\";c=!1;a.match(/^&H[0-9a-f]+/i)?c=!0:a.match(/^&O[0-7]+/i)?c=!0:a.match(/^[1-9]\\d*F?/)?(a.eat(/J/i),c=!0):a.match(/^0(?![\\dx])/i)&&(c=!0);if(c)return a.eat(/L/i),\"number\"}if(a.match('\"'))return b.tokenize=v(a.current()),b.tokenize(a,b);if(a.match(w)||a.match(x))return null;if(a.match(y)||a.match(z)||a.match(A))return\"operator\";if(a.match(B))return null;if(a.match(C))return b.currentIndent++,b.doInCurrentLine=!0,\"keyword\";if(a.match(D))return b.doInCurrentLine?\nb.doInCurrentLine=!1:b.currentIndent++,\"keyword\";if(a.match(h))return\"keyword\";if(a.match(k))return b.currentIndent--,b.currentIndent--,\"keyword\";if(a.match(l))return b.currentIndent--,\"keyword\";if(a.match(E)||a.match(F))return\"keyword\";if(a.match(G))return\"variable\";a.next();return\"error\"}function v(a){var b=1==a.length;return function(c,d){for(;!c.eol();){c.eatWhile(/[^'\"]/);if(c.match(a))return d.tokenize=f,\"string\";c.eat(/['\"]/)}if(b){if(u.singleLineStringErrors)return\"error\";d.tokenize=f}return\"string\"}}\nvar z=/^[\\+\\-\\*/%&\\\\|\\^~<>!]/,B=/^[\\(\\)\\[\\]\\{\\}@,:`=;\\.]/,y=/^((==)|(<>)|(<=)|(>=)|(<>)|(<<)|(>>)|(\\/\\/)|(\\*\\*))/,x=/^((\\+=)|(\\-=)|(\\*=)|(%=)|(\\/=)|(&=)|(\\|=)|(\\^=))/,w=/^((\\/\\/=)|(>>=)|(<<=)|(\\*\\*=))/,G=/^[_A-Za-z][_A-Za-z0-9]*/,m=\"class module sub enum select while if function get set property try\".split(\" \"),n=[\"else\",\"elseif\",\"case\",\"catch\"],p=[\"next\",\"loop\"],q=[\"and\",\"or\",\"not\",\"xor\",\"in\"],A=d(q),r=\"as dim break continue optional then until goto byval byref new handles property return const private protected friend public shared static true false\".split(\" \"),\nt=\"integer string double decimal boolean short char float single\".split(\" \"),F=d(r),E=d(t),D=d(m),h=d(n),l=d(p),k=d([\"end\"]),C=d([\"do\"]);e.registerHelper(\"hintWords\",\"vb\",m.concat(n).concat(p).concat(q).concat(r).concat(t));return{electricChars:\"dDpPtTfFeE \",startState:function(){return{tokenize:f,lastToken:null,currentIndent:0,nextLineIndent:0,doInCurrentLine:!1}},token:function(a,b){a.sol()&&(b.currentIndent+=b.nextLineIndent,b.nextLineIndent=0,b.doInCurrentLine=0);var c;c=b.tokenize(a,b);var d=\na.current();if(\".\"===d)c=b.tokenize(a,b),a.current(),c=\"variable\"===c?\"variable\":\"error\";else{var e=\"[({\".indexOf(d);-1!==e&&b.currentIndent++;e=\"])}\".indexOf(d);-1!==e&&b.currentIndent--}b.lastToken={style:c,content:a.current()};return c},indent:function(a,b){b=b.replace(/^\\s+|\\s+$/g,\"\");return b.match(l)||b.match(k)||b.match(h)?g.indentUnit*(a.currentIndent-1):0>a.currentIndent?0:a.currentIndent*g.indentUnit},lineComment:\"'\"}});e.defineMIME(\"text/x-vb\",\"vb\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/vbscript/vbscript.js",
    "content": "'use strict';(function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],e):e(CodeMirror)})(function(e){e.defineMode(\"vbscript\",function(e,n){function d(a){return new RegExp(\"^((\"+a.join(\")|(\")+\"))\\\\b\",\"i\")}function h(a,b){if(a.eatSpace())return\"space\";if(\"'\"===a.peek()||a.match(p))return a.skipToEnd(),\"comment\";if(a.match(/^((&H)|(&O))?[0-9\\.]/i,!1)&&!a.match(/^((&H)|(&O))?[0-9\\.]+[a-z_]/i,\n!1)){var c=!1;a.match(/^\\d*\\.\\d+/i)?c=!0:a.match(/^\\d+\\.\\d*/)?c=!0:a.match(/^\\.\\d+/)&&(c=!0);if(c)return a.eat(/J/i),\"number\";c=!1;a.match(/^&H[0-9a-f]+/i)?c=!0:a.match(/^&O[0-7]+/i)?c=!0:a.match(/^[1-9]\\d*F?/)?(a.eat(/J/i),c=!0):a.match(/^0(?![\\dx])/i)&&(c=!0);if(c)return a.eat(/L/i),\"number\"}if(a.match('\"'))return b.tokenize=q(a.current()),b.tokenize(a,b);if(a.match(r)||a.match(t)||a.match(u))return\"operator\";if(a.match(v))return null;if(a.match(w))return\"bracket\";if(a.match(x))return b.doInCurrentLine=\n!0,\"keyword\";if(a.match(y))return b.currentIndent++,b.doInCurrentLine=!0,\"keyword\";if(a.match(z))return b.doInCurrentLine?b.doInCurrentLine=!1:b.currentIndent++,\"keyword\";if(a.match(k))return\"keyword\";if(a.match(l))return b.currentIndent--,b.currentIndent--,\"keyword\";if(a.match(m))return b.doInCurrentLine?b.doInCurrentLine=!1:b.currentIndent--,\"keyword\";if(a.match(A))return\"keyword\";if(a.match(B))return\"atom\";if(a.match(C))return\"variable-2\";if(a.match(D))return\"builtin\";if(a.match(E))return\"variable-2\";\nif(a.match(F))return\"variable\";a.next();return\"error\"}function q(a){var b=1==a.length;return function(c,d){for(;!c.eol();){c.eatWhile(/[^'\"]/);if(c.match(a))return d.tokenize=h,\"string\";c.eat(/['\"]/)}if(b){if(n.singleLineStringErrors)return\"error\";d.tokenize=h}return\"string\"}}var t=/^[\\+\\-\\*/&\\\\\\^<>=]/,r=/^((<>)|(<=)|(>=))/,v=/^[\\.,]/,w=/^[\\(\\)]/,F=/^[A-Za-z][_A-Za-z0-9]*/,u=d(\"and or not xor is mod eqv imp\".split(\" \")),f=[\"WScript\",\"err\",\"debug\",\"RegExp\"],G=[\"server\",\"response\",\"request\",\"session\",\n\"application\"],H=\"buffer cachecontrol charset contenttype expires expiresabsolute isclientconnected pics status clientcertificate cookies form querystring servervariables totalbytes contents staticobjects codepage lcid sessionid timeout scripttimeout\".split(\" \"),I=\"addheader appendtolog binarywrite end flush redirect binaryread remove removeall lock unlock abandon getlasterror htmlencode mappath transfer urlencode\".split(\" \"),g=\"clear execute raise replace test write writeline close open state eof update addnew end createobject quit\".split(\" \").concat(\"description firstindex global helpcontext helpfile ignorecase length number pattern source value count\".split(\" \")),\nf=f.concat(\"vbBlack vbRed vbGreen vbYellow vbBlue vbMagenta vbCyan vbWhite vbBinaryCompare vbTextCompare vbSunday vbMonday vbTuesday vbWednesday vbThursday vbFriday vbSaturday vbUseSystemDayOfWeek vbFirstJan1 vbFirstFourDays vbFirstFullWeek vbGeneralDate vbLongDate vbShortDate vbLongTime vbShortTime vbObjectError vbOKOnly vbOKCancel vbAbortRetryIgnore vbYesNoCancel vbYesNo vbRetryCancel vbCritical vbQuestion vbExclamation vbInformation vbDefaultButton1 vbDefaultButton2 vbDefaultButton3 vbDefaultButton4 vbApplicationModal vbSystemModal vbOK vbCancel vbAbort vbRetry vbIgnore vbYes vbNo vbCr VbCrLf vbFormFeed vbLf vbNewLine vbNullChar vbNullString vbTab vbVerticalTab vbUseDefault vbTrue vbFalse vbEmpty vbNull vbInteger vbLong vbSingle vbDouble vbCurrency vbDate vbString vbObject vbError vbBoolean vbVariant vbDataObject vbDecimal vbByte vbArray\".split(\" \"));\ne.isASP&&(f=f.concat(G),g=g.concat(I,H));var A=d(\"dim;redim;then;until;randomize;byval;byref;new;property;exit;in;const;private;public;get;set;let;stop;on error resume next;on error goto 0;option explicit;call;me\".split(\";\")),B=d([\"true\",\"false\",\"nothing\",\"empty\",\"null\"]),D=d(\"abs array asc atn cbool cbyte ccur cdate cdbl chr cint clng cos csng cstr date dateadd datediff datepart dateserial datevalue day escape eval execute exp filter formatcurrency formatdatetime formatnumber formatpercent getlocale getobject getref hex hour inputbox instr instrrev int fix isarray isdate isempty isnull isnumeric isobject join lbound lcase left len loadpicture log ltrim rtrim trim maths mid minute month monthname msgbox now oct replace rgb right rnd round scriptengine scriptenginebuildversion scriptenginemajorversion scriptengineminorversion second setlocale sgn sin space split sqr strcomp string strreverse tan time timer timeserial timevalue typename ubound ucase unescape vartype weekday weekdayname year\".split(\" \")),\nE=d(f),C=d(g),z=d(\"class sub select while if function property with for\".split(\" \")),k=d([\"else\",\"elseif\",\"case\"]),m=d([\"next\",\"loop\",\"wend\"]),l=d([\"end\"]),y=d([\"do\"]),x=d([\"on error resume next\",\"exit\"]),p=d([\"rem\"]);return{electricChars:\"dDpPtTfFeE \",startState:function(){return{tokenize:h,lastToken:null,currentIndent:0,nextLineIndent:0,doInCurrentLine:!1,ignoreKeyword:!1}},token:function(a,b){a.sol()&&(b.currentIndent+=b.nextLineIndent,b.nextLineIndent=0,b.doInCurrentLine=0);var c;c=b.tokenize(a,\nb);var d=a.current();if(\".\"===d)if(c=b.tokenize(a,b),d=a.current(),!c||\"variable\"!==c.substr(0,8)&&\"builtin\"!==c&&\"keyword\"!==c)c=\"error\";else{if(\"builtin\"===c||\"keyword\"===c)c=\"variable\";-1<g.indexOf(d.substr(1))&&(c=\"variable-2\")}b.lastToken={style:c,content:a.current()};\"space\"===c&&(c=null);return c},indent:function(a,b){b=b.replace(/^\\s+|\\s+$/g,\"\");return b.match(m)||b.match(l)||b.match(k)?e.indentUnit*(a.currentIndent-1):0>a.currentIndent?0:a.currentIndent*e.indentUnit}}});e.defineMIME(\"text/vbscript\",\n\"vbscript\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/velocity/velocity.js",
    "content": "'use strict';(function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],e):e(CodeMirror)})(function(e){e.defineMode(\"velocity\",function(){function e(b){var a={};b=b.split(\" \");for(var d=0;d<b.length;++d)a[b[d]]=!0;return a}function f(b,a,d){a.tokenize=d;return d(b,a)}function g(b,a){var d=a.beforeParams;a.beforeParams=!1;var c=b.next();if(\"'\"==c&&!a.inString&&a.inParams)return a.lastTokenWasBuiltin=\n!1,f(b,a,k(c));if('\"'==c){a.lastTokenWasBuiltin=!1;if(a.inString)return a.inString=!1,\"string\";if(a.inParams)return f(b,a,k(c))}else{if(/[\\[\\]{}\\(\\),;\\.]/.test(c))return\"(\"==c&&d?a.inParams=!0:\")\"==c&&(a.inParams=!1,a.lastTokenWasBuiltin=!0),null;if(/\\d/.test(c))return a.lastTokenWasBuiltin=!1,b.eatWhile(/[\\w\\.]/),\"number\";if(\"#\"==c&&b.eat(\"*\"))return a.lastTokenWasBuiltin=!1,f(b,a,p);if(\"#\"==c&&b.match(/ *\\[ *\\[/))return a.lastTokenWasBuiltin=!1,f(b,a,q);if(\"#\"==c&&b.eat(\"#\"))return a.lastTokenWasBuiltin=\n!1,b.skipToEnd(),\"comment\";if(\"$\"==c){b.eatWhile(/[\\w\\d\\$_\\.{}]/);if(l&&l.propertyIsEnumerable(b.current()))return\"keyword\";a.lastTokenWasBuiltin=!0;a.beforeParams=!0;return\"builtin\"}if(m.test(c))return a.lastTokenWasBuiltin=!1,b.eatWhile(m),\"operator\";b.eatWhile(/[\\w\\$_{}@]/);d=b.current();if(n&&n.propertyIsEnumerable(d))return\"keyword\";if(h&&h.propertyIsEnumerable(d)||b.current().match(/^#@?[a-z0-9_]+ *$/i)&&\"(\"==b.peek()&&(!h||!h.propertyIsEnumerable(d.toLowerCase())))return a.beforeParams=!0,\na.lastTokenWasBuiltin=!1,\"keyword\";if(a.inString)return a.lastTokenWasBuiltin=!1,\"string\";if(b.pos>d.length&&\".\"==b.string.charAt(b.pos-d.length-1)&&a.lastTokenWasBuiltin)return\"builtin\";a.lastTokenWasBuiltin=!1;return null}}function k(b){return function(a,d){for(var c=!1,e,f=!1;null!=(e=a.next());){if(e==b&&!c){f=!0;break}if('\"'==b&&\"$\"==a.peek()&&!c){f=d.inString=!0;break}c=!c&&\"\\\\\"==e}f&&(d.tokenize=g);return\"string\"}}function p(b,a){for(var d=!1,c;c=b.next();){if(\"#\"==c&&d){a.tokenize=g;break}d=\n\"*\"==c}return\"comment\"}function q(b,a){for(var d=0,c;c=b.next();){if(\"#\"==c&&2==d){a.tokenize=g;break}\"]\"==c?d++:\" \"!=c&&(d=0)}return\"meta\"}var n=e(\"#end #else #break #stop #[[ #]] #{end} #{else} #{break} #{stop}\"),h=e(\"#if #elseif #foreach #set #include #parse #macro #define #evaluate #{if} #{elseif} #{foreach} #{set} #{include} #{parse} #{macro} #{define} #{evaluate}\"),l=e(\"$foreach.count $foreach.hasNext $foreach.first $foreach.last $foreach.topmost $foreach.parent.count $foreach.parent.hasNext $foreach.parent.first $foreach.parent.last $foreach.parent $velocityCount $!bodyContent $bodyContent\"),\nm=/[+\\-*&%=<>!?:\\/|]/;return{startState:function(){return{tokenize:g,beforeParams:!1,inParams:!1,inString:!1,lastTokenWasBuiltin:!1}},token:function(b,a){return b.eatSpace()?null:a.tokenize(b,a)},blockCommentStart:\"#*\",blockCommentEnd:\"*#\",lineComment:\"##\",fold:\"velocity\"}});e.defineMIME(\"text/velocity\",\"velocity\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/verilog/verilog.js",
    "content": "'use strict';(function(l){\"object\"==typeof exports&&\"object\"==typeof module?l(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],l):l(CodeMirror)})(function(l){function t(b,a){var d=0;b=b.indentation();switch(a.tlvCurCtlFlowChar){case \"\\\\\":b=0;break;case \"|\":if(\"@\"==a.tlvPrevPrevCtlFlowChar){d=-2;break}n[a.tlvPrevCtlFlowChar]&&(d=1);break;case \"M\":if(\"@\"==a.tlvPrevPrevCtlFlowChar){d=-2;break}n[a.tlvPrevCtlFlowChar]&&(d=1);break;case \"@\":\"S\"==a.tlvPrevCtlFlowChar&&\n(d=-1);\"|\"==a.tlvPrevCtlFlowChar&&(d=1);break;case \"S\":\"@\"==a.tlvPrevCtlFlowChar&&(d=1),n[a.tlvPrevCtlFlowChar]&&(d=1)}a=b+2*d;return 0<=a?a:b}l.defineMode(\"verilog\",function(b,a){function d(c){var a={};c=c.split(\" \");for(var e=0;e<c.length;++e)a[c[e]]=!0;return a}function g(c,a){var e=c.peek(),b;if(m[e]&&0!=(b=m[e](c,a))||m.tokenBase&&0!=(b=m.tokenBase(c,a)))return b;if(/[,;:\\.]/.test(e))return k=c.next(),null;if(A.test(e))return k=c.next(),\"bracket\";if(\"`\"==e)return c.next(),c.eatWhile(/[\\w\\$_]/)?\n\"def\":null;if(\"$\"==e)return c.next(),c.eatWhile(/[\\w\\$_]/)?\"meta\":null;if(\"#\"==e)return c.next(),c.eatWhile(/[\\d_.]/),\"def\";if('\"'==e)return c.next(),a.tokenize=n(e),a.tokenize(c,a);if(\"/\"==e){c.next();if(c.eat(\"*\"))return a.tokenize=f,f(c,a);if(c.eat(\"/\"))return c.skipToEnd(),\"comment\";c.backUp(1)}if(c.match(y)||c.match(B)||c.match(C)||c.match(D)||c.match(E)||c.match(F)||c.match(y))return\"number\";if(c.eatWhile(G))return\"meta\";if(c.eatWhile(/[\\w\\$_]/))return c=c.current(),H[c]?(h[c]&&(k=\"newblock\"),\nI[c]&&(k=\"newstatement\"),p=c,\"keyword\"):\"variable\";c.next();return null}function n(c){return function(a,b){for(var e=!1,v,d=!1;null!=(v=a.next());){if(v==c&&!e){d=!0;break}e=!e&&\"\\\\\"==v}if(d||!e&&!J)b.tokenize=g;return\"string\"}}function f(c,a){for(var e=!1,b;b=c.next();){if(\"/\"==b&&e){a.tokenize=g;break}e=\"*\"==b}return\"comment\"}function u(c,a,b,d,f){this.indented=c;this.column=a;this.type=b;this.align=d;this.prev=f}function q(c,a,b){a=new u(c.indented,a,b,null,c.context);return c.context=a}function w(c){var a=\nc.context.type;if(\")\"==a||\"]\"==a||\"}\"==a)c.indented=c.context.indented;return c.context=c.context.prev}function t(c,a){if(c==a)return!0;a=a.split(\";\");for(var b in a)if(c==a[b])return!0;return!1}var x=b.indentUnit,z=a.statementIndentUnit||x,K=a.dontAlignCalls;b=a.noIndentKeywords||[];var J=a.multiLineStrings,m=a.hooks||{},H=d(\"accept_on alias always always_comb always_ff always_latch and assert assign assume automatic before begin bind bins binsof bit break buf bufif0 bufif1 byte case casex casez cell chandle checker class clocking cmos config const constraint context continue cover covergroup coverpoint cross deassign default defparam design disable dist do edge else end endcase endchecker endclass endclocking endconfig endfunction endgenerate endgroup endinterface endmodule endpackage endprimitive endprogram endproperty endspecify endsequence endtable endtask enum event eventually expect export extends extern final first_match for force foreach forever fork forkjoin function generate genvar global highz0 highz1 if iff ifnone ignore_bins illegal_bins implements implies import incdir include initial inout input inside instance int integer interconnect interface intersect join join_any join_none large let liblist library local localparam logic longint macromodule matches medium modport module nand negedge nettype new nexttime nmos nor noshowcancelled not notif0 notif1 null or output package packed parameter pmos posedge primitive priority program property protected pull0 pull1 pulldown pullup pulsestyle_ondetect pulsestyle_onevent pure rand randc randcase randsequence rcmos real realtime ref reg reject_on release repeat restrict return rnmos rpmos rtran rtranif0 rtranif1 s_always s_eventually s_nexttime s_until s_until_with scalared sequence shortint shortreal showcancelled signed small soft solve specify specparam static string strong strong0 strong1 struct super supply0 supply1 sync_accept_on sync_reject_on table tagged task this throughout time timeprecision timeunit tran tranif0 tranif1 tri tri0 tri1 triand trior trireg type typedef union unique unique0 unsigned until until_with untyped use uwire var vectored virtual void wait wait_order wand weak weak0 weak1 while wildcard wire with within wor xnor xor\"),\nG=/[\\+\\-\\*\\/!~&|^%=?:]/,A=/[\\[\\]{}()]/,F=/\\d[0-9_]*/,B=/\\d*\\s*'s?d\\s*\\d[0-9_]*/i,C=/\\d*\\s*'s?b\\s*[xz01][xz01_]*/i,D=/\\d*\\s*'s?o\\s*[xz0-7][xz0-7_]*/i,E=/\\d*\\s*'s?h\\s*[0-9a-fxz?][0-9a-fxz?_]*/i,y=/(\\d[\\d_]*(\\.\\d[\\d_]*)?E-?[\\d_]+)|(\\d[\\d_]*\\.\\d[\\d_]*)/i,L=/^((\\w+)|[)}\\]])/,M=/[)}\\]]/,k,p;a=d(\"case checker class clocking config function generate interface module packageprimitive program property specify sequence table task\");var h={},r;for(r in a)h[r]=\"end\"+r;h.begin=\"end\";h.casex=\"endcase\";h.casez=\"endcase\";\nh[\"do\"]=\"while\";h.fork=\"join;join_any;join_none\";h.covergroup=\"endgroup\";for(var N in b)r=b[N],h[r]&&(h[r]=void 0);var I=d(\"always always_comb always_ff always_latch assert assign assume else export for foreach forever if import initial repeat while\");return{electricInput:function(){var c=[],a;for(a in h)if(h[a]){var b=h[a].split(\";\"),d;for(d in b)c.push(b[d])}return new RegExp(\"[{}()\\\\[\\\\]]|(\"+c.join(\"|\")+\")$\")}(),startState:function(c){c={tokenize:null,context:new u((c||0)-x,0,\"top\",!1),indented:0,\nstartOfLine:!0};m.startState&&m.startState(c);return c},token:function(c,a){var b=a.context;c.sol()&&(null==b.align&&(b.align=!1),a.indented=c.indentation(),a.startOfLine=!0);m.token&&m.token(c,a);if(c.eatSpace())return null;p=k=null;var d=(a.tokenize||g)(c,a);if(\"comment\"==d||\"meta\"==d||\"variable\"==d)return d;null==b.align&&(b.align=!0);if(k==b.type)w(a);else if(\";\"==k&&\"statement\"==b.type||b.type&&t(p,b.type))for(b=w(a);b&&\"statement\"==b.type;)b=w(a);else\"{\"==k?q(a,c.column(),\"}\"):\"[\"==k?q(a,c.column(),\n\"]\"):\"(\"==k?q(a,c.column(),\")\"):b&&\"endcase\"==b.type&&\":\"==k?q(a,c.column(),\"statement\"):\"newstatement\"==k?q(a,c.column(),\"statement\"):\"newblock\"!=k||\"function\"==p&&b&&(\"statement\"==b.type||\"endgroup\"==b.type)||\"task\"==p&&b&&\"statement\"==b.type||(b=h[p],q(a,c.column(),b));a.startOfLine=!1;return d},indent:function(a,b){if(a.tokenize!=g&&null!=a.tokenize)return l.Pass;if(m.indent){var c=m.indent(a);if(0<=c)return c}a=a.context;c=b&&b.charAt(0);\"statement\"==a.type&&\"}\"==c&&(a=a.prev);var d=!1;(b=b.match(L))&&\n(d=t(b[0],a.type));return\"statement\"==a.type?a.indented+(\"{\"==c?0:z):M.test(a.type)&&a.align&&!K?a.column+(d?0:1):\")\"!=a.type||d?a.indented+(d?0:x):a.indented+z},blockCommentStart:\"/*\",blockCommentEnd:\"*/\",lineComment:\"//\"}});l.defineMIME(\"text/x-verilog\",{name:\"verilog\"});l.defineMIME(\"text/x-systemverilog\",{name:\"verilog\"});var n={\">\":\"property\",\"->\":\"property\",\"-\":\"hr\",\"|\":\"link\",\"?$\":\"qualifier\",\"?*\":\"qualifier\",\"@-\":\"variable-3\",\"@\":\"variable-3\",\"?\":\"qualifier\"};l.defineMIME(\"text/x-tlv\",{name:\"verilog\",\nhooks:{\"\\\\\":function(b,a){var d=0,g=!1;if(b.sol()&&(/\\\\SV/.test(b.string)||/\\\\TLV/.test(b.string))){g=/\\\\TLV_version/.test(b.string)?\"\\\\TLV_version\":b.string;b.skipToEnd();\"\\\\SV\"==g&&a.vxCodeActive&&(a.vxCodeActive=!1);if(/\\\\TLV/.test(g)&&!a.vxCodeActive||\"\\\\TLV_version\"==g&&a.vxCodeActive)a.vxCodeActive=!0;g=\"keyword\";a.tlvCurCtlFlowChar=a.tlvPrevPrevCtlFlowChar=a.tlvPrevCtlFlowChar=\"\";1==a.vxCodeActive&&(a.tlvCurCtlFlowChar=\"\\\\\",d=t(b,a));a.vxIndentRq=d}return g},tokenBase:function(b,a){var d=!1,\ng=/[\\[\\]=:]/,l={\"**\":\"variable-2\",\"*\":\"variable-2\",$$:\"variable\",$:\"variable\",\"^^\":\"attribute\",\"^\":\"attribute\"},f=b.peek(),u=a.tlvCurCtlFlowChar;if(1==a.vxCodeActive){if(/[\\[\\]{}\\(\\);\\:]/.test(f))d=\"meta\",b.next();else if(\"/\"==f)b.next(),b.eat(\"/\")?(b.skipToEnd(),d=\"comment\",a.tlvCurCtlFlowChar=\"S\"):b.backUp(1);else if(\"@\"==f)d=n[f],a.tlvCurCtlFlowChar=\"@\",b.next(),b.eatWhile(/[\\w\\$_]/);else if(b.match(/\\b[mM]4+/,!0))b.skipTo(\"(\"),d=\"def\",a.tlvCurCtlFlowChar=\"M\";else if(\"!\"==f&&b.sol())d=\"comment\",\nb.next();else if(g.test(f))b.eatWhile(g),d=\"operator\";else if(\"#\"==f)a.tlvCurCtlFlowChar=\"\"==a.tlvCurCtlFlowChar?f:a.tlvCurCtlFlowChar,b.next(),b.eatWhile(/[+-]\\d/),d=\"tag\";else if(l.propertyIsEnumerable(f))d=l[f],a.tlvCurCtlFlowChar=\"\"==a.tlvCurCtlFlowChar?\"S\":a.tlvCurCtlFlowChar,b.next(),b.match(/[a-zA-Z_0-9]+/);else if(d=n[f]||!1)a.tlvCurCtlFlowChar=\"\"==a.tlvCurCtlFlowChar?f:a.tlvCurCtlFlowChar,b.next(),b.match(/[a-zA-Z_0-9]+/);a.tlvCurCtlFlowChar!=u&&(b=t(b,a),a.vxIndentRq=b)}return d},token:function(b,\na){1==a.vxCodeActive&&b.sol()&&\"\"!=a.tlvCurCtlFlowChar&&(a.tlvPrevPrevCtlFlowChar=a.tlvPrevCtlFlowChar,a.tlvPrevCtlFlowChar=a.tlvCurCtlFlowChar,a.tlvCurCtlFlowChar=\"\")},indent:function(b){return 1==b.vxCodeActive?b.vxIndentRq:-1},startState:function(b){b.tlvCurCtlFlowChar=\"\";b.tlvPrevCtlFlowChar=\"\";b.tlvPrevPrevCtlFlowChar=\"\";b.vxCodeActive=!0;b.vxIndentRq=0}}})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/vhdl/vhdl.js",
    "content": "'use strict';(function(d){\"object\"==typeof exports&&\"object\"==typeof module?d(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],d):d(CodeMirror)})(function(d){function l(e){var k={};e=e.split(\",\");for(var g=0;g<e.length;++g){var d=e[g].toUpperCase(),l=e[g].charAt(0).toUpperCase()+e[g].slice(1);k[e[g]]=!0;k[d]=!0;k[l]=!0}return k}function q(e){e.eatWhile(/[\\w\\$_]/);return\"meta\"}d.defineMode(\"vhdl\",function(e,d){function g(a,b){var c=a.next();if(r[c]){var f=\nr[c](a,b);if(!1!==f)return f}if('\"'==c)return b.tokenize=w(c),b.tokenize(a,b);if(\"'\"==c)return b.tokenize=k(c),b.tokenize(a,b);if(/[\\[\\]{}\\(\\),;\\:\\.]/.test(c))return h=c,null;if(/[\\d']/.test(c))return a.eatWhile(/[\\w\\.']/),\"number\";if(\"-\"==c&&a.eat(\"-\"))return a.skipToEnd(),\"comment\";if(t.test(c))return a.eatWhile(t),\"operator\";a.eatWhile(/[\\w\\$_]/);a=a.current();return x.propertyIsEnumerable(a.toLowerCase())?(y.propertyIsEnumerable(a)&&(h=\"newstatement\"),\"keyword\"):z.propertyIsEnumerable(a)?\"atom\":\n\"variable\"}function k(a){return function(b,c){for(var f=!1,d,e=!1;null!=(d=b.next());){if(d==a&&!f){e=!0;break}f=!f&&\"--\"==d}if(e||!f&&!u)c.tokenize=g;return\"string\"}}function w(a){return function(b,c){for(var f=!1,d,e=!1;null!=(d=b.next());){if(d==a&&!f){e=!0;break}f=!f&&\"--\"==d}if(e||!f&&!u)c.tokenize=g;return\"string-2\"}}function v(a,b,c,d,e){this.indented=a;this.column=b;this.type=c;this.align=d;this.prev=e}function n(a,b,c){return a.context=new v(a.indented,b,c,null,a.context)}function m(a){var b=\na.context.type;if(\")\"==b||\"]\"==b||\"}\"==b)a.indented=a.context.indented;return a.context=a.context.prev}var p=e.indentUnit,z=d.atoms||l(\"null\"),r=d.hooks||{\"`\":q,$:q},u=d.multiLineStrings,x=l(\"abs,access,after,alias,all,and,architecture,array,assert,attribute,begin,block,body,buffer,bus,case,component,configuration,constant,disconnect,downto,else,elsif,end,end block,end case,end component,end for,end generate,end if,end loop,end process,end record,end units,entity,exit,file,for,function,generate,generic,generic map,group,guarded,if,impure,in,inertial,inout,is,label,library,linkage,literal,loop,map,mod,nand,new,next,nor,null,of,on,open,or,others,out,package,package body,port,port map,postponed,procedure,process,pure,range,record,register,reject,rem,report,return,rol,ror,select,severity,signal,sla,sll,sra,srl,subtype,then,to,transport,type,unaffected,units,until,use,variable,wait,when,while,with,xnor,xor\"),\ny=l(\"architecture,entity,begin,case,port,else,elsif,end,for,function,if\"),t=/[&|~><!\\)\\(*#%@+\\/=?\\:;}{,\\.\\^\\-\\[\\]]/,h;return{startState:function(a){return{tokenize:null,context:new v((a||0)-p,0,\"top\",!1),indented:0,startOfLine:!0}},token:function(a,b){var c=b.context;a.sol()&&(null==c.align&&(c.align=!1),b.indented=a.indentation(),b.startOfLine=!0);if(a.eatSpace())return null;h=null;var d=(b.tokenize||g)(a,b);if(\"comment\"==d||\"meta\"==d)return d;null==c.align&&(c.align=!0);if(\";\"!=h&&\":\"!=h||\"statement\"!=\nc.type)if(\"{\"==h)n(b,a.column(),\"}\");else if(\"[\"==h)n(b,a.column(),\"]\");else if(\"(\"==h)n(b,a.column(),\")\");else if(\"}\"==h){for(;\"statement\"==c.type;)c=m(b);for(\"}\"==c.type&&(c=m(b));\"statement\"==c.type;)c=m(b)}else h==c.type?m(b):(\"}\"==c.type||\"top\"==c.type||\"statement\"==c.type&&\"newstatement\"==h)&&n(b,a.column(),\"statement\");else m(b);b.startOfLine=!1;return d},indent:function(a,b){if(a.tokenize!=g&&null!=a.tokenize)return 0;b=b&&b.charAt(0);a=a.context;var c=b==a.type;return\"statement\"==a.type?\na.indented+(\"{\"==b?0:p):a.align?a.column+(c?0:1):a.indented+(c?0:p)},electricChars:\"{}\"}});d.defineMIME(\"text/x-vhdl\",\"vhdl\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/vue/vue.js",
    "content": "'use strict';(function(a){\"object\"===typeof exports&&\"object\"===typeof module?a(require(\"../../lib/codemirror\"),require(\"../../addon/mode/overlay\"),require(\"../xml/xml\"),require(\"../javascript/javascript\"),require(\"../coffeescript/coffeescript\"),require(\"../css/css\"),require(\"../sass/sass\"),require(\"../stylus/stylus\"),require(\"../pug/pug\"),require(\"../handlebars/handlebars\")):\"function\"===typeof define&&define.amd?define(\"../../lib/codemirror ../../addon/mode/overlay ../xml/xml ../javascript/javascript ../coffeescript/coffeescript ../css/css ../sass/sass ../stylus/stylus ../pug/pug ../handlebars/handlebars\".split(\" \"),\na):a(CodeMirror)})(function(a){var b={script:[[\"lang\",/coffee(script)?/,\"coffeescript\"],[\"type\",/^(?:text|application)\\/(?:x-)?coffee(?:script)?$/,\"coffeescript\"]],style:[[\"lang\",/^stylus$/i,\"stylus\"],[\"lang\",/^sass$/i,\"sass\"],[\"type\",/^(text\\/)?(x-)?styl(us)?$/i,\"stylus\"],[\"type\",/^text\\/sass/i,\"sass\"]],template:[[\"lang\",/^vue-template$/i,\"vue\"],[\"lang\",/^pug$/i,\"pug\"],[\"lang\",/^handlebars$/i,\"handlebars\"],[\"type\",/^(text\\/)?(x-)?pug$/i,\"pug\"],[\"type\",/^text\\/x-handlebars-template$/i,\"handlebars\"],\n[null,null,\"vue-template\"]]};a.defineMode(\"vue-template\",function(c,b){return a.overlayMode(a.getMode(c,b.backdrop||\"text/html\"),{token:function(a){if(a.match(/^\\{\\{.*?\\}\\}/))return\"meta mustache\";for(;a.next()&&!a.match(\"{{\",!1););return null}})});a.defineMode(\"vue\",function(c){return a.getMode(c,{name:\"htmlmixed\",tags:b})},\"htmlmixed\",\"xml\",\"javascript\",\"coffeescript\",\"css\",\"sass\",\"stylus\",\"pug\",\"handlebars\");a.defineMIME(\"script/x-vue\",\"vue\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/webidl/webidl.js",
    "content": "'use strict';(function(c){\"object\"==typeof exports&&\"object\"==typeof module?c(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],c):c(CodeMirror)})(function(c){function d(a){return new RegExp(\"^((\"+a.join(\")|(\")+\"))\\\\b\")}function l(a,b){if(a.eatSpace())return null;if(b.inComment){if(a.match(m))return b.inComment=!1,\"comment\";a.skipToEnd();return\"comment\"}if(a.match(\"//\"))return a.skipToEnd(),\"comment\";if(a.match(n))return\"comment\";if(a.match(p))return b.inComment=\n!0,\"comment\";if(a.match(/^-?[0-9\\.]/,!1)&&(a.match(q)||a.match(r)))return\"number\";if(a.match(t))return\"string\";if(b.startDef&&a.match(e))return\"def\";if(b.endDef&&a.match(u))return b.endDef=!1,\"def\";if(a.match(v))return\"keyword\";if(a.match(w))return b=b.lastToken,a=(a.match(/^\\s*(.+?)\\b/,!1)||[])[1],\":\"===b||\"implements\"===b||\"implements\"===a||\"=\"===a?\"builtin\":\"variable-3\";if(a.match(x))return\"builtin\";if(a.match(y))return\"atom\";if(a.match(e))return\"variable\";if(a.match(z))return\"operator\";a.next();\nreturn null}var f=\"Clamp Constructor EnforceRange Exposed ImplicitThis Global PrimaryGlobal LegacyArrayClass LegacyUnenumerableNamedProperties LenientThis NamedConstructor NewObject NoInterfaceObject OverrideBuiltins PutForwards Replaceable SameObject TreatNonObjectAsNull TreatNullAs EmptyString Unforgeable Unscopeable\".split(\" \"),x=d(f),g=\"unsigned short long unrestricted float double boolean byte octet Promise ArrayBuffer DataView Int8Array Int16Array Int32Array Uint8Array Uint16Array Uint32Array Uint8ClampedArray Float32Array Float64Array ByteString DOMString USVString sequence object RegExp Error DOMException FrozenArray any void\".split(\" \"),\nw=d(g),h=\"attribute callback const deleter dictionary enum getter implements inherit interface iterable legacycaller maplike partial required serializer setlike setter static stringifier typedef optional readonly or\".split(\" \"),v=d(h),k=[\"true\",\"false\",\"Infinity\",\"NaN\",\"null\"],y=d(k);c.registerHelper(\"hintWords\",\"webidl\",f.concat(g).concat(h).concat(k));var A=d([\"callback\",\"dictionary\",\"enum\",\"interface\"]),B=d([\"typedef\"]),z=/^[:<=>?]/,q=/^-?([1-9][0-9]*|0[Xx][0-9A-Fa-f]+|0[0-7]*)/,r=/^-?(([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+)([Ee][+-]?[0-9]+)?|[0-9]+[Ee][+-]?[0-9]+)/,\ne=/^_?[A-Za-z][0-9A-Z_a-z-]*/,u=/^_?[A-Za-z][0-9A-Z_a-z-]*(?=\\s*;)/,t=/^\"[^\"]*\"/,n=/^\\/\\*.*?\\*\\//,p=/^\\/\\*.*/,m=/^.*?\\*\\//;c.defineMode(\"webidl\",function(){return{startState:function(){return{inComment:!1,lastToken:\"\",startDef:!1,endDef:!1}},token:function(a,b){var c=l(a,b);c&&(a=a.current(),b.lastToken=a,\"keyword\"===c?(b.startDef=A.test(a),b.endDef=b.endDef||B.test(a)):b.startDef=!1);return c}}});c.defineMIME(\"text/x-webidl\",\"webidl\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/xml/xml.js",
    "content": "'use strict';(function(g){\"object\"==typeof exports&&\"object\"==typeof module?g(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],g):g(CodeMirror)})(function(g){var D={autoSelfClosers:{area:!0,base:!0,br:!0,col:!0,command:!0,embed:!0,frame:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0,menuitem:!0},implicitlyClosed:{dd:!0,li:!0,optgroup:!0,option:!0,p:!0,rp:!0,rt:!0,tbody:!0,td:!0,tfoot:!0,th:!0,tr:!0},contextGrabbers:{dd:{dd:!0,\ndt:!0},dt:{dd:!0,dt:!0},li:{li:!0},option:{option:!0,optgroup:!0},optgroup:{optgroup:!0},p:{address:!0,article:!0,aside:!0,blockquote:!0,dir:!0,div:!0,dl:!0,fieldset:!0,footer:!0,form:!0,h1:!0,h2:!0,h3:!0,h4:!0,h5:!0,h6:!0,header:!0,hgroup:!0,hr:!0,menu:!0,nav:!0,ol:!0,p:!0,pre:!0,section:!0,table:!0,ul:!0},rp:{rp:!0,rt:!0},rt:{rp:!0,rt:!0},tbody:{tbody:!0,tfoot:!0},td:{td:!0,th:!0},tfoot:{tbody:!0},th:{td:!0,th:!0},thead:{tbody:!0,tfoot:!0},tr:{tr:!0}},doNotIndent:{pre:!0},allowUnquoted:!0,allowMissing:!0,\ncaseFold:!0},E={autoSelfClosers:{},implicitlyClosed:{},contextGrabbers:{},doNotIndent:{},allowUnquoted:!1,allowMissing:!1,caseFold:!1};g.defineMode(\"xml\",function(p,q){function h(a,c){function b(b){c.tokenize=b;return b(a,c)}var d=a.next();if(\"<\"==d){if(a.eat(\"!\"))return a.eat(\"[\")?a.match(\"CDATA[\")?b(r(\"atom\",\"]]\\x3e\")):null:a.match(\"--\")?b(r(\"comment\",\"--\\x3e\")):a.match(\"DOCTYPE\",!0,!0)?(a.eatWhile(/[\\w\\._\\-]/),b(t(1))):null;if(a.eat(\"?\"))return a.eatWhile(/[\\w\\._\\-]/),c.tokenize=r(\"meta\",\"?>\"),\n\"meta\";l=a.eat(\"/\")?\"closeTag\":\"openTag\";c.tokenize=u;return\"tag bracket\"}if(\"&\"==d)return(a.eat(\"#\")?a.eat(\"x\")?a.eatWhile(/[a-fA-F\\d]/)&&a.eat(\";\"):a.eatWhile(/[\\d]/)&&a.eat(\";\"):a.eatWhile(/[\\w\\.\\-:]/)&&a.eat(\";\"))?\"atom\":\"error\";a.eatWhile(/[^&<]/);return null}function u(a,c){var b=a.next();if(\">\"==b||\"/\"==b&&a.eat(\">\"))return c.tokenize=h,l=\">\"==b?\"endTag\":\"selfcloseTag\",\"tag bracket\";if(\"=\"==b)return l=\"equals\",null;if(\"<\"==b)return c.tokenize=h,c.state=m,c.tagName=c.tagStart=null,(a=c.tokenize(a,\nc))?a+\" tag error\":\"tag error\";if(/[\\'\\\"]/.test(b))return c.tokenize=F(b),c.stringStartCol=a.column(),c.tokenize(a,c);a.match(/^[^\\s\\u00a0=<>\\\"\\']*[^\\s\\u00a0=<>\\\"\\'\\/]/);return\"word\"}function F(a){var c=function(b,c){for(;!b.eol();)if(b.next()==a){c.tokenize=u;break}return\"string\"};c.isInAttribute=!0;return c}function r(a,c){return function(b,d){for(;!b.eol();){if(b.match(c)){d.tokenize=h;break}b.next()}return a}}function t(a){return function(c,b){for(var d;null!=(d=c.next());){if(\"<\"==d)return b.tokenize=\nt(a+1),b.tokenize(c,b);if(\">\"==d)if(1==a){b.tokenize=h;break}else return b.tokenize=t(a-1),b.tokenize(c,b)}return\"meta\"}}function G(a,c,b){this.prev=a.context;this.tagName=c;this.indent=a.indented;this.startOfLine=b;if(e.doNotIndent.hasOwnProperty(c)||a.context&&a.context.noIndent)this.noIndent=!0}function v(a){a.context&&(a.context=a.context.prev)}function y(a,c){for(var b;a.context;){b=a.context.tagName;if(!e.contextGrabbers.hasOwnProperty(b)||!e.contextGrabbers[b].hasOwnProperty(c))break;v(a)}}\nfunction m(a,c,b){return\"openTag\"==a?(b.tagStart=c.column(),z):\"closeTag\"==a?H:m}function z(a,c,b){if(\"word\"==a)return b.tagName=c.current(),f=\"tag\",k;f=\"error\";return z}function H(a,c,b){if(\"word\"==a){a=c.current();b.context&&b.context.tagName!=a&&e.implicitlyClosed.hasOwnProperty(b.context.tagName)&&v(b);if(b.context&&b.context.tagName==a||!1===e.matchClosing)return f=\"tag\",w;f=\"tag error\";return A}f=\"error\";return A}function w(a,c,b){if(\"endTag\"!=a)return f=\"error\",w;v(b);return m}function A(a,\nc,b){f=\"error\";return w(a,c,b)}function k(a,c,b){if(\"word\"==a)return f=\"attribute\",I;if(\"endTag\"==a||\"selfcloseTag\"==a){c=b.tagName;var d=b.tagStart;b.tagName=b.tagStart=null;\"selfcloseTag\"==a||e.autoSelfClosers.hasOwnProperty(c)?y(b,c):(y(b,c),b.context=new G(b,c,d==b.indented));return m}f=\"error\";return k}function I(a,c,b){if(\"equals\"==a)return B;e.allowMissing||(f=\"error\");return k(a,c,b)}function B(a,c,b){if(\"string\"==a)return C;if(\"word\"==a&&e.allowUnquoted)return f=\"string\",k;f=\"error\";return k(a,\nc,b)}function C(a,c,b){return\"string\"==a?C:k(a,c,b)}var x=p.indentUnit,e={};p=q.htmlMode?D:E;for(var n in p)e[n]=p[n];for(n in q)e[n]=q[n];var l,f;h.isInText=!0;return{startState:function(a){var c={tokenize:h,state:m,indented:a||0,tagName:null,tagStart:null,context:null};null!=a&&(c.baseIndent=a);return c},token:function(a,c){!c.tagName&&a.sol()&&(c.indented=a.indentation());if(a.eatSpace())return null;l=null;var b=c.tokenize(a,c);(b||l)&&\"comment\"!=b&&(f=null,c.state=c.state(l||b,a,c),f&&(b=\"error\"==\nf?b+\" error\":f));return b},indent:function(a,c,b){var d=a.context;if(a.tokenize.isInAttribute)return a.tagStart==a.indented?a.stringStartCol+1:a.indented+x;if(d&&d.noIndent)return g.Pass;if(a.tokenize!=u&&a.tokenize!=h)return b?b.match(/^(\\s*)/)[0].length:0;if(a.tagName)return!1!==e.multilineTagIndentPastTag?a.tagStart+a.tagName.length+2:a.tagStart+x*(e.multilineTagIndentFactor||1);if(e.alignCDATA&&/<!\\[CDATA\\[/.test(c))return 0;if((c=c&&/^<(\\/)?([\\w_:\\.-]*)/.exec(c))&&c[1])for(;d;)if(d.tagName==\nc[2]){d=d.prev;break}else if(e.implicitlyClosed.hasOwnProperty(d.tagName))d=d.prev;else break;else if(c)for(;d;)if((b=e.contextGrabbers[d.tagName])&&b.hasOwnProperty(c[2]))d=d.prev;else break;for(;d&&d.prev&&!d.startOfLine;)d=d.prev;return d?d.indent+x:a.baseIndent||0},electricInput:/<\\/[\\s\\w:]+>$/,blockCommentStart:\"\\x3c!--\",blockCommentEnd:\"--\\x3e\",configuration:e.htmlMode?\"html\":\"xml\",helperType:e.htmlMode?\"html\":\"xml\",skipAttribute:function(a){a.state==B&&(a.state=k)}}});g.defineMIME(\"text/xml\",\n\"xml\");g.defineMIME(\"application/xml\",\"xml\");g.mimeModes.hasOwnProperty(\"text/html\")||g.defineMIME(\"text/html\",{name:\"xml\",htmlMode:!0})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/xquery/xquery.js",
    "content": "'use strict';(function(k){\"object\"==typeof exports&&\"object\"==typeof module?k(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],k):k(CodeMirror)})(function(k){k.defineMode(\"xquery\",function(){function l(a,c,b){c.tokenize=b;return b(a,c)}function f(a,c){var b=a.next(),d=!1,g;g='\"'===a.current()?a.match(/^[^\\\"]+\\\"\\:/,!1):\"'\"===a.current()?a.match(/^[^\\\"]+\\'\\:/,!1):!1;if(\"<\"==b){if(a.match(\"!--\",!0))return l(a,c,t);if(a.match(\"![CDATA\",!1))return c.tokenize=\nu,\"tag\";if(a.match(\"?\",!1))return l(a,c,v);d=a.eat(\"/\");a.eatSpace();for(var e=\"\";b=a.eat(/[^\\s\\u00a0=<>\\\"\\'\\/?]/);)e+=b;return l(a,c,w(e,d))}if(\"{\"==b)return c.stack.push({type:\"codeblock\"}),null;if(\"}\"==b)return h(c),null;if(m(c,\"tag\"))return\">\"==b?\"tag\":\"/\"==b&&a.eat(\">\")?(h(c),\"tag\"):\"variable\";if(/\\d/.test(b))return a.match(/^\\d*(?:\\.\\d*)?(?:E[+\\-]?\\d+)?/),\"atom\";if(\"(\"===b&&a.eat(\":\"))return c.stack.push({type:\"comment\"}),l(a,c,k);if(g||'\"'!==b&&\"'\"!==b){if(\"$\"===b)return l(a,c,x);if(\":\"===\nb&&a.eat(\"=\"))return\"keyword\";if(\"(\"===b)return c.stack.push({type:\"paren\"}),null;if(\")\"===b)return h(c),null;if(\"[\"===b)return c.stack.push({type:\"bracket\"}),null;if(\"]\"===b)return h(c),null;e=p.propertyIsEnumerable(b)&&p[b];if(g&&'\"'===b)for(;'\"'!==a.next(););if(g&&\"'\"===b)for(;\"'\"!==a.next(););e||a.eatWhile(/[\\w\\$_-]/);e=a.eat(\":\");!a.eat(\":\")&&e&&a.eatWhile(/[\\w\\$_-]/);a.match(/^[ \\t]*\\(/,!1)&&(d=!0);a=a.current();e=p.propertyIsEnumerable(a)&&p[a];d&&!e&&(e={type:\"function_call\",style:\"variable def\"});\nif(m(c,\"xmlconstructor\"))return h(c),\"variable\";\"element\"!=a&&\"attribute\"!=a&&\"axis_specifier\"!=e.type||c.stack.push({type:\"xmlconstructor\"});return e?e.style:\"variable\"}return l(a,c,q(b))}function k(a,c){for(var b=!1,d=!1,g=0,e;e=a.next();){if(\")\"==e&&b)if(0<g)g--;else{h(c);break}else\":\"==e&&d&&g++;b=\":\"==e;d=\"(\"==e}return\"comment\"}function q(a,c){return function(b,d){var g;if(m(d,\"string\")&&b.current()==a)return h(d),c&&(d.tokenize=c),\"string\";g={type:\"string\",name:a,tokenize:q(a,c)};d.stack.push(g);\nif(b.match(\"{\",!1)&&n(d))return d.tokenize=f,\"string\";for(;g=b.next();)if(g==a){h(d);c&&(d.tokenize=c);break}else if(b.match(\"{\",!1)&&n(d)){d.tokenize=f;break}return\"string\"}}function x(a,c){var b=/[\\w\\$_-]/;if(a.eat('\"')){for(;'\"'!==a.next(););a.eat(\":\")}else a.eatWhile(b),a.match(\":=\",!1)||a.eat(\":\");a.eatWhile(b);c.tokenize=f;return\"variable\"}function w(a,c){return function(b,d){b.eatSpace();if(c&&b.eat(\">\"))return h(d),d.tokenize=f,\"tag\";b.eat(\"/\")||d.stack.push({type:\"tag\",name:a,tokenize:f});\nb.eat(\">\")?d.tokenize=f:d.tokenize=r;return\"tag\"}}function r(a,c){var b=a.next();if(\"/\"==b&&a.eat(\">\"))return n(c)&&h(c),m(c,\"tag\")&&h(c),\"tag\";if(\">\"==b)return n(c)&&h(c),\"tag\";if(\"=\"==b)return null;if('\"'==b||\"'\"==b)return l(a,c,q(b,r));n(c)||c.stack.push({type:\"attribute\",tokenize:r});a.eat(/[a-zA-Z_:]/);a.eatWhile(/[-a-zA-Z0-9_:.]/);a.eatSpace();if(a.match(\">\",!1)||a.match(\"/\",!1))h(c),c.tokenize=f;return\"attribute\"}function t(a,c){for(var b;b=a.next();)if(\"-\"==b&&a.match(\"->\",!0))return c.tokenize=\nf,\"comment\"}function u(a,c){for(var b;b=a.next();)if(\"]\"==b&&a.match(\"]\",!0))return c.tokenize=f,\"comment\"}function v(a,c){for(var b;b=a.next();)if(\"?\"==b&&a.match(\">\",!0))return c.tokenize=f,\"comment meta\"}function n(a){return m(a,\"attribute\")}function m(a,c){return a.stack.length&&a.stack[a.stack.length-1].type==c}function h(a){a.stack.pop();a.tokenize=a.stack.length&&a.stack[a.stack.length-1].tokenize||f}var p=function(){function a(a){return{type:a,style:\"keyword\"}}for(var c=a(\"keyword a\"),b=a(\"keyword b\"),\nd=a(\"keyword c\"),g=a(\"operator\"),e={type:\"atom\",style:\"atom\"},h={type:\"axis_specifier\",style:\"qualifier\"},c={\"if\":c,\"switch\":c,\"while\":c,\"for\":c,\"else\":b,then:b,\"try\":b,\"finally\":b,\"catch\":b,element:d,attribute:d,let:d,\"implements\":d,\"import\":d,module:d,namespace:d,\"return\":d,\"super\":d,\"this\":d,\"throws\":d,where:d,\"private\":d,\",\":{type:\"punctuation\",style:null},\"null\":e,\"fn:false()\":e,\"fn:true()\":e},f=\"after ancestor ancestor-or-self and as ascending assert attribute before by case cast child comment declare default define descendant descendant-or-self descending document document-node element else eq every except external following following-sibling follows for function if import in instance intersect item let module namespace node node of only or order parent precedes preceding preceding-sibling processing-instruction ref return returns satisfies schema schema-element self some sortby stable text then to treat typeswitch union variable version where xquery empty-sequence\".split(\" \"),\nb=0,d=f.length;b<d;b++)c[f[b]]=a(f[b]);f=\"xs:string xs:float xs:decimal xs:double xs:integer xs:boolean xs:date xs:dateTime xs:time xs:duration xs:dayTimeDuration xs:time xs:yearMonthDuration numeric xs:hexBinary xs:base64Binary xs:anyURI xs:QName xs:byte xs:boolean xs:anyURI xf:yearMonthDuration\".split(\" \");b=0;for(d=f.length;b<d;b++)c[f[b]]=e;e=\"eq ne lt le gt ge := = > >= < <= . | ? and or div idiv mod * / + -\".split(\" \");b=0;for(d=e.length;b<d;b++)c[e[b]]=g;g=\"self:: attribute:: child:: descendant:: descendant-or-self:: parent:: ancestor:: ancestor-or-self:: following:: preceding:: following-sibling:: preceding-sibling::\".split(\" \");\nb=0;for(d=g.length;b<d;b++)c[g[b]]=h;return c}();return{startState:function(){return{tokenize:f,cc:[],stack:[]}},token:function(a,c){return a.eatSpace()?null:c.tokenize(a,c)},blockCommentStart:\"(:\",blockCommentEnd:\":)\"}});k.defineMIME(\"application/xquery\",\"xquery\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/yacas/yacas.js",
    "content": "'use strict';(function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],e):e(CodeMirror)})(function(e){e.defineMode(\"yacas\",function(h,t){function f(a,b){var c;c=a.next();if('\"'===c)return b.tokenize=k,b.tokenize(a,b);if(\"/\"===c){if(a.eat(\"*\"))return b.tokenize=l,b.tokenize(a,b);if(a.eat(\"/\"))return a.skipToEnd(),\"comment\"}a.backUp(1);var d=a.match(/^(\\w+)\\s*\\(/,!1);null!==d&&m.hasOwnProperty(d[1])&&\nb.scopes.push(\"bodied\");d=g(b);\"bodied\"===d&&\"[\"===c&&b.scopes.pop();\"[\"!==c&&\"{\"!==c&&\"(\"!==c||b.scopes.push(c);d=g(b);(\"[\"===d&&\"]\"===c||\"{\"===d&&\"}\"===c||\"(\"===d&&\")\"===c)&&b.scopes.pop();if(\";\"===c)for(;\"bodied\"===d;)b.scopes.pop(),d=g(b);return a.match(/\\d+ *#/,!0,!1)?\"qualifier\":a.match(n,!0,!1)?\"number\":a.match(p,!0,!1)?\"variable-3\":a.match(/(?:\\[|\\]|{|}|\\(|\\))/,!0,!1)?\"bracket\":a.match(q,!0,!1)?(a.backUp(1),\"variable\"):a.match(r,!0,!1)?\"variable-2\":a.match(/(?:\\\\|\\+|\\-|\\*|\\/|,|;|\\.|:|@|~|=|>|<|&|\\||_|`|'|\\^|\\?|!|%)/,\n!0,!1)?\"operator\":\"error\"}function k(a,b){for(var c,d=!1,e=!1;null!=(c=a.next());){if('\"'===c&&!e){d=!0;break}e=!e&&\"\\\\\"===c}d&&!e&&(b.tokenize=f);return\"string\"}function l(a,b){for(var c,d;null!=(d=a.next());){if(\"*\"===c&&\"/\"===d){b.tokenize=f;break}c=d}return\"comment\"}function g(a){var b=null;0<a.scopes.length&&(b=a.scopes[a.scopes.length-1]);return b}var m=function(a){var b={};a=a.split(\" \");for(var c=0;c<a.length;++c)b[a[c]]=!0;return b}(\"Assert BackQuote D Defun Deriv For ForEach FromFile FromString Function Integrate InverseTaylor Limit LocalSymbols Macro MacroRule MacroRulePattern NIntegrate Rule RulePattern Subst TD TExplicitSum TSum Taylor Taylor1 Taylor2 Taylor3 ToFile ToStdout ToString TraceRule Until While\"),\nn=/(?:(?:\\.\\d+|\\d+\\.\\d*|\\d+)(?:[eE][+-]?\\d+)?)/,r=/(?:[a-zA-Z\\$'][a-zA-Z0-9\\$']*)/,p=/(?:[a-zA-Z\\$'][a-zA-Z0-9\\$']*)?_(?:[a-zA-Z\\$'][a-zA-Z0-9\\$']*)/,q=/(?:[a-zA-Z\\$'][a-zA-Z0-9\\$']*)\\s*\\(/;return{startState:function(){return{tokenize:f,scopes:[]}},token:function(a,b){return a.eatSpace()?null:b.tokenize(a,b)},indent:function(a,b){if(a.tokenize!==f&&null!==a.tokenize)return e.Pass;var c=0;if(\"]\"===b||\"];\"===b||\"}\"===b||\"};\"===b||\");\"===b)c=-1;return(a.scopes.length+c)*h.indentUnit},electricChars:\"{}[]();\",\nblockCommentStart:\"/*\",blockCommentEnd:\"*/\",lineComment:\"//\"}});e.defineMIME(\"text/x-yacas\",{name:\"yacas\"})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/yaml/yaml.js",
    "content": "'use strict';(function(c){\"object\"==typeof exports&&\"object\"==typeof module?c(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],c):c(CodeMirror)})(function(c){c.defineMode(\"yaml\",function(){var c=/\\b((true)|(false)|(on)|(off)|(yes)|(no))$/i;return{token:function(b,a){var d=b.peek(),e=a.escaped;a.escaped=!1;if(\"#\"==d&&(0==b.pos||/\\s/.test(b.string.charAt(b.pos-1))))return b.skipToEnd(),\"comment\";if(b.match(/^('([^']|\\\\.)*'?|\"([^\"]|\\\\.)*\"?)/))return\"string\";\nif(a.literal&&b.indentation()>a.keyCol)return b.skipToEnd(),\"string\";a.literal&&(a.literal=!1);if(b.sol()){a.keyCol=0;a.pair=!1;a.pairStart=!1;if(b.match(/---/)||b.match(/\\.\\.\\./))return\"def\";if(b.match(/\\s*-\\s+/))return\"meta\"}if(b.match(/^(\\{|\\}|\\[|\\])/))return\"{\"==d?a.inlinePairs++:\"}\"==d?a.inlinePairs--:\"[\"==d?a.inlineList++:a.inlineList--,\"meta\";if(0<a.inlineList&&!e&&\",\"==d)return b.next(),\"meta\";if(0<a.inlinePairs&&!e&&\",\"==d)return a.keyCol=0,a.pair=!1,a.pairStart=!1,b.next(),\"meta\";if(a.pairStart){if(b.match(/^\\s*(\\||\\>)\\s*/))return a.literal=\n!0,\"meta\";if(b.match(/^\\s*(\\&|\\*)[a-z0-9\\._-]+\\b/i))return\"variable-2\";if(0==a.inlinePairs&&b.match(/^\\s*-?[0-9\\.\\,]+\\s?$/)||0<a.inlinePairs&&b.match(/^\\s*-?[0-9\\.\\,]+\\s?(?=(,|}))/))return\"number\";if(b.match(c))return\"keyword\"}if(!a.pair&&b.match(/^\\s*(?:[,\\[\\]{}&*!|>'\"%@`][^\\s'\":]|[^,\\[\\]{}#&*!|>'\"%@`])[^#]*?(?=\\s*:($|\\s))/))return a.pair=!0,a.keyCol=b.indentation(),\"atom\";if(a.pair&&b.match(/^:\\s*/))return a.pairStart=!0,\"meta\";a.pairStart=!1;a.escaped=\"\\\\\"==d;b.next();return null},startState:function(){return{pair:!1,\npairStart:!1,keyCol:0,inlinePairs:0,inlineList:0,literal:!1,escaped:!1}}}});c.defineMIME(\"text/x-yaml\",\"yaml\")});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/yaml-frontmatter/yaml-frontmatter.js",
    "content": "'use strict';(function(c){\"object\"==typeof exports&&\"object\"==typeof module?c(require(\"../../lib/codemirror\"),require(\"../yaml/yaml\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\",\"../yaml/yaml\"],c):c(CodeMirror)})(function(c){c.defineMode(\"yaml-frontmatter\",function(f,g){var e=c.getMode(f,\"yaml\"),d=c.getMode(f,g&&g.base||\"gfm\");return{startState:function(){return{state:0,inner:c.startState(e)}},copyState:function(a){return{state:a.state,inner:c.copyState(2==a.state?d:e,a.inner)}},\ntoken:function(a,b){if(0==b.state){if(a.match(/---/,!1))return b.state=1,e.token(a,b.inner);b.state=2;b.inner=c.startState(d);return d.token(a,b.inner)}if(1==b.state){var f=a.sol()&&a.match(/---/,!1);a=e.token(a,b.inner);f&&(b.state=2,b.inner=c.startState(d));return a}return d.token(a,b.inner)},innerMode:function(a){return{mode:2==a.state?d:e,state:a.inner}},blankLine:function(a){var b=2==a.state?d:e;if(b.blankLine)return b.blankLine(a.inner)}}})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/mode/z80/z80.js",
    "content": "'use strict';(function(d){\"object\"==typeof exports&&\"object\"==typeof module?d(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],d):d(CodeMirror)})(function(d){d.defineMode(\"z80\",function(d,k){var g=k.ez80,e,f;g?(e=/^(exx?|(ld|cp)([di]r?)?|[lp]ea|pop|push|ad[cd]|cpl|daa|dec|inc|neg|sbc|sub|and|bit|[cs]cf|x?or|res|set|r[lr]c?a?|r[lr]d|s[lr]a|srl|djnz|nop|[de]i|halt|im|in([di]mr?|ir?|irx|2r?)|ot(dmr?|[id]rx|imr?)|out(0?|[di]r?|[di]2r?)|tst(io)?|slp)(\\.([sl]?i)?[sl])?\\b/i,\nf=/^(((call|j[pr]|rst|ret[in]?)(\\.([sl]?i)?[sl])?)|(rs|st)mix)\\b/i):(e=/^(exx?|(ld|cp|in)([di]r?)?|pop|push|ad[cd]|cpl|daa|dec|inc|neg|sbc|sub|and|bit|[cs]cf|x?or|res|set|r[lr]c?a?|r[lr]d|s[lr]a|srl|djnz|nop|rst|[de]i|halt|im|ot[di]r|out[di]?)\\b/i,f=/^(call|j[pr]|ret[in]?|b_?(call|jump))\\b/i);var l=/^(af?|bc?|c|de?|e|hl?|l|i[xy]?|r|sp)\\b/i,m=/^(n?[zc]|p[oe]?|m)\\b/i,n=/^([hl][xy]|i[xy][hl]|slia|sll)\\b/i,h=/^([\\da-f]+h|[0-7]+o|[01]+b|\\d+d?)\\b/i;return{startState:function(){return{context:0}},token:function(a,\nb){a.column()||(b.context=0);if(a.eatSpace())return null;var c;if(a.eatWhile(/\\w/))if(g&&a.eat(\".\")&&a.eatWhile(/\\w/),c=a.current(),a.indentation()){if((1==b.context||4==b.context)&&l.test(c))return b.context=4,\"var2\";if(2==b.context&&m.test(c))return b.context=4,\"var3\";if(e.test(c))return b.context=1,\"keyword\";if(f.test(c))return b.context=2,\"keyword\";if(4==b.context&&h.test(c))return\"number\";if(n.test(c))return\"error\"}else{if(a.match(h))return\"number\"}else{if(a.eat(\";\"))return a.skipToEnd(),\"comment\";\nif(a.eat('\"')){for(;(c=a.next())&&'\"'!=c;)\"\\\\\"==c&&a.next();return\"string\"}if(a.eat(\"'\")){if(a.match(/\\\\?.'/))return\"number\"}else if(a.eat(\".\")||a.sol()&&a.eat(\"#\")){if(b.context=5,a.eatWhile(/\\w/))return\"def\"}else if(a.eat(\"$\")){if(a.eatWhile(/[\\da-f]/i))return\"number\"}else if(a.eat(\"%\")){if(a.eatWhile(/[01]/))return\"number\"}else a.next()}return null}}});d.defineMIME(\"text/x-z80\",\"z80\");d.defineMIME(\"text/x-ez80\",{name:\"z80\",ez80:!0})});\n"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/3024-day.css",
    "content": ".cm-s-3024-day.CodeMirror{background:#f7f7f7;color:#3a3432}.cm-s-3024-day .CodeMirror-line::selection,.cm-s-3024-day .CodeMirror-line>span::selection,.cm-s-3024-day .CodeMirror-line>span>span::selection,.cm-s-3024-day div.CodeMirror-selected{background:#d6d5d4}.cm-s-3024-day .CodeMirror-line::-moz-selection,.cm-s-3024-day .CodeMirror-line>span::-moz-selection,.cm-s-3024-day .CodeMirror-line>span>span::selection{background:#d9d9d9}.cm-s-3024-day .CodeMirror-gutters{background:#f7f7f7;border-right:0}.cm-s-3024-day .CodeMirror-guttermarker{color:#db2d20}.cm-s-3024-day .CodeMirror-guttermarker-subtle,.cm-s-3024-day .CodeMirror-linenumber{color:#807d7c}.cm-s-3024-day .CodeMirror-cursor{border-left:1px solid #5c5855}.cm-s-3024-day span.cm-comment{color:#cdab53}.cm-s-3024-day span.cm-atom,.cm-s-3024-day span.cm-number{color:#a16a94}.cm-s-3024-day span.cm-attribute,.cm-s-3024-day span.cm-property{color:#01a252}.cm-s-3024-day span.cm-keyword{color:#db2d20}.cm-s-3024-day span.cm-string{color:#fded02}.cm-s-3024-day span.cm-variable{color:#01a252}.cm-s-3024-day span.cm-variable-2{color:#01a0e4}.cm-s-3024-day span.cm-def{color:#e8bbd0}.cm-s-3024-day span.cm-bracket{color:#3a3432}.cm-s-3024-day span.cm-tag{color:#db2d20}.cm-s-3024-day span.cm-link{color:#a16a94}.cm-s-3024-day span.cm-error{background:#db2d20;color:#5c5855}.cm-s-3024-day .CodeMirror-activeline-background{background:#e8f2ff}.cm-s-3024-day .CodeMirror-matchingbracket{text-decoration:underline;color:#a16a94!important}"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/3024-night.css",
    "content": ".cm-s-3024-night.CodeMirror{background:#090300;color:#d6d5d4}.cm-s-3024-night div.CodeMirror-selected{background:#3a3432}.cm-s-3024-night .CodeMirror-line::selection,.cm-s-3024-night .CodeMirror-line>span::selection,.cm-s-3024-night .CodeMirror-line>span>span::selection{background:rgba(58,52,50,.99)}.cm-s-3024-night .CodeMirror-line::-moz-selection,.cm-s-3024-night .CodeMirror-line>span::-moz-selection,.cm-s-3024-night .CodeMirror-line>span>span::-moz-selection{background:rgba(58,52,50,.99)}.cm-s-3024-night .CodeMirror-gutters{background:#090300;border-right:0}.cm-s-3024-night .CodeMirror-guttermarker{color:#db2d20}.cm-s-3024-night .CodeMirror-guttermarker-subtle,.cm-s-3024-night .CodeMirror-linenumber{color:#5c5855}.cm-s-3024-night .CodeMirror-cursor{border-left:1px solid #807d7c}.cm-s-3024-night span.cm-comment{color:#cdab53}.cm-s-3024-night span.cm-atom,.cm-s-3024-night span.cm-number{color:#a16a94}.cm-s-3024-night span.cm-attribute,.cm-s-3024-night span.cm-property{color:#01a252}.cm-s-3024-night span.cm-keyword{color:#db2d20}.cm-s-3024-night span.cm-string{color:#fded02}.cm-s-3024-night span.cm-variable{color:#01a252}.cm-s-3024-night span.cm-variable-2{color:#01a0e4}.cm-s-3024-night span.cm-def{color:#e8bbd0}.cm-s-3024-night span.cm-bracket{color:#d6d5d4}.cm-s-3024-night span.cm-tag{color:#db2d20}.cm-s-3024-night span.cm-link{color:#a16a94}.cm-s-3024-night span.cm-error{background:#db2d20;color:#807d7c}.cm-s-3024-night .CodeMirror-activeline-background{background:#2F2F2F}.cm-s-3024-night .CodeMirror-matchingbracket{text-decoration:underline;color:#fff!important}"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/abcdef.css",
    "content": ".cm-s-abcdef.CodeMirror{background:#0f0f0f;color:#defdef}.cm-s-abcdef div.CodeMirror-selected{background:#515151}.cm-s-abcdef .CodeMirror-line::selection,.cm-s-abcdef .CodeMirror-line>span::selection,.cm-s-abcdef .CodeMirror-line>span>span::selection{background:rgba(56,56,56,.99)}.cm-s-abcdef .CodeMirror-line::-moz-selection,.cm-s-abcdef .CodeMirror-line>span::-moz-selection,.cm-s-abcdef .CodeMirror-line>span>span::-moz-selection{background:rgba(56,56,56,.99)}.cm-s-abcdef .CodeMirror-gutters{background:#555;border-right:2px solid #314151}.cm-s-abcdef .CodeMirror-guttermarker{color:#222}.cm-s-abcdef .CodeMirror-guttermarker-subtle{color:azure}.cm-s-abcdef .CodeMirror-linenumber{color:#FFF}.cm-s-abcdef .CodeMirror-cursor{border-left:1px solid #0F0}.cm-s-abcdef span.cm-keyword{color:#b8860b;font-weight:700}.cm-s-abcdef span.cm-atom{color:#77F}.cm-s-abcdef span.cm-number{color:violet}.cm-s-abcdef span.cm-def{color:#fffabc}.cm-s-abcdef span.cm-variable{color:#abcdef}.cm-s-abcdef span.cm-variable-2{color:#cacbcc}.cm-s-abcdef span.cm-variable-3{color:#def}.cm-s-abcdef span.cm-property{color:#fedcba}.cm-s-abcdef span.cm-operator{color:#ff0}.cm-s-abcdef span.cm-comment{color:#7a7b7c;font-style:italic}.cm-s-abcdef span.cm-string{color:#2b4}.cm-s-abcdef span.cm-meta{color:#C9F}.cm-s-abcdef span.cm-qualifier{color:#FFF700}.cm-s-abcdef span.cm-builtin{color:#30aabc}.cm-s-abcdef span.cm-bracket{color:#8a8a8a}.cm-s-abcdef span.cm-tag{color:#FD4}.cm-s-abcdef span.cm-attribute{color:#DF0}.cm-s-abcdef span.cm-error{color:red}.cm-s-abcdef span.cm-header{color:#7fffd4;font-weight:700}.cm-s-abcdef span.cm-link{color:#8a2be2}.cm-s-abcdef .CodeMirror-activeline-background{background:#314151}"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/ambiance-mobile.css",
    "content": ".cm-s-ambiance.CodeMirror{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/ambiance.css",
    "content": ".cm-s-ambiance .cm-header{color:#00f}.cm-s-ambiance .cm-quote{color:#24C2C7}.cm-s-ambiance .cm-keyword{color:#cda869}.cm-s-ambiance .cm-atom{color:#CF7EA9}.cm-s-ambiance .cm-number{color:#78CF8A}.cm-s-ambiance .cm-def{color:#aac6e3}.cm-s-ambiance .cm-variable{color:#ffb795}.cm-s-ambiance .cm-variable-2{color:#eed1b3}.cm-s-ambiance .cm-variable-3{color:#faded3}.cm-s-ambiance .cm-property{color:#eed1b3}.cm-s-ambiance .cm-operator{color:#fa8d6a}.cm-s-ambiance .cm-comment{color:#555;font-style:italic}.cm-s-ambiance .cm-string{color:#8f9d6a}.cm-s-ambiance .cm-string-2{color:#9d937c}.cm-s-ambiance .cm-meta{color:#D2A8A1}.cm-s-ambiance .cm-qualifier{color:#ff0}.cm-s-ambiance .cm-builtin{color:#99c}.cm-s-ambiance .cm-bracket{color:#24C2C7}.cm-s-ambiance .cm-tag{color:#fee4ff}.cm-s-ambiance .cm-attribute{color:#9B859D}.cm-s-ambiance .cm-hr{color:pink}.cm-s-ambiance .cm-link{color:#F4C20B}.cm-s-ambiance .cm-special{color:#FF9D00}.cm-s-ambiance .cm-error{color:#AF2018}.cm-s-ambiance .CodeMirror-matchingbracket{color:#0f0}.cm-s-ambiance .CodeMirror-nonmatchingbracket{color:#f22}.cm-s-ambiance div.CodeMirror-selected{background:rgba(255,255,255,.15)}.cm-s-ambiance .CodeMirror-line::selection,.cm-s-ambiance .CodeMirror-line>span::selection,.cm-s-ambiance .CodeMirror-line>span>span::selection,.cm-s-ambiance.CodeMirror-focused div.CodeMirror-selected{background:rgba(255,255,255,.1)}.cm-s-ambiance .CodeMirror-line::-moz-selection,.cm-s-ambiance .CodeMirror-line>span::-moz-selection,.cm-s-ambiance .CodeMirror-line>span>span::-moz-selection{background:rgba(255,255,255,.1)}.cm-s-ambiance.CodeMirror{line-height:1.4em;color:#E6E1DC;background-color:#202020;-webkit-box-shadow:inset 0 0 10px #000;-moz-box-shadow:inset 0 0 10px #000;box-shadow:inset 0 0 10px #000}.cm-s-ambiance .CodeMirror-gutters{background:#3D3D3D;border-right:1px solid #4D4D4D;box-shadow:0 10px 20px #000}.cm-s-ambiance .CodeMirror-linenumber{text-shadow:0 1px 1px #4d4d4d;color:#111;padding:0 5px}.cm-s-ambiance .CodeMirror-guttermarker{color:#aaa}.cm-s-ambiance .CodeMirror-guttermarker-subtle{color:#111}.cm-s-ambiance .CodeMirror-cursor{border-left:1px solid #7991E8}.cm-s-ambiance .CodeMirror-activeline-background{background:rgba(255,255,255,.031)}.cm-s-ambiance .CodeMirror-gutters,.cm-s-ambiance.CodeMirror{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAQAAAAHUWYVAABFFUlEQVQYGbzBCeDVU/74/6fj9HIcx/FRHx9JCFmzMyGRURhLZIkUsoeRfUjS2FNDtr6WkMhO9sm+S8maJfu+Jcsg+/o/c+Z4z/t97/vezy3z+z8ekGlnYICG/o7gdk+wmSHZ1z4pJItqapjoKXWahm8NmV6eOTbWUOp6/6a/XIg6GQqmenJ2lDHyvCFZ2cBDbmtHA043VFhHwXxClWmeYAdLhV00Bd85go8VmaFCkbVkzlQENzfBDZ5gtN7HwF0KDrTwJ0dypSOzpaKCMwQHKTIreYIxlmhXTzTWkVm+LTynZhiSBT3RZQ7aGfjGEd3qyXQ1FDymqbKxpspERQN2MiRjNZlFFQXfCNFm9nM1zpAsoYjmtRTc5ajwuaXc5xrWskT97RaKzAGe5ARHhVUsDbjKklziiX5WROcJwSNCNI+9w1Jwv4Zb2r7lCMZ4oq5C0EdTx+2GzNuKpJ+iFf38JEWkHJn9DNF7mmBDITrWEg0VWL3pHU20tSZnuqWu+R3BtYa8XxV1HO7GyD32UkOpL/yDloINFTmvtId+nmAjxRw40VMwVKiwrKLE4bK5UOVntYwhOcSSXKrJHKPJedocpGjVz/ZMIbnYUPB10/eKCrs5apqpgVmWzBYWpmtKHecJPjaUuEgRDDaU0oZghCJ6zNMQ5ZhDYx05r5v2muQdM0EILtXUsaKiQX9WMEUotagQzFbUNN6NUPC2nm5pxEWGCjMc3GdJHjSU2kORLK/JGSrkfGEIjncU/CYUnOipoYemwj8tST9NsJmB7TUVXtbUtXATJVZXBMvYeTXJfobgJUPmGMP/yFaWonaa6BcFO3nqcIqCozSZoZoSr1g4zJOzuyGnxTEX3lUEJ7WcZgme8ddaWvWJo2AJR9DZU3CUIbhCSG6ybSwN6qtJVnCU2svDTP2ZInOw2cBTrqtQahtNZn9NcJ4l2NaSmSkkP1noZWnVwkLmdUPOwLZEwy2Z3S3R+4rIG9hcbpPXHFVWcQdZkn2FOta3cKWQnNRC5g1LsJah4GCzSVsKnCOY5OAFRTBekyyryeyilhFKva75r4Mc0aWanGEaThcy31s439KKxTzJYY5WTHPU1FtIHjQU3Oip4xlNzj/lBw23dYZVliQa7WAXf4shetcQfatI+jWRDBPmyNeW6A1P5kdDgyYJlba0BIM8BZu1JfrFwItyjcAMR3K0BWOIrtMEXyhyrlVEx3ui5dUBjmB/Q3CXW85R4mBD0s7B+4q5tKUjOlb9qqmhi5AZ6GFIC5HXtOobdYGlVdMVbNJ8toNTFcHxnoL+muBagcctjWnbNMuR00uI7nQESwg5q2qqrKWIfrNUmeQocY6HuyxJV02wj36w00yhpmUFenv4p6fUkZYqLyuinx2RGOjhCXYyJF84oiU00YMOOhhquNdfbOB7gU88pY4xJO8LVdp6/q2voeB4R04vIdhSE40xZObx1HGGJ/ja0LBthFInKaLPPFzuCaYaoj8JjPME8yoyxo6zlBqkiUZYgq00OYMswbWO5NGmq+xhipxHLRW29ARjNKXO0wRnear8XSg4XFPLKEPUS1GqvyLwiuBUoa7zpZ0l5xxFwWmWZC1H5h5FwU8eQ7K+g8UcVY6TMQreVQT/8uQ8Z+ALIXnSEa2pYZQneE9RZbSBNYXfWYJzW/h/4j4Dp1tYVcFIC5019Vyi4ThPqSFCzjGWaHQTBU8q6vrVwgxP9Lkm840imWKpcLCjYTtrKuwvsKSnrvHCXGkSMk9p6lhckfRpIeis+N2PiszT+mFLspyGleUhDwcLrZqmyeylxwjBcKHEapqkmyangyLZRVOijwOtCY5SsG5zL0OwlCJ4y5KznF3EUNDDrinwiyLZRzOXtlBbK5ITHFGLp8Q0R6ab6mS7enI2cFrxOyHvOCFaT1HThS1krjCwqWeurCkk+willhCC+RSZnRXBiZaC5RXRIZYKp2lyfrHwiKPKR0JDzrdU2EFgpidawlFDR6FgXUMNa+g1FY3bUQh2cLCwosRdnuQTS/S+JVrGLeWIvtQUvONJxlqSQYYKpwoN2kaocLjdVsis4Mk80ESF2YpSkzwldjHkjFCUutI/r+EHDU8oCs6yzL3PhWiEooZdFMkymlas4AcI3KmoMMNSQ3tHzjGWCrcJJdYyZC7QFGwjRL9p+MrRkAGWzIaWCn9W0F3TsK01c2ZvQw0byvxuQU0r1lM0qJO7wW0kRIMdDTtXEdzi4VIh+EoIHm0mWtAtpCixlabgn83fKTI7anJe9ST7WIK1DMGpQmYeA58ImV6ezOGOzK2Kgq01pd60cKWiUi9Lievb/0vIDPHQ05Kzt4ddPckQBQtoaurjyHnek/nKzpQLrVgKPjIkh2v4uyezpv+Xoo7fPFXaGFp1vaLKxQ4uUpQQS5VuQs7BCq4xRJv7fwpVvvFEB3j+620haOuocqMhWd6TTPAEx+mdFNGHdranFe95WrWmIvlY4F1Dle2ECgc6cto7SryuqGGGha0tFQ5V53migUKmg6XKAo4qS3mik+0OZpAhOLeZKicacgaYcyx5hypYQE02ZA4xi/pNhOQxR4klNKyqacj+mpxnLTnnGSo85++3ZCZq6lrZkXlGEX3o+C9FieccJbZWVFjC0Yo1FZnJhoYMFoI1hEZ9r6hwg75HwzBNhbZCdJEfJwTPGzJvaKImw1yYX1HDAmpXR+ZJQ/SmgqMNVQb5vgamGwLtt7VwvP7Qk1xpiM5x5Cyv93E06MZmgs0Nya2azIKOYKCGBQQW97RmhKNKF02JZqHEJ4o58qp7X5EcZmc56trXEqzjCBZ1MFGR87Ql2tSTs6CGxS05PTzRQorkbw7aKoKXFDXsYW42VJih/q+FP2BdTzDTwVqOYB13liM50vG7wy28qagyuIXMeQI/Oqq8bcn5wJI50xH00CRntyfpL1T4hydYpoXgNiFzoIUTDZnLNRzh4TBHwbYGDvZkxmlyJloyr6tRihpeUG94GnKtIznREF0tzJG/OOr73JBcrSh1k6WuTprgLU+mnSGnv6Zge0NNz+kTDdH8nuAuTdJDCNb21LCiIuqlYbqGzT3RAoZofQfjFazkqeNWdYaGvYTM001EW2oKPvVk1ldUGSgUtHFwjKM1h9jnFcmy5lChoLNaQMGGDsYbKixlaMBmmsx1QjCfflwTfO/gckW0ruZ3jugKR3R5W9hGUWqCgxuFgsuaCHorotGKzGaeZB9DMsaTnKCpMtwTvOzhYk0rdrArKCqcaWmVk1+F372ur1YkKxgatI8Qfe1gIX9wE9FgS8ESmuABIXnRUbCapcKe+nO7slClSZFzpV/LkLncEb1qiO42fS3R855Su2mCLh62t1SYZZYVmKwIHjREF2uihTzB20JOkz7dkxzYQnK0UOU494wh+VWRc6Un2kpTaVgLDFEkJ/uhzRcI0YKGgpGWOlocBU/a4fKoJ/pEaNV6jip3+Es9VXY078rGnmAdf7t9ylPXS34RBSuYPs1UecZTU78WanhBCHpZ5sAoTz0LGZKjPf9TRypqWEiTvOFglL1fCEY3wY/++rbk7C8bWebA6p6om6PgOL2kp44TFJlVNBXae2rqqdZztOJpT87GQsE9jqCPIe9VReZuQ/CIgacsyZdCpIScSYqcZk8r+nsyCzhyfhOqHGOIvrLknC8wTpFcaYiGC/RU1NRbUeUpocQOnkRpGOrIOcNRx+1uA0UrzhSSt+VyS3SJpnFWkzNDqOFGIWcfR86DnmARTQ1HKIL33ExPiemeOhYSSjzlSUZZuE4TveoJLnBUOFof6KiysCbnAEcZgcUNTDOwkqWu3RWtmGpZwlHhJENdZ3miGz0lJlsKnjbwqSHQjpxnFDlTLLwqJPMZMjd7KrzkSG7VsxXBZE+F8YZkb01Oe00yyRK9psh5SYh29ySPKBo2ylNht7ZkZnsKenjKNJu9PNEyZpaCHv4Kt6RQsLvAVp7M9kIimmCUwGeWqLMmGuIotYMmWNpSahkhZw9FqZsVnKJhsjAHvtHMsTM9fCI06Dx/u3vfUXCqfsKRc4oFY2jMsoo/7DJDwZ1CsIKnJu+J9ldkpmiCxQx1rWjI+T9FwcWWzOuaYH0Hj7klNRVWEQpmaqosakiGNTFHdjS/qnUdmf0NJW5xsL0HhimCCZZSRzmSPTXJQ4aaztAwtZnoabebJ+htCaZ7Cm535ByoqXKbX1WRc4Eh2MkRXWzImVc96Cj4VdOKVxR84VdQsIUM8Psoou2byVHyZFuq7O8otbSQ2UAoeEWTudATLGSpZzVLlXVkPU2Jc+27lsw2jmg5T5VhbeE3BT083K9WsTTkFU/Osi0rC5lRlpwRHUiesNS0sOvmqGML1aRbPAxTJD9ZKtxuob+hhl8cwYGWpJ8nub7t5p6coYbMovZ1BTdaKn1jYD6h4GFDNFyT/Kqe1XCXphXHOKLZmuRSRdBPEfVUXQzJm5YGPGGJdvAEr7hHNdGZnuBvrpciGmopOLf5N0uVMy0FfYToJk90uUCbJupaVpO53UJXR2bVpoU00V2KOo4zMFrBd0Jtz2pa0clT5Q5L8IpQ177mWQejPMEJhuQjS10ref6HHjdEhy1P1EYR7GtO0uSsKJQYLiTnG1rVScj5lyazpqWGl5uBbRWl7m6ixGOOnEsMJR7z8J0n6KMnCdxhiNYQCoZ6CmYLnO8omC3MkW3bktlPmEt/VQQHejL3+dOE5FlPdK/Mq8hZxxJtLyRrepLThYKbLZxkSb5W52vYxNOaOxUF0yxMUPwBTYqCzy01XayYK0sJyWBLqX0MwU5CzoymRzV0EjjeUeLgDpTo6ij42ZAzvD01dHUUTPLU96MdLbBME8nFBn7zJCMtJcZokn8YoqU0FS5WFKyniHobguMcmW8N0XkWZjkyN3hqOMtS08r+/xTBwpZSZ3qiVRX8SzMHHjfUNFjgHEPmY9PL3ykEzxkSre/1ZD6z/NuznuB0RcE1TWTm9zRgfUWVJiG6yrzgmWPXC8EAR4Wxhlad0ZbgQyEz3pG5RVEwwDJH2mgKpjcTiCOzn1lfUWANFbZ2BA8balnEweJC9J0iuaeZoI+ippFCztEKVvckR2iice1JvhVytrQwUAZpgsubCPaU7xUe9vWnaOpaSBEspalykhC9bUlOMpT42ZHca6hyrqKmw/wMR8H5ZmdFoBVJb03O4UL0tSNnvIeRmkrLWqrs78gcrEn2tpcboh0UPOW3UUR9PMk4T4nnNKWmCjlrefhCwxRNztfmIQVdDElvS4m1/WuOujoZCs5XVOjtKPGokJzsYCtFYoWonSPT21DheU/wWhM19FcElwqNGOsp9Q8N/cwXaiND1MmeL1Q5XROtYYgGeFq1aTMsoMmcrKjQrOFQTQ1fmBYhmW6o8Jkjc7iDJRTBIo5kgJD5yMEYA3srCg7VFKwiVJkmRCc5ohGOKhsYMn/XBLdo5taZjlb9YAlGWRimqbCsoY7HFAXLa5I1HPRxMMsQDHFkWtRNniqT9UEeNjcE7RUlrCJ4R2CSJuqlKHWvJXjAUNcITYkenuBRB84TbeepcqTj3zZyFJzgYQdHnqfgI0ddUwS6GqWpsKWhjq9cV0vBAEMN2znq+EBfIWT+pClYw5xsTlJU6GeIBsjGmmANTzJZiIYpgrM0Oa8ZMjd7NP87jxhqGOhJlnQtjuQpB+8aEE00wZFznSJPyHxgH3HkPOsJFvYk8zqCHzTs1BYOa4J3PFU+UVRZxlHDM4YavlNUuMoRveiZA2d7grMNc2g+RbSCEKzmgYsUmWmazFJyoiOZ4KnyhKOGRzWJa0+moyV4TVHDzn51Awtqaphfk/lRQ08FX1iiqxTB/kLwd0VynKfEvI6cd4XMV5bMhZ7gZUWVzYQ6Nm2BYzxJbw3bGthEUUMfgbGeorae6DxHtJoZ6alhZ0+ytiVoK1R4z5PTrOECT/SugseEOlb1MMNR4VRNcJy+V1Hg9ONClSZFZjdHlc6W6FBLdJja2MC5hhpu0DBYEY1TFGwiFAxRRCsYkiM9JRb0JNMVkW6CZYT/2EiTGWmo8k+h4FhDNE7BvppoTSFnmCV5xZKzvcCdDo7VVPnIU+I+Rc68juApC90MwcFCsJ5hDqxgScYKreruyQwTqrzoqDCmhWi4IbhB0Yrt3RGa6GfDv52rKXWhh28dyZaWUvcZeMTBaZoSGyiCtRU5J8iviioHaErs7Jkj61syVzTTgOcUOQ8buFBTYWdL5g3T4qlpe0+wvD63heAXRfCCIed9RbCsp2CiI7raUOYOTU13N8PNHvpaGvayo4a3LLT1lDrVEPT2zLUlheB1R+ZTRfKWJ+dcocLJfi11vyJ51lLqJ0WD7tRwryezjiV5W28uJO9qykzX8JDe2lHl/9oyBwa2UMfOngpXCixvKdXTk3wrsKmiVYdZIqsoWEERjbcUNDuiaQomGoIbFdEHmsyWnuR+IeriKDVLnlawlyNHKwKlSU631PKep8J4Q+ayjkSLKYLhalNHlYvttb6fHm0p6OApsZ4l2VfdqZkjuysy6ysKLlckf1KUutCTs39bmCgEyyoasIWlVaMF7mgmWtBT8Kol5xpH9IGllo8cJdopcvZ2sImlDmMIbtDk3KIpeNiS08lQw11NFPTwVFlPP6pJ2gvRfI7gQUfmNAtf6Gs0wQxDsKGlVBdF8rCa3jzdwMaGHOsItrZk7hAyOzpK9VS06j5F49b0VNGOOfKs3lDToMsMBe9ZWtHFEgxTJLs7qrygKZjUnmCYoeAqeU6jqWuLJup4WghOdvCYJnrSkSzoyRkm5M2StQwVltPkfCAk58tET/CSg+8MUecmotMEnhBKfWBIZsg2ihruMJQaoIm+tkTLKEqspMh00w95gvFCQRtDwTT1gVDDSEVdlwqZfxoQRbK0g+tbiBZxzKlpnpypejdDwTaeOvorMk/IJE10h9CqRe28hhLbe0pMsdSwv4ZbhKivo2BjDWfL8UKJgeavwlwb5KlwhyE4u4XkGE2ytZCznKLCDZZq42VzT8HLCrpruFbIfOIINmh/qCdZ1ZBc65kLHR1Bkyf5zn6pN3SvGKIlFNGplhrO9QSXanLOMQTLCa0YJCRrCZm/CZmrLTm7WzCK4GJDiWUdFeYx1LCFg3NMd0XmCuF3Y5rITLDUsYS9zoHVzwnJoYpSTQoObyEzr4cFBNqYTopoaU/wkyLZ2lPhX/5Y95ulxGTV7KjhWrOZgl8MyUUafjYraNjNU1N3IWcjT5WzWqjwtoarHSUObGYO3GCJZpsBlnJGPd6ZYLyl1GdCA2625IwwJDP8GUKymbzuyPlZlvTUsaUh5zFDhRWFzPKKZLAlWdcQbObgF9tOqOsmB1dqcqYJmWstFbZRRI9poolmqiLnU0POvxScpah2iSL5UJNzgScY5+AuIbpO0YD3NCW+dLMszFSdFCWGqG6eVq2uYVNDdICGD6W7EPRWZEY5gpsE9rUkS3mijzzJnm6UpUFXG1hCUeVoS5WfNcFpblELL2qqrCvMvRfd45oalvKU2tiQ6ePJOVMRXase9iTtLJztPxJKLWpo2CRDcJwn2sWSLKIO1WQWNTCvpVUvOZhgSC40JD0dOctaSqzkCRbXsKlb11Oip6PCJ0IwSJM31j3akRxlP7Rwn6aGaUL0qiLnJkvB3xWZ2+Q1TfCwpQH3G0o92UzmX4o/oJNQMMSQc547wVHhdk+VCw01DFYEnTxzZKAm74QmeNNR1w6WzEhNK15VJzuCdxQ53dRUDws5KvwgBMOEgpcVNe0hZI6RXT1Jd0cyj5nsaEAHgVmGaJIlWdsc5Ui2ElrRR6jrRAttNMEAIWrTDFubkZaok7/AkzfIwfuWVq0jHzuCK4QabtLUMVPB3kJ0oyHTSVFlqMALilJf2Rf8k5aaHtMfayocLBS8L89oKoxpJvnAkDPa0qp5DAUTHKWmCcnthlou8iCKaFFLHWcINd1nyIwXqrSxMNmSs6KmoL2QrKuWtlQ5V0120xQ5vRyZS1rgFkWwhiOwiuQbR0OOVhQM9iS3tiXp4RawRPMp5tDletOOBL95MpM01dZTBM9pkn5qF010rIeHFcFZhmSGpYpTsI6nwhqe5C9ynhlpp5ophuRb6WcJFldkVnVEwwxVfrVkvnWUuNLCg5bgboFHPDlDPDmnK7hUrWiIbjadDclujlZcaokOFup4Ri1kacV6jmrrK1hN9bGwpKEBQ4Q6DvIUXOmo6U5LqQM6EPyiKNjVkPnJkDPNEaxhiFay5ExW1NXVUGqcpYYdPcGiCq7z/TSlbhL4pplWXKd7NZO5QQFrefhRQW/NHOsqcIglc4UhWklR8K0QzbAw08CBDnpbgqXdeD/QUsM4RZXDFBW6WJKe/mFPdH0LtBgiq57wFLzlyQzz82qYx5D5WJP5yVJDW01BfyHnS6HKO/reZqId1WGa4Hkh2kWodJ8i6KoIPlAj2hPt76CzXsVR6koPRzWTfKqIentatYpQw2me4AA3y1Kind3SwoOKZDcFXTwl9tWU6mfgRk9d71sKtlNwrjnYw5tC5n5LdKiGry3JKNlHEd3oaMCFHrazBPMp/uNJ+V7IudcSbeOIdjUEdwl0VHCOZo5t6YluEuaC9mQeMgSfOyKnYGFHcIeQ84yQWbuJYJpZw5CzglDH7gKnWqqM9ZTaXcN0TeYhR84eQtJT76JJ1lREe7WnnvsMmRc9FQ7SBBM9mV3lCUdmHk/S2RAMt0QjFNFqQpWjDPQ01DXWUdDBkXziKPjGEP3VP+zIWU2t7im41FOloyWzn/L6dkUy3VLDaZ6appgDLHPjJEsyvJngWEPUyVBiAaHCTEXwrLvSEbV1e1gKJniicWorC1MUrVjB3uDhJE/wgSOzk1DXpk0k73qCM8xw2UvD5kJmDUfOomqMpWCkJRlvKXGmoeBm18USjVIk04SClxTB6YrgLAPLWYK9HLUt5cmc0vYES8GnTeRc6skZbQkWdxRsIcyBRzx1DbTk9FbU0caTPOgJHhJKnOGIVhQqvKmo0llRw9sabrZkDtdg3PqaKi9oatjY8B+G371paMg6+mZFNNtQ04mWBq3rYLOmtWWQp8KJnpy9DdFensyjdqZ+yY40VJlH8wcdLzC8PZnvHMFUTZUrDTkLyQaGus5X5LzpYAf3i+e/ZlhqGqWhh6Ou6xTR9Z6oi5AZZtp7Mj2EEm8oSpxiYZCHU/1fbGdNNNRRoZMhmilEb2gqHOEJDtXkHK/JnG6IrvbPCwV3NhONVdS1thBMs1T4QOBcTWa2IzhMk2nW5Kyn9tXUtpv9RsG2msxk+ZsQzRQacJncpgke0+T8y5Fzj8BiGo7XlJjaTIlpQs7KFjpqGnKuoyEPeIKnFMkZHvopgh81ySxNFWvJWcKRs70j2FOT012IllEEO1n4pD1513Yg2ssQPOThOkvyrqHUdEXOSEsihmBbTbKX1kLBPWqWkLOqJbjB3GBIZmoa8qWl4CG/iZ7oiA72ZL7TJNeZUY7kFQftDcHHluBzRbCegzMtrRjVQpX2lgoPKKLJAkcbMl01XK2p7yhL8pCBbQ3BN2avJgKvttcrWDK3CiUOVxQ8ZP+pqXKyIxnmBymCg5vJjNfkPK4+c8cIfK8ocVt7kmfd/I5SR1hKvCzUtb+lhgc00ZaO6CyhIQP1Uv4yIZjload72PXX0OIJvnFU+0Zf6MhsJwTfW0r0UwQfW4LNLZl5HK261JCZ4qnBaAreVAS3WrjV0LBnNDUNNDToCEeFfwgcb4gOEqLRhirWkexrCEYKVV711DLYEE1XBEsp5tpTGjorkomKYF9FDXv7fR3BGwbettSxnyL53MBPjsxDZjMh+VUW9NRxq1DhVk+FSxQcaGjV9Pawv6eGByw5qzoy7xk4RsOShqjJwWKe/1pEEfzkobeD/dQJmpqedcyBTy2sr4nGNRH0c0SPWTLrqAc0OQcb/gemKgqucQT7ySWKCn2EUotoCvpZct7RO2sy/QW0IWcXd7pQRQyZVwT2USRO87uhjioTLKV2brpMUcMQRbKH/N2T+UlTpaMls6cmc6CCNy3JdYYSUzzJQ4oSD3oKLncULOiJvjBEC2oqnCJkJluCYy2ZQ5so9YYlZ1VLlQU1mXEW1jZERwj/MUSRc24TdexlqLKfQBtDTScJUV8FszXBEY5ktpD5Ur9hYB4Nb1iikw3JoYpkKX+RodRKFt53MMuRnKSpY31PwYaGaILh3wxJGz9TkTPEETxoCWZrgvOlmyMzxFEwVJE5xZKzvyJ4WxEc16Gd4Xe3Weq4XH2jKRikqOkGQ87hQnC7wBmGYLAnesX3M+S87eFATauuN+Qcrh7xIxXJbUIdMw3JGE3ylCWzrieaqCn4zhGM19TQ3z1oH1AX+pWEqIc7wNGAkULBo/ZxRaV9NNyh4Br3rCHZzbzmSfawBL0dNRwpW1kK9mxPXR9povcdrGSZK9c2k0xwFGzjuniCtRSZCZ6ccZ7gaktmgAOtKbG/JnOkJrjcQTdFMsxRQ2cLY3WTIrlCw1eWKn8R6pvt4GFDso3QoL4a3nLk3G6JrtME3dSenpx7PNFTmga0EaJTLQ061sEeQoWXhSo9LTXsaSjoJQRXeZLtDclbCrYzfzHHeaKjHCVOUkQHO3JeEepr56mhiyaYYKjjNU+Fed1wS5VlhWSqI/hYUdDOkaxiKehoyOnrCV5yBHtbWFqTHCCwtpDcYolesVR5yUzTZBb3RNMd0d6WP+SvhuBmRcGxnuQzT95IC285cr41cLGQ6aJJhmi4TMGempxeimBRQw1tFKV+8jd6KuzoSTqqDxzRtpZkurvKEHxlqXKRIjjfUNNXQsNOsRScoWFLT+YeRZVD3GRN0MdQcKqQjHDMrdGGVu3iYJpQx3WGUvfbmxwFfR20WBq0oYY7LMFhhgYtr8jpaEnaOzjawWWaTP8mMr0t/EPDPoqcnxTBI5o58L7uoWnMrpoqPwgVrlAUWE+V+TQl9rawoyP6QGAlQw2TPRX+YSkxyBC8Z6jhHkXBgQL7WII3DVFnRfCrBfxewv9D6xsyjys4VkhWb9pUU627JllV0YDNHMku/ldNMMXDEo4aFnAkk4U6frNEU4XgZUPmEKHUl44KrzmYamjAbh0JFvGnaTLPu1s9jPCwjFpYiN7z1DTOk/nc07CfDFzmCf7i+bfNHXhDtLeBXzTBT5rkMvWOIxpl4EMh2LGJBu2syDnAEx2naEhHDWMMzPZEhygyS1mS5RTJr5ZkoKbEUoYqr2kqdDUE8ztK7OaIntJkFrIECwv8LJTaVx5XJE86go8dFeZ3FN3rjabCAYpoYEeC9zzJVULBbmZhDyd7ko09ydpNZ3nm2Kee4FPPXHnYEF1nqOFEC08LUVcDvYXkJHW8gTaKCk9YGOeIJhqiE4ToPEepdp7IWFjdwnWaufGMwJJCMtUTTBBK9BGCOy2tGGrJTHIwyEOzp6aPzNMOtlZkDvcEWpP5SVNhfkvDxhmSazTJXYrM9U1E0xwFVwqZQwzJxw6+kGGGUj2FglGGmnb1/G51udRSMNlTw6GGnCcUwVcOpmsqTHa06o72sw1RL02p9z0VbnMLOaIX3QKaYKSCFQzBKEUNHTSc48k53RH9wxGMtpQa5KjjW0W0n6XCCCG4yxNNdhQ4R4l1Ff+2sSd6UFHiIEOyqqFgT01mEUMD+joy75jPhOA+oVVLm309FR4yVOlp4RhLiScNmSmaYF5Pw0STrOIoWMSR2UkRXOMp+M4SHW8o8Zoi6OZgjKOaFar8zZDzkWzvKOjkKBjmCXby8JahhjXULY4KlzgKLvAwxVGhvyd4zxB1d9T0piazmKLCVZY5sKiD0y2ZSYrkUEPUbIk+dlQ4SJHTR50k1DPaUWIdTZW9NJwnJMOECgd7ou/MnppMJ02O1VT4Wsh85MnZzcFTngpXGKo84qmwgKbCL/orR/SzJ2crA+t6Mp94KvxJUeIbT3CQu1uIdlQEOzlKfS3UMcrTiFmOuroocrZrT2AcmamOKg8YomeEKm/rlT2sociMaybaUlFhuqHCM2qIJ+rg4EcDFymiDSxzaHdPcpE62pD5kyM5SBMoA1PaUtfIthS85ig1VPiPPYXgYEMNk4Qq7TXBgo7oT57gPUdwgCHzhIVFPFU6OYJzHAX9m5oNrVjeE61miDrqQ4VSa1oiURTsKHC0IfjNwU2WzK6eqK8jWln4g15TVBnqmDteCJ501PGAocJhhqjZdtBEB6lnhLreFJKxmlKbeGrqLiSThVIbCdGzloasa6lpMQXHCME2boLpJgT7yWaemu6wBONbqGNVRS0PKIL7LckbjmQtR7K8I5qtqel+T/ChJTNIKLjdUMNIRyvOEko9YYl2cwQveBikCNawJKcLBbc7+JM92mysNvd/Fqp8a0k6CNEe7cnZrxlW0wQXaXjaktnRwNOGZKYiONwS7a1JVheq3WgJHlQUGKHKmp4KAxXR/ULURcNgoa4zhKSLpZR3kxRRb0NmD0OFn+UCS7CzI1nbP6+o4x47QZE5xRCt3ZagnYcvmpYQktXdk5YKXTzBC57kKEe0VVuiSYqapssMS3C9p2CKkHOg8B8Pa8p5atrIw3qezIWanMGa5HRDNF6RM9wcacl0N+Q8Z8hsIkSnaIIdHRUOEebAPy1zbCkhM062FCJtif7PU+UtoVXzWKqM1PxXO8cfdruhFQ/a6x3JKYagvVDhQEtNiyiiSQ7OsuRsZUku0CRNDs4Sog6KKjsZgk2bYJqijgsEenoKeniinRXBn/U3lgpPdyDZynQx8IiioMnCep5Ky8mjGs6Wty0l1hUQTcNWswS3WRp2kCNZwJG8omG8JphPUaFbC8lEfabwP7VtM9yoaNCAjpR41VNhrD9LkbN722v0CoZMByFzhaW+MyzRYEWFDQwN2M4/JiT76PuljT3VU/A36eaIThb+R9oZGOAJ9tewkgGvqOMNRWYjT/Cwu99Q8LqDE4TgbLWxJ1jaDDAERsFOFrobgjUsBScaguXU8kKm2RL19tRypSHnHNlHiIZqgufs4opgQdVdwxBNNFBR6kVFqb8ogimOzB6a6HTzrlDHEpYaxjiiA4TMQobkDg2vejjfwJGWmnbVFAw3H3hq2NyQfG7hz4aC+w3BbwbesG0swYayvpAs6++Ri1Vfzx93mFChvyN5xVHTS+0p9aqCAxyZ6ZacZyw5+7uuQkFPR9DDk9NOiE7X1PCYJVjVUqq7JlrHwWALF5nfHNGjApdpqgzx5OwilDhCiDYTgnc9waGW4BdLNNUQvOtpzDOWHDH8D7TR/A/85KljEQu3NREc4Pl/6B1Hhc8Umb5CsKMmGC9EPcxoT2amwHNCmeOEnOPbklnMkbOgIvO5UMOpQrS9UGVdt6iH/fURjhI/WOpaW9OKLYRod6HCUEdOX000wpDZQ6hwg6LgZfOqo1RfT/CrJzjekXOGhpc1VW71ZLbXyyp+93ILbC1kPtIEYx0FIx1VDrLoVzXRKRYWk809yYlC9ImcrinxtabKnzRJk3lAU1OLEN1j2zrYzr2myHRXJFf4h4QKT1qSTzTB5+ZNTzTRkAxX8FcLV2uS8eoQQ2aAkFzvCM72sJIcJET3WPjRk5wi32uSS9rfZajpWEvj9hW42F4o5NytSXYy8IKHay10VYdrcl4SkqscrXpMwyGOgtkajheSxdQqmpxP1L3t4R5PqasFnrQEjytq6qgp9Y09Qx9o4S1FzhUCn1kyHSzBWLemoSGvOqLNhZyBjmCaAUYpMgt4Ck7wBBMMwWKWgjsUwTaGVsxWC1mYoKiyqqeGKYqonSIRQ3KIkHO0pmAxTdBHkbOvfllfr+AA+7gnc50huVKYK393FOyg7rbPO/izI7hE4CnHHHnJ0ogNPRUGeUpsrZZTBJcrovUcJe51BPsr6GkJdhCCsZ6aTtMEb2pqWkqeVtDXE/QVggsU/Nl86d9RMF3DxvZTA58agu810RWawCiSzzXBeU3MMW9oyJUedvNEvQyNu1f10BSMddR1vaLCYpYa/mGocLSiYDcLbQz8aMn5iyF4xBNMs1P0QEOV7o5gaWGuzSeLue4tt3ro7y4Tgm4G/mopdZgl6q0o6KzJWE3mMksNr3r+a6CbT8g5wZNzT9O7fi/zpaOmnz3BRoqos+tv9zMbdpxsqDBOEewtJLt7cg5wtKKbvldpSzRRCD43VFheCI7yZLppggMVBS/KMAdHODJvOwq2NQSbKKKPLdFWQs7Fqo+mpl01JXYRgq8dnGLhTiFzqmWsUMdpllZdbKlyvSdYxhI9YghOtxR8LgSLWHK62mGGVoxzBE8LNWzqH9CUesQzFy5RQzTc56mhi6fgXEWwpKfE5Z7M05ZgZUPmo6auiv8YKzDYwWBLMErIbKHJvOwIrvEdhOBcQ9JdU1NHQ7CXn2XIDFBKU2WAgcX9UAUzDXWd5alwuyJ41Z9rjKLCL4aCp4WarhPm2rH+SaHUYE001JDZ2ZAzXPjdMpZWvC9wmqIB2lLhQ01D5jO06hghWMndbM7yRJMsoCj1vYbnFQVrW9jak3OlEJ3s/96+p33dEPRV5GxiqaGjIthUU6FFEZyqCa5qJrpBdzSw95IUnOPIrCUUjRZQFrbw5PR0R1qiYx3cb6nrWUMrBmmiBQxVHtTew5ICP/ip6g4hed/Akob/32wvBHsIOX83cI8hGeNeNPCIkPmXe8fPKx84OMSRM1MTdXSwjCZ4S30jVGhvqTRak/OVhgGazHuOCud5onEO1lJr6ecVyaOK6H7zqlBlIaHE0oroCgfvGJIdPcmfLNGLjpz7hZwZQpUbFME0A1cIJa7VNORkgfsMBatbKgwwJM9bSvQXeNOvbIjelg6WWvo5kvbKaJJNHexkKNHL9xRyFlH8Ti2riB5wVPhUk7nGkJnoCe428LR/wRGdYIlmWebCyxou1rCk4g/ShugBDX0V0ZQWkh0dOVsagkM0yV6OoLd5ye+pRlsCr0n+KiQrGuq5yJDzrTAXHtLUMduTDBVKrSm3eHL+6ijxhFDX9Z5gVU/wliHYTMiMFpKLNMEywu80wd3meoFmt6VbRMPenhrOc6DVe4pgXU8DnnHakLOIIrlF4FZPIw6R+zxBP0dyq6OOZ4Q5sLKCcz084ok+VsMMyQhNZmmBgX5xIXOEJTmi7VsGTvMTNdHHhpzdbE8Du2oKxgvBqQKdDDnTFOylCFaxR1syz2iqrOI/FEpNc3C6f11/7+ASS6l2inq2ciTrCCzgyemrCL5SVPjQkdPZUmGy2c9Sw9FtR1sS30RmsKPCS4rkIC/2U0MduwucYolGaPjKEyhzmiPYXagyWbYz8LWBDdzRimAXzxx4z8K9hpzlhLq+NiQ97HuKorMUfK/OVvC2JfiHUPCQI/q7J2gjK+tTDNxkCc4TMssqCs4TGtLVwQihyoAWgj9bosU80XGW6Ac9TJGziaUh5+hnFcHOnlaM1iRn29NaqGENTTTSUHCH2tWTeV0osUhH6psuVLjRUmGWhm6OZEshGeNowABHcJ2Bpy2ZszRcKkRXd2QuKVEeXnbfaEq825FguqfgfE2whlChSRMdron+LATTPQ2Z369t4B9C5gs/ylzv+CMmepIDPclFQl13W0rspPd1JOcbghGOEutqCv5qacURQl3dDKyvyJlqKXGPgcM9FfawJAMVmdcspcYKOZc4GjDYkFlK05olNMHyHn4zFNykyOxt99RkHlfwmiHo60l2EKI+mhreEKp080Tbug08BVPcgoqC5zWt+NLDTZ7oNSF51N1qie7Va3uCCwyZbkINf/NED6jzOsBdZjFN8oqG3wxVunqCSYYKf3EdhJyf9YWGf7tRU2oH3VHgPr1fe5J9hOgHd7xQ0y7qBwXr23aGErP0cm64JVjZwsOGqL+mhNgZmhJLW2oY4UhedsyBgzrCKrq7BmcpNVhR6jBPq64Vgi+kn6XE68pp8J5/+0wRHGOpsKenQn9DZntPzjRLZpDAdD2fnSgkG9tmIXnUwQ6WVighs7Yi2MxQ0N3CqYaCXkJ0oyOztMDJjmSSpcpvlrk0RMMOjmArQ04PRV1DO1FwhCVaUVPpKUM03JK5SxPsIWRu8/CGHi8UHChiqGFDTbSRJWeYUDDcH6vJWUxR4k1FXbMUwV6e4AJFXS8oMqsZKqzvYQ9DDQdZckY4aGsIhtlubbd2r3j4QBMoTamdPZk7O/Bf62lacZwneNjQoGcdVU7zJOd7ghsUHOkosagic6cnWc8+4gg285R6zZP5s1/LUbCKIznTwK36PkdwlOrl4U1LwfdCCa+IrvFkmgw1PCAUXKWo0sURXWcI2muKJlgyFzhynCY4RBOsqCjoI1R5zREco0n2Vt09BQtYSizgKNHfUmUrQ5UOCh51BFcLmY7umhYqXKQomOop8bUnWNNQcIiBcYaC6xzMNOS8JQQfeqKBmmglB+97ok/lfk3ygaHSyZaCRTzRxQo6GzLfa2jWBPepw+UmT7SQEJyiyRkhBLMVOfcoMjcK0eZChfUNzFAUzCsEN5vP/X1uP/n/aoMX+K+nw/Hjr/9xOo7j7Pju61tLcgvJpTWXNbfN5jLpi6VfCOviTktKlFusQixdEKWmEBUKNaIpjZRSSOXSgzaaKLdabrm1/9nZ+/f+vd/vz/v9+Xy+zZ7PRorYoZqyLrCwQdEAixxVOEXNNnjX2nUSRlkqGmWowk8lxR50JPy9Bo6qJXaXwNvREBvnThPEPrewryLhcAnj5WE15Fqi8W7R1sAuEu86S4ENikItFN4xkv9Af4nXSnUVcLiA9xzesFpivRRVeFKtsMRaKBhuSbjOELnAUtlSQUpXgdfB4Z1oSbnFEetbQ0IrAe+Y+pqnDcEJFj6S8LDZzZHwY4e3XONNlARraomNEt2bkvGsosA3ioyHm+6jCMbI59wqt4eeara28IzEmyPgoRaUOEDhTVdEJhmCoTWfC0p8aNkCp0oYqih2iqGi4yXeMkOsn4LdLLnmKfh/YogjNsPebeFGR4m9BJHLzB61XQ3BtpISfS2FugsK9FAtLWX1dCRcrCnUp44CNzuCowUZmxSRgYaE6Za0W2u/E7CVXCiI/UOR8aAm1+OSyE3mOUcwyc1zBBeoX1kiKy0Zfxck1Gsyulti11i83QTBF5Kg3pDQThFMVHiPSlK+0cSedng/VaS8bOZbtsBcTcZAR8JP5KeqQ1OYKAi20njdNNRpgnsU//K+JnaXJaGTomr7aYIphoRn9aeShJWKEq9LcozSF7QleEfDI5LYm5bgVkFkRwVDBCVu0DDIkGupo8TZBq+/pMQURYErJQmPKGKjNDkWOLx7Jd5QizdUweIaKrlP7SwJDhZvONjLkOsBBX9UpGxnydhXkfBLQ8IxgojQbLFnJf81JytSljclYYyEFyx0kVBvKWOFJmONpshGAcsduQY5giVNCV51eOdJYo/pLhbvM0uDHSevNKRcrKZIqnCtJeEsO95RoqcgGK4ocZcho1tTYtcZvH41pNQ7vA0WrhIfOSraIIntIAi+NXWCErdbkvrWwjRLrt0NKUdL6KSOscTOdMSOUtBHwL6OLA0vNSdynaWQEnCpIvKaIrJJEbvHkmuNhn6OjM8VkSGSqn1uYJCGHnq9I3aLhNME3t6GjIkO7xrNFumpyTNX/NrwX7CrIRiqqWijI9JO4d1iieykyfiposQIQ8YjjsjlBh6oHWbwRjgYJQn2NgSnNycmJAk3NiXhx44Sxykihxm8ybUwT1OVKySc7vi3OXVkdBJ4AyXBeksDXG0IhgtYY0lY5ahCD0ehborIk5aUWRJviMA7Xt5kyRjonrXENkm8yYqgs8VzgrJmClK20uMM3jRJ0FiQICQF9hdETlLQWRIb5ki6WDfWRPobvO6a4GP5mcOrNzDFELtTkONLh9dXE8xypEg7z8A9jkhrQ6Fhjlg/QVktJXxt4WXzT/03Q8IaQWSqIuEvloQ2mqC9Jfi7wRul4RX3pSPlzpoVlmCtI2jvKHCFhjcM3sN6lqF6HxnKelLjXWbwrpR4xzuCrTUZx2qq9oAh8p6ixCUGr78g8oyjRAtB5CZFwi80VerVpI0h+IeBxa6Zg6kWvpDHaioYYuEsRbDC3eOmC2JvGYLeioxGknL2UATNJN6hmtj1DlpLvDVmocYbrGCVJKOrg4X6DgddLA203BKMFngdJJFtFd7vJLm6KEpc5yjQrkk7M80SGe34X24nSex1Ra5Omgb71JKyg8SrU3i/kARKwWpH0kOGhKkObyfd0ZGjvyXlAkVZ4xRbYJ2irFMkFY1SwyWxr2oo4zlNiV+7zmaweFpT4kR3kaDAFW6xpSqzJay05FtYR4HmZhc9UxKbbfF2V8RG1MBmSaE+kmC6JnaRXK9gsiXhJHl/U0qM0WTcbyhwkYIvFGwjSbjfwhiJt8ZSQU+Bd5+marPMOkVkD0muxYLIfEuhh60x/J92itguihJSEMySVPQnTewnEm+620rTQEMsOfo4/kP/0ARvWjitlpSX7GxBgcMEsd3EEeYWvdytd+Saawi6aCIj1CkGb6Aj9rwhx16Cf3vAwFy5pyLhVonXzy51FDpdEblbkdJbUcEPDEFzQ8qNmhzzLTmmKWKbFCXeEuRabp6rxbvAtLF442QjQ+wEA9eL1xSR7Q0JXzlSHjJ4exq89yR0laScJ/FW6z4a73pFMEfDiRZvuvijIt86RaSFOl01riV2mD1UEvxGk/Geg5aWwGki1zgKPG9J2U8PEg8qYvMsZeytiTRXBMslCU8JSlxi8EabjwUldlDNLfzTUmCgxWsjqWCOHavYAqsknKFIO0yQ61VL5AVFxk6WhEaCAkdJgt9aSkzXlKNX2jEa79waYuc7gq0N3GDJGCBhoiTXUEPsdknCUE1CK0fwsiaylSF2uiDyO4XX3pFhNd7R4itFGc0k/ElBZwWvq+GC6szVeEoS/MZ+qylwpKNKv9Z469UOjqCjwlusicyTxG6VpNxcQ8IncoR4RhLbR+NdpGGmJWOcIzJGUuKPGpQg8rrG21dOMqQssJQ4RxH5jaUqnZuQ0F4Q+cjxLwPtpZbIAk3QTJHQWBE5S1BokoVtDd6lhqr9UpHSUxMcIYl9pojsb8h4SBOsMQcqvOWC2E8EVehqiJ1hrrAEbQxeK0NGZ0Gkq+guSRgniM23bIHVkqwx4hiHd7smaOyglyIyQuM978j4VS08J/A2G1KeMBRo4fBaSNhKUEZfQewVQ/C1I+MgfbEleEzCUw7mKXI0M3hd1EESVji8x5uQ41nxs1q4RMJCCXs7Iq9acpxn22oSDnQ/sJTxsCbHIYZiLyhY05TY0ZLIOQrGaSJDDN4t8pVaIrsqqFdEegtizc1iTew5Q4ayBDMUsQMkXocaYkc0hZua412siZ1rSXlR460zRJ5SlHGe5j801RLMlJTxtaOM3Q1pvxJ45zUlWFD7rsAbpfEm1JHxG0eh8w2R7QQVzBUw28FhFp5QZzq8t2rx2joqulYTWSuJdTYfWwqMFMcovFmSyJPNyLhE4E10pHzYjOC3huArRa571ZsGajQpQx38SBP5pyZB6lMU3khDnp0MBV51BE9o2E+TY5Ml2E8S7C0o6w1xvCZjf0HkVEHCzFoyNmqC+9wdcqN+Tp7jSDheE9ws8Y5V0NJCn2bk2tqSY4okdrEhx1iDN8cSudwepWmAGXKcJXK65H9to8jYQRH7SBF01ESUJdd0TayVInaWhLkOjlXE5irKGOnI6GSWGCJa482zBI9rCr0jyTVcEuzriC1vcr6mwFGSiqy5zMwxBH/TJHwjSPhL8+01kaaSUuMFKTcLEvaUePcrSmwn8DZrgikWb7CGPxkSjhQwrRk57tctmxLsb9sZvL9LSlyuSLlWkqOjwduo8b6Uv1DkmudIeFF2dHCgxVtk8dpIvHpBxhEOdhKk7OLIUSdJ+cSRY57B+0DgGUUlNfpthTfGkauzxrvTsUUaCVhlKeteTXCoJDCa2NOKhOmC4G1H8JBd4OBZReSRGkqcb/CO1PyLJTLB4j1q8JYaIutEjSLX8YKM+a6phdMsdLFUoV5RTm9JSkuDN8WcIon0NZMNZWh1q8C7SJEwV5HxrmnnTrf3KoJBlmCYI2ilSLlfEvlE4011NNgjgthzEua0oKK7JLE7HZHlEl60BLMVFewg4EWNt0ThrVNEVkkiTwpKXSWJzdRENgvKGq4IhjsiezgSFtsfCUq8qki5S1LRQeYQQ4nemmCkImWMw3tFUoUBZk4NOeZYEp4XRKTGa6wJjrWNHBVJR4m3FCnbuD6aak2WsMTh3SZImGCIPKNgsDpVwnsa70K31lCFJZYcwwSMFcQulGTsZuEaSdBXkPGZhu0FsdUO73RHjq8MPGGIfaGIbVTk6iuI3GFgucHrIQkmWSJdBd7BBu+uOryWAhY7+Lki9rK5wtEQzWwvtbqGhIMFwWRJsElsY4m9IIg9L6lCX0VklaPAYkfkZEGDnOWowlBJjtMUkcGK4Lg6EtoZInMUBVYLgn0UsdmCyCz7gIGHFfk+k1QwTh5We7A9x+IdJ6CvIkEagms0hR50eH9UnTQJ+2oiKyVlLFUE+8gBGu8MQ3CppUHesnjTHN4QB/UGPhCTHLFPHMFrCqa73gqObUJGa03wgbhHkrCfpEpzNLE7JDS25FMKhlhKKWKfCgqstLCPu1zBXy0J2ztwjtixBu8UTRn9LVtkmCN2iyFhtME70JHRQ1KVZXqKI/KNIKYMCYs1GUMEKbM1bKOI9LDXC7zbHS+bt+1MTWS9odA9DtrYtpbImQJ2VHh/lisEwaHqUk1kjKTAKknkBEXkbkdMGwq0dnhzLJF3NJH3JVwrqOB4Sca2hti75nmJN0WzxS6UxDYoEpxpa4htVlRjkYE7DZGzJVU72uC9IyhQL4i8YfGWSYLLNcHXloyz7QhNifmKSE9JgfGmuyLhc403Xm9vqcp6gXe3xuuv8F6VJNxkyTHEkHG2g0aKXL0MsXc1bGfgas2//dCONXiNLCX+5mB7eZIl1kHh7ajwpikyzlUUWOVOsjSQlsS+M0R+pPje/dzBXRZGO0rMtgQrLLG9VSu9n6CMXS3BhwYmSoIBhsjNBmZbgusE9BCPCP5triU4VhNbJfE+swSP27aayE8tuTpYYjtrYjMVGZdp2NpS1s6aBnKSHDsbKuplKbHM4a0wMFd/5/DmGyKrJSUaW4IBrqUhx0vyfzTBBLPIUcnZdrAkNsKR0sWRspumSns6Ch0v/qqIbBYUWKvPU/CFoyrDJGwSNFhbA/MlzKqjrO80hRbpKx0Jewsi/STftwGSlKc1JZyAzx05dhLEdnfQvhZOqiHWWEAHC7+30FuRcZUgaO5gpaIK+xsiHRUsqaPElTV40xQZQ107Q9BZE1nryDVGU9ZSQ47bmhBpLcYpUt7S+xuK/FiT8qKjwXYw5ypS2iuCv7q1gtgjhuBuB8LCFY5cUuCNtsQOFcT+4Ih9JX+k8Ea6v0iCIRZOtCT0Et00JW5UeC85Cg0ScK0k411HcG1zKtre3SeITBRk7WfwDhEvaYLTHP9le0m8By0JDwn4TlLW/aJOvGHxdjYUes+ScZigCkYQdNdEOhkiezgShqkx8ueKjI8lDfK2oNiOFvrZH1hS+tk7NV7nOmLHicGWEgubkXKdwdtZknCLJXaCpkrjZBtLZFsDP9CdxWsSr05Sxl6CMmoFbCOgryX40uDtamB7SVmXW4Ihlgpmq+00tBKUUa83WbjLUNkzDmY7cow1JDygyPGlhgGKYKz4vcV7QBNbJIgM11TUqZaMdwTeSguH6rOaw1JRKzaaGyxVm2EJ/uCIrVWUcZUkcp2grMsEjK+DMwS59jQk3Kd6SEq1d0S6uVmO4Bc1lDXTUcHjluCXEq+1OlBDj1pi9zgiXxnKuE0SqTXwhqbETW6RggMEnGl/q49UT2iCzgJvRwVXS2K/d6+ZkyUl7jawSVLit46EwxVljDZwoSQ20sDBihztHfk2yA8NVZghiXwrYHQdfKAOtzsayjhY9bY0yE2CWEeJ9xfzO423xhL5syS2TFJofO2pboHob0nY4GiAgRrvGQEDa/FWSsoaaYl0syRsEt3kWoH3B01shCXhTUWe9w3Bt44SC9QCh3eShQctwbaK2ApLroGCMlZrYqvlY3qYhM0aXpFkPOuoqJ3Dm6fxXrGwVF9gCWZagjPqznfkuMKQ8DPTQRO8ZqG1hPGKEm9IgpGW4DZDgTNriTxvFiq+Lz+0cKfp4wj6OCK9JSnzNSn9LFU7UhKZZMnYwcJ8s8yRsECScK4j5UOB95HFO0CzhY4xJxuCix0lDlEUeMdS6EZBkTsUkZ4K74dugyTXS7aNgL8aqjDfkCE0ZbwkCXpaWCKhl8P7VD5jxykivSyxyZrYERbe168LYu9ZYh86IkscgVLE7tWPKmJv11CgoyJltMEbrohtVAQfO4ImltiHEroYEs7RxAarVpY8AwXMcMReFOTYWe5iiLRQxJ5Q8DtJ8LQhWOhIeFESPGsILhbNDRljNbHzNRlTFbk2S3L0NOS6V1KFJYKUbSTcIIhM0wQ/s2TM0SRMNcQmSap3jCH4yhJZKSkwyRHpYYgsFeQ4U7xoCB7VVOExhXepo9ABBsYbvGWKXPME3lyH95YioZ0gssQRWWbI+FaSMkXijZXwgiTlYdPdkNLaETxlyDVIwqeaEus0aTcYcg0RVOkpR3CSJqIddK+90JCxzsDVloyrFd5ZAr4TBKfaWa6boEA7C7s6EpYaeFPjveooY72mjIccLHJ9HUwVlDhKkmutJDJBwnp1rvulJZggKDRfbXAkvC/4l3ozQOG9a8lxjx0i7nV4jSXc7vhe3OwIxjgSHjdEhhsif9YkPGlus3iLFDnWOFhtCZbJg0UbQcIaR67JjthoCyMEZRwhiXWyxO5QxI6w5NhT4U1WsJvDO60J34fW9hwzwlKij6ZAW9ne4L0s8C6XeBMEkd/LQy1VucBRot6QMlbivaBhoBgjqGiCJNhsqVp/S2SsG6DIONCR0dXhvWbJ+MRRZJkkuEjgDXJjFQW6SSL7GXK8Z2CZg7cVsbWGoKmEpzQ5elpiy8Ryg7dMkLLUEauzeO86CuwlSOlgYLojZWeJ9xM3S1PWfEfKl5ISLQ0MEKR8YOB2QfCxJBjrKPCN4f9MkaSsqoVXJBmP7EpFZ9UQfOoOFwSzBN4MQ8LsGrymlipcJQhmy0GaQjPqCHaXRwuCZwRbqK2Fg9wlClZqYicrIgMdZfxTQ0c7TBIbrChxmuzoKG8XRaSrIhhiyNFJkrC7oIAWMEOQa5aBekPCRknCo4IKPrYkvCDI8aYmY7WFtprgekcJZ3oLIqssCSMtFbQTJKwXYy3BY5oCh2iKPCpJOE+zRdpYgi6O2KmOAgvVCYaU4ySRek1sgyFhJ403QFHiVEmJHwtybO1gs8Hr5+BETQX3War0qZngYGgtVZtoqd6vFSk/UwdZElYqyjrF4HXUeFspIi9IGKf4j92pKGAdCYMVsbcV3kRF0N+R8LUd5PCsIGWoxDtBkCI0nKofdJQxT+LtZflvuc8Q3CjwWkq8KwUpHzkK/NmSsclCL0nseQdj5FRH5CNHSgtLiW80Of5HU9Hhlsga9bnBq3fEVltKfO5IaSTmGjjc4J0otcP7QsJUSQM8pEj5/wCuUuC2DWz8AAAAAElFTkSuQmCC)}"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/base16-dark.css",
    "content": ".cm-s-base16-dark.CodeMirror{background:#151515;color:#e0e0e0}.cm-s-base16-dark div.CodeMirror-selected{background:#303030}.cm-s-base16-dark .CodeMirror-line::selection,.cm-s-base16-dark .CodeMirror-line>span::selection,.cm-s-base16-dark .CodeMirror-line>span>span::selection{background:rgba(48,48,48,.99)}.cm-s-base16-dark .CodeMirror-line::-moz-selection,.cm-s-base16-dark .CodeMirror-line>span::-moz-selection,.cm-s-base16-dark .CodeMirror-line>span>span::-moz-selection{background:rgba(48,48,48,.99)}.cm-s-base16-dark .CodeMirror-gutters{background:#151515;border-right:0}.cm-s-base16-dark .CodeMirror-guttermarker{color:#ac4142}.cm-s-base16-dark .CodeMirror-guttermarker-subtle,.cm-s-base16-dark .CodeMirror-linenumber{color:#505050}.cm-s-base16-dark .CodeMirror-cursor{border-left:1px solid #b0b0b0}.cm-s-base16-dark span.cm-comment{color:#8f5536}.cm-s-base16-dark span.cm-atom,.cm-s-base16-dark span.cm-number{color:#aa759f}.cm-s-base16-dark span.cm-attribute,.cm-s-base16-dark span.cm-property{color:#90a959}.cm-s-base16-dark span.cm-keyword{color:#ac4142}.cm-s-base16-dark span.cm-string{color:#f4bf75}.cm-s-base16-dark span.cm-variable{color:#90a959}.cm-s-base16-dark span.cm-variable-2{color:#6a9fb5}.cm-s-base16-dark span.cm-def{color:#d28445}.cm-s-base16-dark span.cm-bracket{color:#e0e0e0}.cm-s-base16-dark span.cm-tag{color:#ac4142}.cm-s-base16-dark span.cm-link{color:#aa759f}.cm-s-base16-dark span.cm-error{background:#ac4142;color:#b0b0b0}.cm-s-base16-dark .CodeMirror-activeline-background{background:#202020}.cm-s-base16-dark .CodeMirror-matchingbracket{text-decoration:underline;color:#fff!important}"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/base16-light.css",
    "content": ".cm-s-base16-light.CodeMirror{background:#f5f5f5;color:#202020}.cm-s-base16-light .CodeMirror-line::selection,.cm-s-base16-light .CodeMirror-line>span::selection,.cm-s-base16-light .CodeMirror-line>span>span::selection,.cm-s-base16-light div.CodeMirror-selected{background:#e0e0e0}.cm-s-base16-light .CodeMirror-line::-moz-selection,.cm-s-base16-light .CodeMirror-line>span::-moz-selection,.cm-s-base16-light .CodeMirror-line>span>span::-moz-selection{background:#e0e0e0}.cm-s-base16-light .CodeMirror-gutters{background:#f5f5f5;border-right:0}.cm-s-base16-light .CodeMirror-guttermarker{color:#ac4142}.cm-s-base16-light .CodeMirror-guttermarker-subtle,.cm-s-base16-light .CodeMirror-linenumber{color:#b0b0b0}.cm-s-base16-light .CodeMirror-cursor{border-left:1px solid #505050}.cm-s-base16-light span.cm-comment{color:#8f5536}.cm-s-base16-light span.cm-atom,.cm-s-base16-light span.cm-number{color:#aa759f}.cm-s-base16-light span.cm-attribute,.cm-s-base16-light span.cm-property{color:#90a959}.cm-s-base16-light span.cm-keyword{color:#ac4142}.cm-s-base16-light span.cm-string{color:#f4bf75}.cm-s-base16-light span.cm-variable{color:#90a959}.cm-s-base16-light span.cm-variable-2{color:#6a9fb5}.cm-s-base16-light span.cm-def{color:#d28445}.cm-s-base16-light span.cm-bracket{color:#202020}.cm-s-base16-light span.cm-tag{color:#ac4142}.cm-s-base16-light span.cm-link{color:#aa759f}.cm-s-base16-light span.cm-error{background:#ac4142;color:#505050}.cm-s-base16-light .CodeMirror-activeline-background{background:#DDDCDC}.cm-s-base16-light .CodeMirror-matchingbracket{text-decoration:underline;color:#fff!important}"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/bespin.css",
    "content": ".cm-s-bespin.CodeMirror{background:#28211c;color:#9d9b97}.cm-s-bespin div.CodeMirror-selected{background:#36312e!important}.cm-s-bespin .CodeMirror-gutters{background:#28211c;border-right:0}.cm-s-bespin .CodeMirror-linenumber{color:#666}.cm-s-bespin .CodeMirror-cursor{border-left:1px solid #797977!important}.cm-s-bespin span.cm-comment{color:#937121}.cm-s-bespin span.cm-atom,.cm-s-bespin span.cm-number{color:#9b859d}.cm-s-bespin span.cm-attribute,.cm-s-bespin span.cm-property{color:#54be0d}.cm-s-bespin span.cm-keyword{color:#cf6a4c}.cm-s-bespin span.cm-string{color:#f9ee98}.cm-s-bespin span.cm-variable{color:#54be0d}.cm-s-bespin span.cm-variable-2{color:#5ea6ea}.cm-s-bespin span.cm-def{color:#cf7d34}.cm-s-bespin span.cm-error{background:#cf6a4c;color:#797977}.cm-s-bespin span.cm-bracket{color:#9d9b97}.cm-s-bespin span.cm-tag{color:#cf6a4c}.cm-s-bespin span.cm-link{color:#9b859d}.cm-s-bespin .CodeMirror-matchingbracket{text-decoration:underline;color:#fff!important}.cm-s-bespin .CodeMirror-activeline-background{background:#404040}"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/blackboard.css",
    "content": ".cm-s-blackboard.CodeMirror{background:#0C1021;color:#F8F8F8}.cm-s-blackboard div.CodeMirror-selected{background:#253B76}.cm-s-blackboard .CodeMirror-line::selection,.cm-s-blackboard .CodeMirror-line>span::selection,.cm-s-blackboard .CodeMirror-line>span>span::selection{background:rgba(37,59,118,.99)}.cm-s-blackboard .CodeMirror-line::-moz-selection,.cm-s-blackboard .CodeMirror-line>span::-moz-selection,.cm-s-blackboard .CodeMirror-line>span>span::-moz-selection{background:rgba(37,59,118,.99)}.cm-s-blackboard .CodeMirror-gutters{background:#0C1021;border-right:0}.cm-s-blackboard .CodeMirror-guttermarker{color:#FBDE2D}.cm-s-blackboard .CodeMirror-guttermarker-subtle,.cm-s-blackboard .CodeMirror-linenumber{color:#888}.cm-s-blackboard .CodeMirror-cursor{border-left:1px solid #A7A7A7}.cm-s-blackboard .cm-keyword{color:#FBDE2D}.cm-s-blackboard .cm-atom,.cm-s-blackboard .cm-number{color:#D8FA3C}.cm-s-blackboard .cm-def{color:#8DA6CE}.cm-s-blackboard .cm-variable{color:#FF6400}.cm-s-blackboard .cm-operator{color:#FBDE2D}.cm-s-blackboard .cm-comment{color:#AEAEAE}.cm-s-blackboard .cm-string,.cm-s-blackboard .cm-string-2{color:#61CE3C}.cm-s-blackboard .cm-meta{color:#D8FA3C}.cm-s-blackboard .cm-attribute,.cm-s-blackboard .cm-builtin,.cm-s-blackboard .cm-tag{color:#8DA6CE}.cm-s-blackboard .cm-header{color:#FF6400}.cm-s-blackboard .cm-hr{color:#AEAEAE}.cm-s-blackboard .cm-link{color:#8DA6CE}.cm-s-blackboard .cm-error{background:#9D1E15;color:#F8F8F8}.cm-s-blackboard .CodeMirror-activeline-background{background:#3C3636}.cm-s-blackboard .CodeMirror-matchingbracket{outline:grey solid 1px;color:#fff!important}"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/cobalt.css",
    "content": ".cm-s-cobalt.CodeMirror{background:#002240;color:#fff}.cm-s-cobalt div.CodeMirror-selected{background:#b36539}.cm-s-cobalt .CodeMirror-line::selection,.cm-s-cobalt .CodeMirror-line>span::selection,.cm-s-cobalt .CodeMirror-line>span>span::selection{background:rgba(179,101,57,.99)}.cm-s-cobalt .CodeMirror-line::-moz-selection,.cm-s-cobalt .CodeMirror-line>span::-moz-selection,.cm-s-cobalt .CodeMirror-line>span>span::-moz-selection{background:rgba(179,101,57,.99)}.cm-s-cobalt .CodeMirror-gutters{background:#002240;border-right:1px solid #aaa}.cm-s-cobalt .CodeMirror-guttermarker{color:#ffee80}.cm-s-cobalt .CodeMirror-guttermarker-subtle,.cm-s-cobalt .CodeMirror-linenumber{color:#d0d0d0}.cm-s-cobalt .CodeMirror-cursor{border-left:1px solid #fff}.cm-s-cobalt span.cm-comment{color:#08f}.cm-s-cobalt span.cm-atom{color:#845dc4}.cm-s-cobalt span.cm-attribute,.cm-s-cobalt span.cm-number{color:#ff80e1}.cm-s-cobalt span.cm-keyword{color:#ffee80}.cm-s-cobalt span.cm-string{color:#3ad900}.cm-s-cobalt span.cm-meta{color:#ff9d00}.cm-s-cobalt span.cm-tag,.cm-s-cobalt span.cm-variable-2{color:#9effff}.cm-s-cobalt span.cm-def,.cm-s-cobalt span.cm-variable-3{color:#fff}.cm-s-cobalt span.cm-bracket{color:#d8d8d8}.cm-s-cobalt span.cm-builtin,.cm-s-cobalt span.cm-special{color:#ff9e59}.cm-s-cobalt span.cm-link{color:#845dc4}.cm-s-cobalt span.cm-error{color:#9d1e15}.cm-s-cobalt .CodeMirror-activeline-background{background:#002D57}.cm-s-cobalt .CodeMirror-matchingbracket{outline:grey solid 1px;color:#fff!important}"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/colorforth.css",
    "content": ".cm-s-colorforth.CodeMirror{background:#000;color:#f8f8f8}.cm-s-colorforth .CodeMirror-gutters{background:#0a001f;border-right:1px solid #aaa}.cm-s-colorforth .CodeMirror-guttermarker{color:#FFBD40}.cm-s-colorforth .CodeMirror-guttermarker-subtle{color:#78846f}.cm-s-colorforth .CodeMirror-linenumber{color:#bababa}.cm-s-colorforth .CodeMirror-cursor{border-left:1px solid #fff}.cm-s-colorforth span.cm-comment{color:#ededed}.cm-s-colorforth span.cm-def{color:#ff1c1c;font-weight:700}.cm-s-colorforth span.cm-keyword{color:#ffd900}.cm-s-colorforth span.cm-builtin{color:#00d95a}.cm-s-colorforth span.cm-variable{color:#73ff00}.cm-s-colorforth span.cm-string{color:#007bff}.cm-s-colorforth span.cm-number{color:#00c4ff}.cm-s-colorforth span.cm-atom{color:#606060}.cm-s-colorforth span.cm-variable-2{color:#EEE}.cm-s-colorforth span.cm-variable-3{color:#DDD}.cm-s-colorforth span.cm-meta{color:#ff0}.cm-s-colorforth span.cm-qualifier{color:#FFF700}.cm-s-colorforth span.cm-bracket{color:#cc7}.cm-s-colorforth span.cm-tag{color:#FFBD40}.cm-s-colorforth span.cm-attribute{color:#FFF700}.cm-s-colorforth span.cm-error{color:red}.cm-s-colorforth div.CodeMirror-selected{background:#333d53}.cm-s-colorforth span.cm-compilation{background:rgba(255,255,255,.12)}.cm-s-colorforth .CodeMirror-activeline-background{background:#253540}"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/dracula.css",
    "content": ".cm-s-dracula .CodeMirror-gutters,.cm-s-dracula.CodeMirror{background-color:#282a36!important;color:#f8f8f2!important;border:none}.cm-s-dracula .CodeMirror-activeline-background,.cm-s-dracula .CodeMirror-line::selection,.cm-s-dracula .CodeMirror-line>span::selection,.cm-s-dracula .CodeMirror-line>span>span::selection,.cm-s-dracula.CodeMirror-focused div.CodeMirror-selected{background:rgba(255,255,255,.1)}.cm-s-dracula .CodeMirror-gutters{color:#282a36}.cm-s-dracula .CodeMirror-cursor{border-left:solid thin #f8f8f0}.cm-s-dracula .CodeMirror-linenumber{color:#6D8A88}.cm-s-dracula .CodeMirror-line::-moz-selection,.cm-s-dracula .CodeMirror-line>span::-moz-selection,.cm-s-dracula .CodeMirror-line>span>span::-moz-selection{background:rgba(255,255,255,.1)}.cm-s-dracula span.cm-comment{color:#6272a4}.cm-s-dracula span.cm-string,.cm-s-dracula span.cm-string-2{color:#f1fa8c}.cm-s-dracula span.cm-number{color:#bd93f9}.cm-s-dracula span.cm-variable{color:#50fa7b}.cm-s-dracula span.cm-variable-2{color:#fff}.cm-s-dracula span.cm-def{color:#ffb86c}.cm-s-dracula span.cm-keyword,.cm-s-dracula span.cm-operator{color:#ff79c6}.cm-s-dracula span.cm-atom{color:#bd93f9}.cm-s-dracula span.cm-meta{color:#f8f8f2}.cm-s-dracula span.cm-tag{color:#ff79c6}.cm-s-dracula span.cm-attribute,.cm-s-dracula span.cm-qualifier{color:#50fa7b}.cm-s-dracula span.cm-property{color:#66d9ef}.cm-s-dracula span.cm-builtin,.cm-s-dracula span.cm-variable-3{color:#50fa7b}.cm-s-dracula .CodeMirror-matchingbracket{text-decoration:underline;color:#fff!important}"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/eclipse.css",
    "content": ".cm-s-eclipse span.cm-meta{color:#FF1717}.cm-s-eclipse span.cm-keyword{line-height:1em;font-weight:700;color:#7F0055}.cm-s-eclipse span.cm-atom{color:#219}.cm-s-eclipse span.cm-number{color:#164}.cm-s-eclipse span.cm-def{color:#00f}.cm-s-eclipse span.cm-variable{color:#000}.cm-s-eclipse span.cm-variable-2,.cm-s-eclipse span.cm-variable-3{color:#0000C0}.cm-s-eclipse span.cm-operator,.cm-s-eclipse span.cm-property{color:#000}.cm-s-eclipse span.cm-comment{color:#3F7F5F}.cm-s-eclipse span.cm-string{color:#2A00FF}.cm-s-eclipse span.cm-string-2{color:#f50}.cm-s-eclipse span.cm-qualifier{color:#555}.cm-s-eclipse span.cm-builtin{color:#30a}.cm-s-eclipse span.cm-bracket{color:#cc7}.cm-s-eclipse span.cm-tag{color:#170}.cm-s-eclipse span.cm-attribute{color:#00c}.cm-s-eclipse span.cm-link{color:#219}.cm-s-eclipse span.cm-error{color:red}.cm-s-eclipse .CodeMirror-activeline-background{background:#e8f2ff}.cm-s-eclipse .CodeMirror-matchingbracket{outline:grey solid 1px;color:#000!important}"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/elegant.css",
    "content": ".cm-s-elegant span.cm-atom,.cm-s-elegant span.cm-number,.cm-s-elegant span.cm-string{color:#762}.cm-s-elegant span.cm-comment{color:#262;font-style:italic;line-height:1em}.cm-s-elegant span.cm-meta{color:#555;font-style:italic;line-height:1em}.cm-s-elegant span.cm-variable{color:#000}.cm-s-elegant span.cm-variable-2{color:#b11}.cm-s-elegant span.cm-qualifier{color:#555}.cm-s-elegant span.cm-keyword{color:#730}.cm-s-elegant span.cm-builtin{color:#30a}.cm-s-elegant span.cm-link{color:#762}.cm-s-elegant span.cm-error{background-color:#fdd}.cm-s-elegant .CodeMirror-activeline-background{background:#e8f2ff}.cm-s-elegant .CodeMirror-matchingbracket{outline:grey solid 1px;color:#000!important}"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/erlang-dark.css",
    "content": ".cm-s-erlang-dark.CodeMirror{background:#002240;color:#fff}.cm-s-erlang-dark div.CodeMirror-selected{background:#b36539}.cm-s-erlang-dark .CodeMirror-line::selection,.cm-s-erlang-dark .CodeMirror-line>span::selection,.cm-s-erlang-dark .CodeMirror-line>span>span::selection{background:rgba(179,101,57,.99)}.cm-s-erlang-dark .CodeMirror-line::-moz-selection,.cm-s-erlang-dark .CodeMirror-line>span::-moz-selection,.cm-s-erlang-dark .CodeMirror-line>span>span::-moz-selection{background:rgba(179,101,57,.99)}.cm-s-erlang-dark .CodeMirror-gutters{background:#002240;border-right:1px solid #aaa}.cm-s-erlang-dark .CodeMirror-guttermarker{color:#fff}.cm-s-erlang-dark .CodeMirror-guttermarker-subtle,.cm-s-erlang-dark .CodeMirror-linenumber{color:#d0d0d0}.cm-s-erlang-dark .CodeMirror-cursor{border-left:1px solid #fff}.cm-s-erlang-dark span.cm-quote{color:#ccc}.cm-s-erlang-dark span.cm-atom{color:#f133f1}.cm-s-erlang-dark span.cm-attribute{color:#ff80e1}.cm-s-erlang-dark span.cm-bracket{color:#ff9d00}.cm-s-erlang-dark span.cm-builtin{color:#eaa}.cm-s-erlang-dark span.cm-comment{color:#77f}.cm-s-erlang-dark span.cm-def{color:#e7a}.cm-s-erlang-dark span.cm-keyword{color:#ffee80}.cm-s-erlang-dark span.cm-meta{color:#50fefe}.cm-s-erlang-dark span.cm-number{color:#ffd0d0}.cm-s-erlang-dark span.cm-operator{color:#d55}.cm-s-erlang-dark span.cm-property,.cm-s-erlang-dark span.cm-qualifier{color:#ccc}.cm-s-erlang-dark span.cm-special{color:#fbb}.cm-s-erlang-dark span.cm-string{color:#3ad900}.cm-s-erlang-dark span.cm-string-2{color:#ccc}.cm-s-erlang-dark span.cm-tag{color:#9effff}.cm-s-erlang-dark span.cm-variable{color:#50fe50}.cm-s-erlang-dark span.cm-variable-2{color:#e0e}.cm-s-erlang-dark span.cm-variable-3{color:#ccc}.cm-s-erlang-dark span.cm-error{color:#9d1e15}.cm-s-erlang-dark .CodeMirror-activeline-background{background:#013461}.cm-s-erlang-dark .CodeMirror-matchingbracket{outline:grey solid 1px;color:#fff!important}"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/hopscotch.css",
    "content": ".cm-s-hopscotch.CodeMirror{background:#322931;color:#d5d3d5}.cm-s-hopscotch div.CodeMirror-selected{background:#433b42!important}.cm-s-hopscotch .CodeMirror-gutters{background:#322931;border-right:0}.cm-s-hopscotch .CodeMirror-linenumber{color:#797379}.cm-s-hopscotch .CodeMirror-cursor{border-left:1px solid #989498!important}.cm-s-hopscotch span.cm-comment{color:#b33508}.cm-s-hopscotch span.cm-atom,.cm-s-hopscotch span.cm-number{color:#c85e7c}.cm-s-hopscotch span.cm-attribute,.cm-s-hopscotch span.cm-property{color:#8fc13e}.cm-s-hopscotch span.cm-keyword{color:#dd464c}.cm-s-hopscotch span.cm-string{color:#fdcc59}.cm-s-hopscotch span.cm-variable{color:#8fc13e}.cm-s-hopscotch span.cm-variable-2{color:#1290bf}.cm-s-hopscotch span.cm-def{color:#fd8b19}.cm-s-hopscotch span.cm-error{background:#dd464c;color:#989498}.cm-s-hopscotch span.cm-bracket{color:#d5d3d5}.cm-s-hopscotch span.cm-tag{color:#dd464c}.cm-s-hopscotch span.cm-link{color:#c85e7c}.cm-s-hopscotch .CodeMirror-matchingbracket{text-decoration:underline;color:#fff!important}.cm-s-hopscotch .CodeMirror-activeline-background{background:#302020}"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/icecoder.css",
    "content": ".cm-s-icecoder{color:#666;background:#1d1d1b}.cm-s-icecoder span.cm-keyword{color:#eee;font-weight:700}.cm-s-icecoder span.cm-atom{color:#e1c76e}.cm-s-icecoder span.cm-number{color:#6cb5d9}.cm-s-icecoder span.cm-def{color:#b9ca4a}.cm-s-icecoder span.cm-variable{color:#6cb5d9}.cm-s-icecoder span.cm-variable-2{color:#cc1e5c}.cm-s-icecoder span.cm-variable-3{color:#f9602c}.cm-s-icecoder span.cm-property{color:#eee}.cm-s-icecoder span.cm-operator{color:#9179bb}.cm-s-icecoder span.cm-comment{color:#97a3aa}.cm-s-icecoder span.cm-string{color:#b9ca4a}.cm-s-icecoder span.cm-string-2{color:#6cb5d9}.cm-s-icecoder span.cm-meta,.cm-s-icecoder span.cm-qualifier{color:#555}.cm-s-icecoder span.cm-builtin{color:#214e7b}.cm-s-icecoder span.cm-bracket{color:#cc7}.cm-s-icecoder span.cm-tag{color:#e8e8e8}.cm-s-icecoder span.cm-attribute{color:#099}.cm-s-icecoder span.cm-header{color:#6a0d6a}.cm-s-icecoder span.cm-quote{color:#186718}.cm-s-icecoder span.cm-hr{color:#888}.cm-s-icecoder span.cm-link{color:#e1c76e}.cm-s-icecoder span.cm-error{color:#d00}.cm-s-icecoder .CodeMirror-cursor{border-left:1px solid #fff}.cm-s-icecoder div.CodeMirror-selected{color:#fff;background:#037}.cm-s-icecoder .CodeMirror-gutters{background:#1d1d1b;min-width:41px;border-right:0}.cm-s-icecoder .CodeMirror-linenumber{color:#555;cursor:default}.cm-s-icecoder .CodeMirror-matchingbracket{color:#fff!important;background:#555!important}.cm-s-icecoder .CodeMirror-activeline-background{background:#000}"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/isotope.css",
    "content": ".cm-s-isotope.CodeMirror{background:#000;color:#e0e0e0}.cm-s-isotope div.CodeMirror-selected{background:#404040!important}.cm-s-isotope .CodeMirror-gutters{background:#000;border-right:0}.cm-s-isotope .CodeMirror-linenumber{color:grey}.cm-s-isotope .CodeMirror-cursor{border-left:1px solid silver!important}.cm-s-isotope span.cm-comment{color:#30f}.cm-s-isotope span.cm-atom,.cm-s-isotope span.cm-number{color:#c0f}.cm-s-isotope span.cm-attribute,.cm-s-isotope span.cm-property{color:#3f0}.cm-s-isotope span.cm-keyword{color:red}.cm-s-isotope span.cm-string{color:#f09}.cm-s-isotope span.cm-variable{color:#3f0}.cm-s-isotope span.cm-variable-2{color:#06f}.cm-s-isotope span.cm-def{color:#f90}.cm-s-isotope span.cm-error{background:red;color:silver}.cm-s-isotope span.cm-bracket{color:#e0e0e0}.cm-s-isotope span.cm-tag{color:red}.cm-s-isotope span.cm-link{color:#c0f}.cm-s-isotope .CodeMirror-matchingbracket{text-decoration:underline;color:#fff!important}.cm-s-isotope .CodeMirror-activeline-background{background:#202020}"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/lesser-dark.css",
    "content": ".cm-s-lesser-dark{line-height:1.3em}.cm-s-lesser-dark.CodeMirror{background:#262626;color:#EBEFE7;text-shadow:0 -1px 1px #262626}.cm-s-lesser-dark div.CodeMirror-selected{background:#45443B}.cm-s-lesser-dark .CodeMirror-line::selection,.cm-s-lesser-dark .CodeMirror-line>span::selection,.cm-s-lesser-dark .CodeMirror-line>span>span::selection{background:rgba(69,68,59,.99)}.cm-s-lesser-dark .CodeMirror-line::-moz-selection,.cm-s-lesser-dark .CodeMirror-line>span::-moz-selection,.cm-s-lesser-dark .CodeMirror-line>span>span::-moz-selection{background:rgba(69,68,59,.99)}.cm-s-lesser-dark .CodeMirror-cursor{border-left:1px solid #fff}.cm-s-lesser-dark pre{padding:0 8px}.cm-s-lesser-dark.CodeMirror span.CodeMirror-matchingbracket{color:#7EFC7E}.cm-s-lesser-dark .CodeMirror-gutters{background:#262626;border-right:1px solid #aaa}.cm-s-lesser-dark .CodeMirror-guttermarker{color:#599eff}.cm-s-lesser-dark .CodeMirror-guttermarker-subtle,.cm-s-lesser-dark .CodeMirror-linenumber{color:#777}.cm-s-lesser-dark span.cm-header{color:#a0a}.cm-s-lesser-dark span.cm-quote{color:#090}.cm-s-lesser-dark span.cm-keyword{color:#599eff}.cm-s-lesser-dark span.cm-atom{color:#C2B470}.cm-s-lesser-dark span.cm-number{color:#B35E4D}.cm-s-lesser-dark span.cm-def{color:#fff}.cm-s-lesser-dark span.cm-variable{color:#D9BF8C}.cm-s-lesser-dark span.cm-variable-2{color:#669199}.cm-s-lesser-dark span.cm-variable-3{color:#fff}.cm-s-lesser-dark span.cm-operator,.cm-s-lesser-dark span.cm-property{color:#92A75C}.cm-s-lesser-dark span.cm-comment{color:#666}.cm-s-lesser-dark span.cm-string{color:#BCD279}.cm-s-lesser-dark span.cm-string-2{color:#f50}.cm-s-lesser-dark span.cm-meta{color:#738C73}.cm-s-lesser-dark span.cm-qualifier{color:#555}.cm-s-lesser-dark span.cm-builtin{color:#ff9e59}.cm-s-lesser-dark span.cm-bracket{color:#EBEFE7}.cm-s-lesser-dark span.cm-tag{color:#669199}.cm-s-lesser-dark span.cm-attribute{color:#00c}.cm-s-lesser-dark span.cm-hr{color:#999}.cm-s-lesser-dark span.cm-link{color:#00c}.cm-s-lesser-dark span.cm-error{color:#9d1e15}.cm-s-lesser-dark .CodeMirror-activeline-background{background:#3C3A3A}.cm-s-lesser-dark .CodeMirror-matchingbracket{outline:grey solid 1px;color:#fff!important}"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/liquibyte.css",
    "content": ".cm-s-liquibyte.CodeMirror{background-color:#000;color:#fff;line-height:1.2em;font-size:1em}.cm-s-liquibyte .CodeMirror-focused .cm-matchhighlight{text-decoration:underline;text-decoration-color:#0f0;text-decoration-style:wavy}.cm-s-liquibyte .cm-tab,.cm-s-liquibyte .cm-trailingspace{text-decoration:line-through;text-decoration-style:dotted}.cm-s-liquibyte .cm-trailingspace{text-decoration-color:red}.cm-s-liquibyte .cm-tab{text-decoration-color:#404040}.cm-s-liquibyte .CodeMirror-gutters{background-color:#262626;border-right:1px solid #505050;padding-right:.8em}.cm-s-liquibyte .CodeMirror-gutter-elt div{font-size:1.2em}.cm-s-liquibyte .CodeMirror-linenumber{color:#606060;padding-left:0}.cm-s-liquibyte .CodeMirror-cursor{border-left:1px solid #eee}.cm-s-liquibyte span.cm-comment{color:green}.cm-s-liquibyte span.cm-def{color:#ffaf40;font-weight:700}.cm-s-liquibyte span.cm-keyword{color:#c080ff;font-weight:700}.cm-s-liquibyte span.cm-builtin{color:#ffaf40;font-weight:700}.cm-s-liquibyte span.cm-variable{color:#5967ff;font-weight:700}.cm-s-liquibyte span.cm-string{color:#ff8000}.cm-s-liquibyte span.cm-number{color:#0f0;font-weight:700}.cm-s-liquibyte span.cm-atom{color:#bf3030;font-weight:700}.cm-s-liquibyte span.cm-variable-2{color:#007f7f;font-weight:700}.cm-s-liquibyte span.cm-variable-3{color:#c080ff;font-weight:700}.cm-s-liquibyte span.cm-property{color:#999;font-weight:700}.cm-s-liquibyte span.cm-operator{color:#fff}.cm-s-liquibyte span.cm-meta{color:#0f0}.cm-s-liquibyte span.cm-qualifier{color:#fff700;font-weight:700}.cm-s-liquibyte span.cm-bracket{color:#cc7}.cm-s-liquibyte span.cm-tag{color:#ff0;font-weight:700}.cm-s-liquibyte span.cm-attribute{color:#c080ff;font-weight:700}.cm-s-liquibyte span.cm-error{color:red}.cm-s-liquibyte div.CodeMirror-selected{background-color:rgba(255,0,0,.25)}.cm-s-liquibyte span.cm-compilation{background-color:rgba(255,255,255,.12)}.cm-s-liquibyte .CodeMirror-activeline-background{background-color:rgba(0,255,0,.15)}.cm-s-liquibyte .CodeMirror span.CodeMirror-matchingbracket{color:#0f0;font-weight:700}.cm-s-liquibyte .CodeMirror span.CodeMirror-nonmatchingbracket{color:red;font-weight:700}.CodeMirror-matchingtag{background-color:rgba(150,255,0,.3)}.cm-s-liquibyte div.CodeMirror-simplescroll-horizontal div:hover,div.CodeMirror-simplescroll-vertical div:hover{background-color:rgba(80,80,80,.7)}.cm-s-liquibyte div.CodeMirror-simplescroll-horizontal div,div.CodeMirror-simplescroll-vertical div{background-color:rgba(80,80,80,.3);border:1px solid #404040;border-radius:5px}.cm-s-liquibyte div.CodeMirror-simplescroll-vertical div{border-top:1px solid #404040;border-bottom:1px solid #404040}.cm-s-liquibyte div.CodeMirror-simplescroll-horizontal div{border-left:1px solid #404040;border-right:1px solid #404040}.cm-s-liquibyte div.CodeMirror-simplescroll-vertical{background-color:#262626}.cm-s-liquibyte div.CodeMirror-simplescroll-horizontal{background-color:#262626;border-top:1px solid #404040}.cm-s-liquibyte div.CodeMirror-overlayscroll-horizontal div,div.CodeMirror-overlayscroll-vertical div{background-color:#404040;border-radius:5px}.cm-s-liquibyte div.CodeMirror-overlayscroll-horizontal div,.cm-s-liquibyte div.CodeMirror-overlayscroll-vertical div{border:1px solid #404040}"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/material.css",
    "content": ".cm-s-material{background-color:#263238;color:rgba(233,237,237,1)}.cm-s-material .CodeMirror-gutters{background:#263238;color:#537f7e;border:none}.cm-s-material .CodeMirror-guttermarker,.cm-s-material .CodeMirror-guttermarker-subtle,.cm-s-material .CodeMirror-linenumber{color:#537f7e}.cm-s-material .CodeMirror-cursor{border-left:1px solid #f8f8f0}.cm-s-material div.CodeMirror-selected{background:rgba(255,255,255,.15)}.cm-s-material .CodeMirror-line::selection,.cm-s-material .CodeMirror-line>span::selection,.cm-s-material .CodeMirror-line>span>span::selection,.cm-s-material.CodeMirror-focused div.CodeMirror-selected{background:rgba(255,255,255,.1)}.cm-s-material .CodeMirror-line::-moz-selection,.cm-s-material .CodeMirror-line>span::-moz-selection,.cm-s-material .CodeMirror-line>span>span::-moz-selection{background:rgba(255,255,255,.1)}.cm-s-material .CodeMirror-activeline-background{background:rgba(0,0,0,0)}.cm-s-material .cm-keyword{color:rgba(199,146,234,1)}.cm-s-material .cm-operator{color:rgba(233,237,237,1)}.cm-s-material .cm-variable-2{color:#80CBC4}.cm-s-material .cm-builtin{color:#DECB6B}.cm-s-material .cm-atom,.cm-s-material .cm-number{color:#F77669}.cm-s-material .cm-def{color:rgba(233,237,237,1)}.cm-s-material .cm-string{color:#C3E88D}.cm-s-material .cm-string-2{color:#80CBC4}.cm-s-material .cm-comment{color:#546E7A}.cm-s-material .cm-variable{color:#82B1FF}.cm-s-material .cm-meta,.cm-s-material .cm-tag{color:#80CBC4}.cm-s-material .cm-attribute{color:#FFCB6B}.cm-s-material .cm-property{color:#80CBAE}.cm-s-material .cm-qualifier,.cm-s-material .cm-variable-3{color:#DECB6B}.cm-s-material .cm-tag{color:rgba(255,83,112,1)}.cm-s-material .cm-error{color:rgba(255,255,255,1);background-color:#EC5F67}.cm-s-material .CodeMirror-matchingbracket{text-decoration:underline;color:#fff!important}"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/mbo.css",
    "content": ".cm-s-mbo.CodeMirror{background:#2c2c2c;color:#ffffec}.cm-s-mbo div.CodeMirror-selected{background:#716C62}.cm-s-mbo .CodeMirror-line::selection,.cm-s-mbo .CodeMirror-line>span::selection,.cm-s-mbo .CodeMirror-line>span>span::selection{background:rgba(113,108,98,.99)}.cm-s-mbo .CodeMirror-line::-moz-selection,.cm-s-mbo .CodeMirror-line>span::-moz-selection,.cm-s-mbo .CodeMirror-line>span>span::-moz-selection{background:rgba(113,108,98,.99)}.cm-s-mbo .CodeMirror-gutters{background:#4e4e4e;border-right:0}.cm-s-mbo .CodeMirror-guttermarker{color:#fff}.cm-s-mbo .CodeMirror-guttermarker-subtle{color:grey}.cm-s-mbo .CodeMirror-linenumber{color:#dadada}.cm-s-mbo .CodeMirror-cursor{border-left:1px solid #ffffec}.cm-s-mbo span.cm-comment{color:#95958a}.cm-s-mbo span.cm-atom,.cm-s-mbo span.cm-number{color:#00a8c6}.cm-s-mbo span.cm-attribute,.cm-s-mbo span.cm-property{color:#9ddfe9}.cm-s-mbo span.cm-keyword{color:#ffb928}.cm-s-mbo span.cm-string{color:#ffcf6c}.cm-s-mbo span.cm-string.cm-property,.cm-s-mbo span.cm-variable{color:#ffffec}.cm-s-mbo span.cm-variable-2{color:#00a8c6}.cm-s-mbo span.cm-def{color:#ffffec}.cm-s-mbo span.cm-bracket{color:#fffffc;font-weight:700}.cm-s-mbo span.cm-tag{color:#9ddfe9}.cm-s-mbo span.cm-link{color:#f54b07}.cm-s-mbo span.cm-error{border-bottom:#636363;color:#ffffec}.cm-s-mbo span.cm-qualifier{color:#ffffec}.cm-s-mbo .CodeMirror-activeline-background{background:#494b41}.cm-s-mbo .CodeMirror-matchingbracket{color:#ffb928!important}.cm-s-mbo .CodeMirror-matchingtag{background:rgba(255,255,255,.37)}"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/mdn-like.css",
    "content": ".cm-s-mdn-like.CodeMirror{color:#999;background-color:#fff}.cm-s-mdn-like .CodeMirror-line::selection,.cm-s-mdn-like .CodeMirror-line>span::selection,.cm-s-mdn-like .CodeMirror-line>span>span::selection,.cm-s-mdn-like div.CodeMirror-selected{background:#cfc}.cm-s-mdn-like .CodeMirror-line::-moz-selection,.cm-s-mdn-like .CodeMirror-line>span::-moz-selection,.cm-s-mdn-like .CodeMirror-line>span>span::-moz-selection{background:#cfc}.cm-s-mdn-like .CodeMirror-gutters{background:#f8f8f8;border-left:6px solid rgba(0,83,159,.65);color:#333}.cm-s-mdn-like .CodeMirror-linenumber{color:#aaa;padding-left:8px}.cm-s-mdn-like .CodeMirror-cursor{border-left:2px solid #222}.cm-s-mdn-like .cm-keyword{color:#6262FF}.cm-s-mdn-like .cm-atom{color:#F90}.cm-s-mdn-like .cm-number{color:#ca7841}.cm-s-mdn-like .cm-def{color:#8DA6CE}.cm-s-mdn-like span.cm-tag,.cm-s-mdn-like span.cm-variable-2{color:#690}.cm-s-mdn-like .cm-variable,.cm-s-mdn-like span.cm-def,.cm-s-mdn-like span.cm-variable-3{color:#07a}.cm-s-mdn-like .cm-property{color:#905}.cm-s-mdn-like .cm-qualifier{color:#690}.cm-s-mdn-like .cm-operator{color:#cda869}.cm-s-mdn-like .cm-comment{color:#777;font-weight:400}.cm-s-mdn-like .cm-string{color:#07a;font-style:italic}.cm-s-mdn-like .cm-string-2{color:#bd6b18}.cm-s-mdn-like .cm-meta{color:#000}.cm-s-mdn-like .cm-builtin{color:#9B7536}.cm-s-mdn-like .cm-tag{color:#997643}.cm-s-mdn-like .cm-attribute{color:#d6bb6d}.cm-s-mdn-like .cm-header{color:#FF6400}.cm-s-mdn-like .cm-hr{color:#AEAEAE}.cm-s-mdn-like .cm-link{color:#ad9361;font-style:italic;text-decoration:none}.cm-s-mdn-like .cm-error{border-bottom:1px solid red}div.cm-s-mdn-like .CodeMirror-activeline-background{background:#efefff}div.cm-s-mdn-like span.CodeMirror-matchingbracket{outline:grey solid 1px;color:inherit}.cm-s-mdn-like.CodeMirror{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFcAAAAyCAYAAAAp8UeFAAAHvklEQVR42s2b63bcNgyEQZCSHCdt2vd/0tWF7I+Q6XgMXiTtuvU5Pl57ZQKkKHzEAOtF5KeIJBGJ8uvL599FRFREZhFx8DeXv8trn68RuGaC8TRfo3SNp9dlDDHedyLyTUTeRWStXKPZrjtpZxaRw5hPqozRs1N8/enzIiQRWcCgy4MUA0f+XWliDhyL8Lfyvx7ei/Ae3iQFHyw7U/59pQVIMEEPEz0G7XiwdRjzSfC3UTtz9vchIntxvry5iMgfIhJoEflOz2CQr3F5h/HfeFe+GTdLaKcu9L8LTeQb/R/7GgbsfKedyNdoHsN31uRPWrfZ5wsj/NzzRQHuToIdU3ahwnsKPxXCjJITuOsi7XLc7SG/v5GdALs7wf8JjTFiB5+QvTEfRyGOfX3Lrx8wxyQi3sNq46O7QahQiCsRFgqddjBouVEHOKDgXAQHD9gJCr5sMKkEdjwsarG/ww3BMHBU7OBjXnzdyY7SfCxf5/z6ATccrwlKuwC/jhznnPF4CgVzhhVf4xp2EixcBActO75iZ8/fM9zAs2OMzKdslgXWJ9XG8PQoOAMA5fGcsvORgv0doBXyHrCwfLJAOwo71QLNkb8n2Pl6EWiR7OCibtkPaz4Kc/0NNAze2gju3zOwekALDaCFPI5vjPFmgGY5AZqyGEvH1x7QfIb8YtxMnA/b+QQ0aQDAwc6JMFg8CbQZ4qoYEEHbRwNojuK3EHwd7VALSgq+MNDKzfT58T8qdpADrgW0GmgcAS1lhzztJmkAzcPNOQbsWEALBDSlMKUG0Eq4CLAQWvEVQ9WU57gZJwZtgPO3r9oBTQ9WO8TjqXINx8R0EYpiZEUWOF3FxkbJkgU9B2f41YBrIj5ZfsQa0M5kTgiAAqM3ShXLgu8XMqcrQBvJ0CL5pnTsfMB13oB8athpAq2XOQmcGmoACCLydx7nToa23ATaSIY2ichfOdPTGxlasXMLaL0MLZAOwAKIM+y8CmicobGdCcbbK9DzN+yYGVoNNI5iUKTMyYOjPse4A8SM1MmcXgU0toOq1yO/v8FOxlASyc7TgeYaAMBJHcY1CcCwGI/TK4AmDbDyKYBBtFUkRwto8gygiQEaByFgJ00BH2M8JWwQS1nafDXQCidWyOI8AcjDCSjCLk8ngObuAm3JAHAdubAmOaK06V8MNEsKPJOhobSprwQa6gD7DclRQdqcwL4zxqgBrQcabUiBLclRDKAlWp+etPkBaNMA0AKlrHwTdEByZAA4GM+SNluSY6wAzcMNewxmgig5Ks0nkrSpBvSaQHMdKTBAnLojOdYyGpQ254602ZILPdTD1hdlggdIm74jbTp8vDwF5ZYUeLWGJpWsh6XNyXgcYwVoJQTEhhTYkxzZjiU5npU2TaB979TQehlaAVq4kaGpiPwwwLkYUuBbQwocyQTv1tA0+1UFWoJF3iv1oq+qoSk8EQdJmwHkziIF7oOZk14EGitibAdjLYYK78H5vZOhtWpoI0ATGHs0Q8OMb4Ey+2bU2UYztCtA0wFAs7TplGLRVQCcqaFdGSPCeTI1QNIC52iWNzof6Uib7xjEp07mNNoUYmVosVItHrHzRlLgBn9LFyRHaQCtVUMbtTNhoXWiTOO9k/V8BdAc1Oq0ArSQs6/5SU0hckNy9NnXqQY0PGYo5dWJ7nINaN6o958FWin27aBaWRka1r5myvLOAm0j30eBJqCxHLReVclxhxOEN2JfDWjxBtAC7MIH1fVaGdoOp4qJYDgKtKPSFNID2gSnGldrCqkFZ+5UeQXQBIRrSwocbdZYQT/2LwRahBPBXoHrB8nxaGROST62DKUbQOMMzZIC9abkuELfQzQALWTnDNAm8KHWFOJgJ5+SHIvTPcmx1xQyZRhNL5Qci689aXMEaN/uNIWkEwDAvFpOZmgsBaaGnbs1NPa1Jm32gBZAIh1pCtG7TSH4aE0y1uVY4uqoFPisGlpP2rSA5qTecWn5agK6BzSpgAyD+wFaqhnYoSZ1Vwr8CmlTQbrcO3ZaX0NAEyMbYaAlyquFoLKK3SPby9CeVUPThrSJmkCAE0CrKUQadi4DrdSlWhmah0YL9z9vClH59YGbHx1J8VZTyAjQepJjmXwAKTDQI3omc3p1U4gDUf6RfcdYfrUp5ClAi2J3Ba6UOXGo+K+bQrjjssitG2SJzshaLwMtXgRagUNpYYoVkMSBLM+9GGiJZMvduG6DRZ4qc04DMPtQQxOjEtACmhO7K1AbNbQDEggZyJwscFpAGwENhoBeUwh3bWolhe8BTYVKxQEWrSUn/uhcM5KhvUu/+eQu0Lzhi+VrK0PrZZNDQKs9cpYUuFYgMVpD4/NxenJTiMCNqdUEUf1qZWjppLT5qSkkUZbCwkbZMSuVnu80hfSkzRbQeqCZSAh6huR4VtoM2gHAlLf72smuWgE+VV7XpE25Ab2WFDgyhnSuKbs4GuGzCjR+tIoUuMFg3kgcWKLTwRqanJQ2W00hAsenfaApRC42hbCvK1SlE0HtE9BGgneJO+ELamitD1YjjOYnNYVcraGhtKkW0EqVVeDx733I2NH581k1NNxNLG0i0IJ8/NjVaOZ0tYZ2Vtr0Xv7tPV3hkWp9EFkgS/J0vosngTaSoaG06WHi+xObQkaAdlbanP8B2+2l0f90LmUAAAAASUVORK5CYII=)}"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/midnight.css",
    "content": ".cm-s-midnight span.CodeMirror-matchhighlight{background:#494949}.cm-s-midnight.CodeMirror-focused span.CodeMirror-matchhighlight{background:#314D67!important}.cm-s-midnight .CodeMirror-activeline-background{background:#253540}.cm-s-midnight.CodeMirror{background:#0F192A;color:#D1EDFF;border-top:1px solid #000;border-bottom:1px solid #000}.cm-s-midnight div.CodeMirror-selected{background:#314D67}.cm-s-midnight .CodeMirror-line::selection,.cm-s-midnight .CodeMirror-line>span::selection,.cm-s-midnight .CodeMirror-line>span>span::selection{background:rgba(49,77,103,.99)}.cm-s-midnight .CodeMirror-line::-moz-selection,.cm-s-midnight .CodeMirror-line>span::-moz-selection,.cm-s-midnight .CodeMirror-line>span>span::-moz-selection{background:rgba(49,77,103,.99)}.cm-s-midnight .CodeMirror-gutters{background:#0F192A;border-right:1px solid}.cm-s-midnight .CodeMirror-guttermarker{color:#fff}.cm-s-midnight .CodeMirror-guttermarker-subtle{color:#d0d0d0}.cm-s-midnight .CodeMirror-linenumber{color:#D0D0D0}.cm-s-midnight .CodeMirror-cursor{border-left:1px solid #F8F8F0}.cm-s-midnight span.cm-comment{color:#428BDD}.cm-s-midnight span.cm-atom{color:#AE81FF}.cm-s-midnight span.cm-number{color:#D1EDFF}.cm-s-midnight span.cm-attribute,.cm-s-midnight span.cm-property{color:#A6E22E}.cm-s-midnight span.cm-keyword{color:#E83737}.cm-s-midnight span.cm-string{color:#1DC116}.cm-s-midnight span.cm-variable,.cm-s-midnight span.cm-variable-2{color:#FFAA3E}.cm-s-midnight span.cm-def{color:#4DD}.cm-s-midnight span.cm-bracket{color:#D1EDFF}.cm-s-midnight span.cm-tag{color:#449}.cm-s-midnight span.cm-link{color:#AE81FF}.cm-s-midnight span.cm-error{background:#F92672;color:#F8F8F0}.cm-s-midnight .CodeMirror-matchingbracket{text-decoration:underline;color:#fff!important}"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/monokai.css",
    "content": ".cm-s-monokai.CodeMirror{background:#272822;color:#f8f8f2}.cm-s-monokai div.CodeMirror-selected{background:#49483E}.cm-s-monokai .CodeMirror-line::selection,.cm-s-monokai .CodeMirror-line>span::selection,.cm-s-monokai .CodeMirror-line>span>span::selection{background:rgba(73,72,62,.99)}.cm-s-monokai .CodeMirror-line::-moz-selection,.cm-s-monokai .CodeMirror-line>span::-moz-selection,.cm-s-monokai .CodeMirror-line>span>span::-moz-selection{background:rgba(73,72,62,.99)}.cm-s-monokai .CodeMirror-gutters{background:#272822;border-right:0}.cm-s-monokai .CodeMirror-guttermarker{color:#fff}.cm-s-monokai .CodeMirror-guttermarker-subtle,.cm-s-monokai .CodeMirror-linenumber{color:#d0d0d0}.cm-s-monokai .CodeMirror-cursor{border-left:1px solid #f8f8f0}.cm-s-monokai span.cm-comment{color:#75715e}.cm-s-monokai span.cm-atom,.cm-s-monokai span.cm-number{color:#ae81ff}.cm-s-monokai span.cm-attribute,.cm-s-monokai span.cm-property{color:#a6e22e}.cm-s-monokai span.cm-keyword{color:#f92672}.cm-s-monokai span.cm-builtin{color:#66d9ef}.cm-s-monokai span.cm-string{color:#e6db74}.cm-s-monokai span.cm-variable{color:#f8f8f2}.cm-s-monokai span.cm-variable-2{color:#9effff}.cm-s-monokai span.cm-variable-3{color:#66d9ef}.cm-s-monokai span.cm-def{color:#fd971f}.cm-s-monokai span.cm-bracket{color:#f8f8f2}.cm-s-monokai span.cm-tag{color:#f92672}.cm-s-monokai span.cm-header,.cm-s-monokai span.cm-link{color:#ae81ff}.cm-s-monokai span.cm-error{background:#f92672;color:#f8f8f0}.cm-s-monokai .CodeMirror-activeline-background{background:#373831}.cm-s-monokai .CodeMirror-matchingbracket{text-decoration:underline;color:#fff!important}"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/neat.css",
    "content": ".cm-s-neat span.cm-comment{color:#a86}.cm-s-neat span.cm-keyword{line-height:1em;font-weight:700;color:#00f}.cm-s-neat span.cm-string{color:#a22}.cm-s-neat span.cm-builtin{line-height:1em;font-weight:700;color:#077}.cm-s-neat span.cm-special{line-height:1em;font-weight:700;color:#0aa}.cm-s-neat span.cm-variable{color:#000}.cm-s-neat span.cm-atom,.cm-s-neat span.cm-number{color:#3a3}.cm-s-neat span.cm-meta{color:#555}.cm-s-neat span.cm-link{color:#3a3}.cm-s-neat .CodeMirror-activeline-background{background:#e8f2ff}.cm-s-neat .CodeMirror-matchingbracket{outline:grey solid 1px;color:#000!important}"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/neo.css",
    "content": ".cm-s-neo.CodeMirror{background-color:#fff;color:#2e383c;line-height:1.4375}.cm-s-neo .cm-comment{color:#75787b}.cm-s-neo .cm-keyword,.cm-s-neo .cm-property{color:#1d75b3}.cm-s-neo .cm-atom,.cm-s-neo .cm-number{color:#75438a}.cm-s-neo .cm-node,.cm-s-neo .cm-tag{color:#9c3328}.cm-s-neo .cm-string{color:#b35e14}.cm-s-neo .cm-qualifier,.cm-s-neo .cm-variable{color:#047d65}.cm-s-neo pre{padding:0}.cm-s-neo .CodeMirror-gutters{border:none;border-right:10px solid transparent;background-color:transparent}.cm-s-neo .CodeMirror-linenumber{padding:0;color:#e0e2e5}.cm-s-neo .CodeMirror-guttermarker{color:#1d75b3}.cm-s-neo .CodeMirror-guttermarker-subtle{color:#e0e2e5}.cm-s-neo .CodeMirror-cursor{width:auto;border:0;background:rgba(155,157,162,.37);z-index:1}"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/night.css",
    "content": ".cm-s-night.CodeMirror{background:#0a001f;color:#f8f8f8}.cm-s-night div.CodeMirror-selected{background:#447}.cm-s-night .CodeMirror-line::selection,.cm-s-night .CodeMirror-line>span::selection,.cm-s-night .CodeMirror-line>span>span::selection{background:rgba(68,68,119,.99)}.cm-s-night .CodeMirror-line::-moz-selection,.cm-s-night .CodeMirror-line>span::-moz-selection,.cm-s-night .CodeMirror-line>span>span::-moz-selection{background:rgba(68,68,119,.99)}.cm-s-night .CodeMirror-gutters{background:#0a001f;border-right:1px solid #aaa}.cm-s-night .CodeMirror-guttermarker{color:#fff}.cm-s-night .CodeMirror-guttermarker-subtle{color:#bbb}.cm-s-night .CodeMirror-linenumber{color:#f8f8f8}.cm-s-night .CodeMirror-cursor{border-left:1px solid #fff}.cm-s-night span.cm-comment{color:#8900d1}.cm-s-night span.cm-atom{color:#845dc4}.cm-s-night span.cm-attribute,.cm-s-night span.cm-number{color:#ffd500}.cm-s-night span.cm-keyword{color:#599eff}.cm-s-night span.cm-string{color:#37f14a}.cm-s-night span.cm-meta{color:#7678e2}.cm-s-night span.cm-tag,.cm-s-night span.cm-variable-2{color:#99b2ff}.cm-s-night span.cm-def,.cm-s-night span.cm-variable-3{color:#fff}.cm-s-night span.cm-bracket{color:#8da6ce}.cm-s-night span.cm-builtin,.cm-s-night span.cm-special{color:#ff9e59}.cm-s-night span.cm-link{color:#845dc4}.cm-s-night span.cm-error{color:#9d1e15}.cm-s-night .CodeMirror-activeline-background{background:#1C005A}.cm-s-night .CodeMirror-matchingbracket{outline:grey solid 1px;color:#fff!important}"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/panda-syntax.css",
    "content": ".cm-s-panda-syntax{background:#292A2B;color:#E6E6E6;line-height:1.5;font-family:'Operator Mono','Source Sans Pro',Menlo,Monaco,Consolas,Courier New,monospace}.cm-s-panda-syntax .CodeMirror-cursor{border-color:#ff2c6d}.cm-s-panda-syntax .CodeMirror-activeline-background{background:rgba(99,123,156,.1)}.cm-s-panda-syntax .CodeMirror-selected{background:#FFF}.cm-s-panda-syntax .cm-comment{font-style:italic;color:#676B79}.cm-s-panda-syntax .cm-operator{color:#f3f3f3}.cm-s-panda-syntax .cm-string{color:#19F9D8}.cm-s-panda-syntax .cm-string-2{color:#FFB86C}.cm-s-panda-syntax .cm-tag{color:#ff2c6d}.cm-s-panda-syntax .cm-meta{color:#b084eb}.cm-s-panda-syntax .cm-number{color:#FFB86C}.cm-s-panda-syntax .cm-atom{color:#ff2c6d}.cm-s-panda-syntax .cm-keyword{color:#FF75B5}.cm-s-panda-syntax .cm-variable{color:#ffb86c}.cm-s-panda-syntax .cm-variable-2,.cm-s-panda-syntax .cm-variable-3{color:#ff9ac1}.cm-s-panda-syntax .cm-def{color:#e6e6e6}.cm-s-panda-syntax .cm-property{color:#f3f3f3}.cm-s-panda-syntax .cm-attribute,.cm-s-panda-syntax .cm-unit{color:#ffb86c}.cm-s-panda-syntax .CodeMirror-matchingbracket{border-bottom:1px dotted #19F9D8;padding-bottom:2px;color:#e6e6e6}.CodeMirror-gutters{background:#292a2b;border-right-color:rgba(255,255,255,.1)}.CodeMirror-linenumber{color:#e6e6e6;opacity:.6}"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/paraiso-dark.css",
    "content": ".cm-s-paraiso-dark.CodeMirror{background:#2f1e2e;color:#b9b6b0}.cm-s-paraiso-dark div.CodeMirror-selected{background:#41323f}.cm-s-paraiso-dark .CodeMirror-line::selection,.cm-s-paraiso-dark .CodeMirror-line>span::selection,.cm-s-paraiso-dark .CodeMirror-line>span>span::selection{background:rgba(65,50,63,.99)}.cm-s-paraiso-dark .CodeMirror-line::-moz-selection,.cm-s-paraiso-dark .CodeMirror-line>span::-moz-selection,.cm-s-paraiso-dark .CodeMirror-line>span>span::-moz-selection{background:rgba(65,50,63,.99)}.cm-s-paraiso-dark .CodeMirror-gutters{background:#2f1e2e;border-right:0}.cm-s-paraiso-dark .CodeMirror-guttermarker{color:#ef6155}.cm-s-paraiso-dark .CodeMirror-guttermarker-subtle,.cm-s-paraiso-dark .CodeMirror-linenumber{color:#776e71}.cm-s-paraiso-dark .CodeMirror-cursor{border-left:1px solid #8d8687}.cm-s-paraiso-dark span.cm-comment{color:#e96ba8}.cm-s-paraiso-dark span.cm-atom,.cm-s-paraiso-dark span.cm-number{color:#815ba4}.cm-s-paraiso-dark span.cm-attribute,.cm-s-paraiso-dark span.cm-property{color:#48b685}.cm-s-paraiso-dark span.cm-keyword{color:#ef6155}.cm-s-paraiso-dark span.cm-string{color:#fec418}.cm-s-paraiso-dark span.cm-variable{color:#48b685}.cm-s-paraiso-dark span.cm-variable-2{color:#06b6ef}.cm-s-paraiso-dark span.cm-def{color:#f99b15}.cm-s-paraiso-dark span.cm-bracket{color:#b9b6b0}.cm-s-paraiso-dark span.cm-tag{color:#ef6155}.cm-s-paraiso-dark span.cm-link{color:#815ba4}.cm-s-paraiso-dark span.cm-error{background:#ef6155;color:#8d8687}.cm-s-paraiso-dark .CodeMirror-activeline-background{background:#4D344A}.cm-s-paraiso-dark .CodeMirror-matchingbracket{text-decoration:underline;color:#fff!important}"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/paraiso-light.css",
    "content": ".cm-s-paraiso-light.CodeMirror{background:#e7e9db;color:#41323f}.cm-s-paraiso-light .CodeMirror-line::selection,.cm-s-paraiso-light .CodeMirror-line>span::selection,.cm-s-paraiso-light .CodeMirror-line>span>span::selection,.cm-s-paraiso-light div.CodeMirror-selected{background:#b9b6b0}.cm-s-paraiso-light .CodeMirror-line::-moz-selection,.cm-s-paraiso-light .CodeMirror-line>span::-moz-selection,.cm-s-paraiso-light .CodeMirror-line>span>span::-moz-selection{background:#b9b6b0}.cm-s-paraiso-light .CodeMirror-gutters{background:#e7e9db;border-right:0}.cm-s-paraiso-light .CodeMirror-guttermarker{color:#000}.cm-s-paraiso-light .CodeMirror-guttermarker-subtle,.cm-s-paraiso-light .CodeMirror-linenumber{color:#8d8687}.cm-s-paraiso-light .CodeMirror-cursor{border-left:1px solid #776e71}.cm-s-paraiso-light span.cm-comment{color:#e96ba8}.cm-s-paraiso-light span.cm-atom,.cm-s-paraiso-light span.cm-number{color:#815ba4}.cm-s-paraiso-light span.cm-attribute,.cm-s-paraiso-light span.cm-property{color:#48b685}.cm-s-paraiso-light span.cm-keyword{color:#ef6155}.cm-s-paraiso-light span.cm-string{color:#fec418}.cm-s-paraiso-light span.cm-variable{color:#48b685}.cm-s-paraiso-light span.cm-variable-2{color:#06b6ef}.cm-s-paraiso-light span.cm-def{color:#f99b15}.cm-s-paraiso-light span.cm-bracket{color:#41323f}.cm-s-paraiso-light span.cm-tag{color:#ef6155}.cm-s-paraiso-light span.cm-link{color:#815ba4}.cm-s-paraiso-light span.cm-error{background:#ef6155;color:#776e71}.cm-s-paraiso-light .CodeMirror-activeline-background{background:#CFD1C4}.cm-s-paraiso-light .CodeMirror-matchingbracket{text-decoration:underline;color:#fff!important}"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/pastel-on-dark.css",
    "content": ".cm-s-pastel-on-dark.CodeMirror{background:#2c2827;color:#8F938F;line-height:1.5}.cm-s-pastel-on-dark .CodeMirror-line::selection,.cm-s-pastel-on-dark .CodeMirror-line>span::selection,.cm-s-pastel-on-dark .CodeMirror-line>span>span::selection,.cm-s-pastel-on-dark div.CodeMirror-selected{background:rgba(221,240,255,.2)}.cm-s-pastel-on-dark .CodeMirror-line::-moz-selection,.cm-s-pastel-on-dark .CodeMirror-line>span::-moz-selection,.cm-s-pastel-on-dark .CodeMirror-line>span>span::-moz-selection{background:rgba(221,240,255,.2)}.cm-s-pastel-on-dark .CodeMirror-gutters{background:#34302f;border-right:0;padding:0 3px}.cm-s-pastel-on-dark .CodeMirror-guttermarker{color:#fff}.cm-s-pastel-on-dark .CodeMirror-guttermarker-subtle,.cm-s-pastel-on-dark .CodeMirror-linenumber{color:#8F938F}.cm-s-pastel-on-dark .CodeMirror-cursor{border-left:1px solid #A7A7A7}.cm-s-pastel-on-dark span.cm-comment{color:#A6C6FF}.cm-s-pastel-on-dark span.cm-atom{color:#DE8E30}.cm-s-pastel-on-dark span.cm-number{color:#CCC}.cm-s-pastel-on-dark span.cm-property{color:#8F938F}.cm-s-pastel-on-dark span.cm-attribute{color:#a6e22e}.cm-s-pastel-on-dark span.cm-keyword{color:#AEB2F8}.cm-s-pastel-on-dark span.cm-string{color:#66A968}.cm-s-pastel-on-dark span.cm-variable{color:#AEB2F8}.cm-s-pastel-on-dark span.cm-variable-2{color:#BEBF55}.cm-s-pastel-on-dark span.cm-variable-3{color:#DE8E30}.cm-s-pastel-on-dark span.cm-def{color:#757aD8}.cm-s-pastel-on-dark span.cm-bracket{color:#f8f8f2}.cm-s-pastel-on-dark span.cm-tag{color:#C1C144}.cm-s-pastel-on-dark span.cm-link{color:#ae81ff}.cm-s-pastel-on-dark span.cm-builtin,.cm-s-pastel-on-dark span.cm-qualifier{color:#C1C144}.cm-s-pastel-on-dark span.cm-error{background:#757aD8;color:#f8f8f0}.cm-s-pastel-on-dark .CodeMirror-activeline-background{background:rgba(255,255,255,.031)}.cm-s-pastel-on-dark .CodeMirror-matchingbracket{border:1px solid rgba(255,255,255,.25);color:#8F938F!important;margin:-1px -1px 0}"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/railscasts.css",
    "content": ".cm-s-railscasts.CodeMirror{background:#2b2b2b;color:#f4f1ed}.cm-s-railscasts div.CodeMirror-selected{background:#272935!important}.cm-s-railscasts .CodeMirror-gutters{background:#2b2b2b;border-right:0}.cm-s-railscasts .CodeMirror-linenumber{color:#5a647e}.cm-s-railscasts .CodeMirror-cursor{border-left:1px solid #d4cfc9!important}.cm-s-railscasts span.cm-comment{color:#bc9458}.cm-s-railscasts span.cm-atom,.cm-s-railscasts span.cm-number{color:#b6b3eb}.cm-s-railscasts span.cm-attribute,.cm-s-railscasts span.cm-property{color:#a5c261}.cm-s-railscasts span.cm-keyword{color:#da4939}.cm-s-railscasts span.cm-string{color:#ffc66d}.cm-s-railscasts span.cm-variable{color:#a5c261}.cm-s-railscasts span.cm-variable-2{color:#6d9cbe}.cm-s-railscasts span.cm-def{color:#cc7833}.cm-s-railscasts span.cm-error{background:#da4939;color:#d4cfc9}.cm-s-railscasts span.cm-bracket{color:#f4f1ed}.cm-s-railscasts span.cm-tag{color:#da4939}.cm-s-railscasts span.cm-link{color:#b6b3eb}.cm-s-railscasts .CodeMirror-matchingbracket{text-decoration:underline;color:#fff!important}.cm-s-railscasts .CodeMirror-activeline-background{background:#303040}"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/rubyblue.css",
    "content": ".cm-s-rubyblue.CodeMirror{background:#112435;color:#fff}.cm-s-rubyblue div.CodeMirror-selected{background:#38566F}.cm-s-rubyblue .CodeMirror-line::selection,.cm-s-rubyblue .CodeMirror-line>span::selection,.cm-s-rubyblue .CodeMirror-line>span>span::selection{background:rgba(56,86,111,.99)}.cm-s-rubyblue .CodeMirror-line::-moz-selection,.cm-s-rubyblue .CodeMirror-line>span::-moz-selection,.cm-s-rubyblue .CodeMirror-line>span>span::-moz-selection{background:rgba(56,86,111,.99)}.cm-s-rubyblue .CodeMirror-gutters{background:#1F4661;border-right:7px solid #3E7087}.cm-s-rubyblue .CodeMirror-guttermarker{color:#fff}.cm-s-rubyblue .CodeMirror-guttermarker-subtle{color:#3E7087}.cm-s-rubyblue .CodeMirror-linenumber{color:#fff}.cm-s-rubyblue .CodeMirror-cursor{border-left:1px solid #fff}.cm-s-rubyblue span.cm-comment{color:#999;font-style:italic;line-height:1em}.cm-s-rubyblue span.cm-atom{color:#F4C20B}.cm-s-rubyblue span.cm-attribute,.cm-s-rubyblue span.cm-number{color:#82C6E0}.cm-s-rubyblue span.cm-keyword{color:#F0F}.cm-s-rubyblue span.cm-string{color:#F08047}.cm-s-rubyblue span.cm-meta{color:#F0F}.cm-s-rubyblue span.cm-tag,.cm-s-rubyblue span.cm-variable-2{color:#7BD827}.cm-s-rubyblue span.cm-def,.cm-s-rubyblue span.cm-variable-3{color:#fff}.cm-s-rubyblue span.cm-bracket{color:#F0F}.cm-s-rubyblue span.cm-link{color:#F4C20B}.cm-s-rubyblue span.CodeMirror-matchingbracket{color:#F0F!important}.cm-s-rubyblue span.cm-builtin,.cm-s-rubyblue span.cm-special{color:#FF9D00}.cm-s-rubyblue span.cm-error{color:#AF2018}.cm-s-rubyblue .CodeMirror-activeline-background{background:#173047}"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/seti.css",
    "content": ".cm-s-seti.CodeMirror{background-color:#151718!important;color:#CFD2D1!important;border:none}.cm-s-seti .CodeMirror-gutters{color:#404b53;background-color:#0E1112;border:none}.cm-s-seti .CodeMirror-cursor{border-left:solid thin #f8f8f0}.cm-s-seti .CodeMirror-linenumber{color:#6D8A88}.cm-s-seti .CodeMirror-line::selection,.cm-s-seti .CodeMirror-line>span::selection,.cm-s-seti .CodeMirror-line>span>span::selection,.cm-s-seti.CodeMirror-focused div.CodeMirror-selected{background:rgba(255,255,255,.1)}.cm-s-seti .CodeMirror-line::-moz-selection,.cm-s-seti .CodeMirror-line>span::-moz-selection,.cm-s-seti .CodeMirror-line>span>span::-moz-selection{background:rgba(255,255,255,.1)}.cm-s-seti span.cm-comment{color:#41535b}.cm-s-seti span.cm-string,.cm-s-seti span.cm-string-2{color:#55b5db}.cm-s-seti span.cm-number{color:#cd3f45}.cm-s-seti span.cm-variable{color:#55b5db}.cm-s-seti span.cm-variable-2{color:#a074c4}.cm-s-seti span.cm-def{color:#55b5db}.cm-s-seti span.cm-operator{color:#9fca56}.cm-s-seti span.cm-keyword{color:#e6cd69}.cm-s-seti span.cm-atom{color:#cd3f45}.cm-s-seti span.cm-meta,.cm-s-seti span.cm-tag{color:#55b5db}.cm-s-seti span.cm-attribute,.cm-s-seti span.cm-qualifier{color:#9fca56}.cm-s-seti span.cm-property{color:#a074c4}.cm-s-seti span.cm-builtin,.cm-s-seti span.cm-variable-3{color:#9fca56}.cm-s-seti .CodeMirror-activeline-background{background:#101213}.cm-s-seti .CodeMirror-matchingbracket{text-decoration:underline;color:#fff!important}"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/solarized.css",
    "content": ".solarized.base03{color:#002b36}.solarized.base02{color:#073642}.solarized.base01{color:#586e75}.solarized.base00{color:#657b83}.solarized.base0{color:#839496}.solarized.base1{color:#93a1a1}.solarized.base2{color:#eee8d5}.solarized.base3{color:#fdf6e3}.solarized.solar-yellow{color:#b58900}.solarized.solar-orange{color:#cb4b16}.solarized.solar-red{color:#dc322f}.solarized.solar-magenta{color:#d33682}.solarized.solar-violet{color:#6c71c4}.solarized.solar-blue{color:#268bd2}.solarized.solar-cyan{color:#2aa198}.solarized.solar-green{color:#859900}.cm-s-solarized{line-height:1.45em;color-profile:sRGB;rendering-intent:auto}.cm-s-solarized.cm-s-dark{color:#839496;background-color:#002b36;text-shadow:#002b36 0 1px}.cm-s-solarized.cm-s-light{background-color:#fdf6e3;color:#657b83;text-shadow:#eee8d5 0 1px}.cm-s-solarized .CodeMirror-widget{text-shadow:none}.cm-s-solarized .cm-header{color:#586e75}.cm-s-solarized .cm-quote{color:#93a1a1}.cm-s-solarized .cm-keyword{color:#cb4b16}.cm-s-solarized .cm-atom,.cm-s-solarized .cm-number{color:#d33682}.cm-s-solarized .cm-def{color:#2aa198}.cm-s-solarized .cm-variable{color:#839496}.cm-s-solarized .cm-variable-2{color:#b58900}.cm-s-solarized .cm-variable-3{color:#6c71c4}.cm-s-solarized .cm-property{color:#2aa198}.cm-s-solarized .cm-operator{color:#6c71c4}.cm-s-solarized .cm-comment{color:#586e75;font-style:italic}.cm-s-solarized .cm-string{color:#859900}.cm-s-solarized .cm-string-2{color:#b58900}.cm-s-solarized .cm-meta{color:#859900}.cm-s-solarized .cm-qualifier{color:#b58900}.cm-s-solarized .cm-builtin{color:#d33682}.cm-s-solarized .cm-bracket{color:#cb4b16}.cm-s-solarized .CodeMirror-matchingbracket{color:#859900}.cm-s-solarized .CodeMirror-nonmatchingbracket{color:#dc322f}.cm-s-solarized .cm-tag{color:#93a1a1}.cm-s-solarized .cm-attribute{color:#2aa198}.cm-s-solarized .cm-hr{color:transparent;border-top:1px solid #586e75;display:block}.cm-s-solarized .cm-link{color:#93a1a1;cursor:pointer}.cm-s-solarized .cm-special{color:#6c71c4}.cm-s-solarized .cm-em{color:#999;text-decoration:underline;text-decoration-style:dotted}.cm-s-solarized .cm-strong{color:#eee}.cm-s-solarized .cm-error,.cm-s-solarized .cm-invalidchar{color:#586e75;border-bottom:1px dotted #dc322f}.cm-s-solarized.cm-s-dark div.CodeMirror-selected{background:#073642}.cm-s-solarized.cm-s-dark.CodeMirror ::selection{background:rgba(7,54,66,.99)}.cm-s-dark .CodeMirror-line>span::-moz-selection,.cm-s-dark .CodeMirror-line>span>span::-moz-selection,.cm-s-solarized.cm-s-dark .CodeMirror-line::-moz-selection{background:rgba(7,54,66,.99)}.cm-s-light .CodeMirror-line>span::selection,.cm-s-light .CodeMirror-line>span>span::selection,.cm-s-solarized.cm-s-light .CodeMirror-line::selection,.cm-s-solarized.cm-s-light div.CodeMirror-selected{background:#eee8d5}.cm-s-ligh .CodeMirror-line>span::-moz-selection,.cm-s-ligh .CodeMirror-line>span>span::-moz-selection,.cm-s-solarized.cm-s-light .CodeMirror-line::-moz-selection{background:#eee8d5}.cm-s-solarized.CodeMirror{-moz-box-shadow:inset 7px 0 12px -6px #000;-webkit-box-shadow:inset 7px 0 12px -6px #000;box-shadow:inset 7px 0 12px -6px #000}.cm-s-solarized .CodeMirror-gutters{border-right:0}.cm-s-solarized.cm-s-dark .CodeMirror-gutters{background-color:#073642}.cm-s-solarized.cm-s-dark .CodeMirror-linenumber{color:#586e75;text-shadow:#021014 0 -1px}.cm-s-solarized.cm-s-light .CodeMirror-gutters{background-color:#eee8d5}.cm-s-solarized.cm-s-light .CodeMirror-linenumber{color:#839496}.cm-s-solarized .CodeMirror-linenumber{padding:0 5px}.cm-s-solarized .CodeMirror-guttermarker-subtle{color:#586e75}.cm-s-solarized.cm-s-dark .CodeMirror-guttermarker{color:#ddd}.cm-s-solarized.cm-s-light .CodeMirror-guttermarker{color:#cb4b16}.cm-s-solarized .CodeMirror-gutter .CodeMirror-gutter-text{color:#586e75}.cm-s-solarized .CodeMirror-cursor{border-left:1px solid #819090}.cm-s-solarized.cm-s-light.cm-fat-cursor .CodeMirror-cursor{background:#7e7}.cm-s-solarized.cm-s-light .cm-animate-fat-cursor{background-color:#7e7}.cm-s-solarized.cm-s-dark.cm-fat-cursor .CodeMirror-cursor{background:#586e75}.cm-s-solarized.cm-s-dark .cm-animate-fat-cursor{background-color:#586e75}.cm-s-solarized.cm-s-dark .CodeMirror-activeline-background{background:rgba(255,255,255,.06)}.cm-s-solarized.cm-s-light .CodeMirror-activeline-background{background:rgba(0,0,0,.06)}"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/the-matrix.css",
    "content": ".cm-s-the-matrix.CodeMirror{background:#000;color:#0F0}.cm-s-the-matrix div.CodeMirror-selected{background:#2D2D2D}.cm-s-the-matrix .CodeMirror-line::selection,.cm-s-the-matrix .CodeMirror-line>span::selection,.cm-s-the-matrix .CodeMirror-line>span>span::selection{background:rgba(45,45,45,.99)}.cm-s-the-matrix .CodeMirror-line::-moz-selection,.cm-s-the-matrix .CodeMirror-line>span::-moz-selection,.cm-s-the-matrix .CodeMirror-line>span>span::-moz-selection{background:rgba(45,45,45,.99)}.cm-s-the-matrix .CodeMirror-gutters{background:#060;border-right:2px solid #0F0}.cm-s-the-matrix .CodeMirror-guttermarker{color:#0f0}.cm-s-the-matrix .CodeMirror-guttermarker-subtle{color:#fff}.cm-s-the-matrix .CodeMirror-linenumber{color:#FFF}.cm-s-the-matrix .CodeMirror-cursor{border-left:1px solid #0F0}.cm-s-the-matrix span.cm-keyword{color:#008803;font-weight:700}.cm-s-the-matrix span.cm-atom{color:#3FF}.cm-s-the-matrix span.cm-number{color:#FFB94F}.cm-s-the-matrix span.cm-def{color:#99C}.cm-s-the-matrix span.cm-variable{color:#F6C}.cm-s-the-matrix span.cm-variable-2{color:#C6F}.cm-s-the-matrix span.cm-variable-3{color:#96F}.cm-s-the-matrix span.cm-property{color:#62FFA0}.cm-s-the-matrix span.cm-operator{color:#999}.cm-s-the-matrix span.cm-comment{color:#CCC}.cm-s-the-matrix span.cm-string{color:#39C}.cm-s-the-matrix span.cm-meta{color:#C9F}.cm-s-the-matrix span.cm-qualifier{color:#FFF700}.cm-s-the-matrix span.cm-builtin{color:#30a}.cm-s-the-matrix span.cm-bracket{color:#cc7}.cm-s-the-matrix span.cm-tag{color:#FFBD40}.cm-s-the-matrix span.cm-attribute{color:#FFF700}.cm-s-the-matrix span.cm-error{color:red}.cm-s-the-matrix .CodeMirror-activeline-background{background:#040}"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/tomorrow-night-bright.css",
    "content": ".cm-s-tomorrow-night-bright.CodeMirror{background:#000;color:#eaeaea}.cm-s-tomorrow-night-bright div.CodeMirror-selected{background:#424242}.cm-s-tomorrow-night-bright .CodeMirror-gutters{background:#000;border-right:0}.cm-s-tomorrow-night-bright .CodeMirror-guttermarker{color:#e78c45}.cm-s-tomorrow-night-bright .CodeMirror-guttermarker-subtle{color:#777}.cm-s-tomorrow-night-bright .CodeMirror-linenumber{color:#424242}.cm-s-tomorrow-night-bright .CodeMirror-cursor{border-left:1px solid #6A6A6A}.cm-s-tomorrow-night-bright span.cm-comment{color:#d27b53}.cm-s-tomorrow-night-bright span.cm-atom,.cm-s-tomorrow-night-bright span.cm-number{color:#a16a94}.cm-s-tomorrow-night-bright span.cm-attribute,.cm-s-tomorrow-night-bright span.cm-property{color:#9c9}.cm-s-tomorrow-night-bright span.cm-keyword{color:#d54e53}.cm-s-tomorrow-night-bright span.cm-string{color:#e7c547}.cm-s-tomorrow-night-bright span.cm-variable{color:#b9ca4a}.cm-s-tomorrow-night-bright span.cm-variable-2{color:#7aa6da}.cm-s-tomorrow-night-bright span.cm-def{color:#e78c45}.cm-s-tomorrow-night-bright span.cm-bracket{color:#eaeaea}.cm-s-tomorrow-night-bright span.cm-tag{color:#d54e53}.cm-s-tomorrow-night-bright span.cm-link{color:#a16a94}.cm-s-tomorrow-night-bright span.cm-error{background:#d54e53;color:#6A6A6A}.cm-s-tomorrow-night-bright .CodeMirror-activeline-background{background:#2a2a2a}.cm-s-tomorrow-night-bright .CodeMirror-matchingbracket{text-decoration:underline;color:#fff!important}"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/tomorrow-night-eighties.css",
    "content": ".cm-s-tomorrow-night-eighties.CodeMirror{background:#000;color:#CCC}.cm-s-tomorrow-night-eighties div.CodeMirror-selected{background:#2D2D2D}.cm-s-tomorrow-night-eighties .CodeMirror-line::selection,.cm-s-tomorrow-night-eighties .CodeMirror-line>span::selection,.cm-s-tomorrow-night-eighties .CodeMirror-line>span>span::selection{background:rgba(45,45,45,.99)}.cm-s-tomorrow-night-eighties .CodeMirror-line::-moz-selection,.cm-s-tomorrow-night-eighties .CodeMirror-line>span::-moz-selection,.cm-s-tomorrow-night-eighties .CodeMirror-line>span>span::-moz-selection{background:rgba(45,45,45,.99)}.cm-s-tomorrow-night-eighties .CodeMirror-gutters{background:#000;border-right:0}.cm-s-tomorrow-night-eighties .CodeMirror-guttermarker{color:#f2777a}.cm-s-tomorrow-night-eighties .CodeMirror-guttermarker-subtle{color:#777}.cm-s-tomorrow-night-eighties .CodeMirror-linenumber{color:#515151}.cm-s-tomorrow-night-eighties .CodeMirror-cursor{border-left:1px solid #6A6A6A}.cm-s-tomorrow-night-eighties span.cm-comment{color:#d27b53}.cm-s-tomorrow-night-eighties span.cm-atom,.cm-s-tomorrow-night-eighties span.cm-number{color:#a16a94}.cm-s-tomorrow-night-eighties span.cm-attribute,.cm-s-tomorrow-night-eighties span.cm-property{color:#9c9}.cm-s-tomorrow-night-eighties span.cm-keyword{color:#f2777a}.cm-s-tomorrow-night-eighties span.cm-string{color:#fc6}.cm-s-tomorrow-night-eighties span.cm-variable{color:#9c9}.cm-s-tomorrow-night-eighties span.cm-variable-2{color:#69c}.cm-s-tomorrow-night-eighties span.cm-def{color:#f99157}.cm-s-tomorrow-night-eighties span.cm-bracket{color:#CCC}.cm-s-tomorrow-night-eighties span.cm-tag{color:#f2777a}.cm-s-tomorrow-night-eighties span.cm-link{color:#a16a94}.cm-s-tomorrow-night-eighties span.cm-error{background:#f2777a;color:#6A6A6A}.cm-s-tomorrow-night-eighties .CodeMirror-activeline-background{background:#343600}.cm-s-tomorrow-night-eighties .CodeMirror-matchingbracket{text-decoration:underline;color:#fff!important}"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/ttcn.css",
    "content": ".cm-s-ttcn .cm-externalCommands,.cm-s-ttcn .cm-header,.cm-s-ttcn .cm-keyword,.cm-s-ttcn .cm-strong,.cm-s-ttcn .cm-types,.cm-s-ttcn .cm-visibilityModifiers,.cm-strong{font-weight:700}.cm-s-ttcn .cm-quote{color:#090}.cm-s-ttcn .cm-header{color:#00f}.cm-s-ttcn .cm-atom{color:#219}.cm-s-ttcn .cm-attribute{color:#00c}.cm-s-ttcn .cm-bracket{color:#997}.cm-s-ttcn .cm-comment{color:#333}.cm-s-ttcn .cm-def{color:#00f}.cm-s-ttcn .cm-em{font-style:italic}.cm-s-ttcn .cm-error{color:red}.cm-s-ttcn .cm-hr{color:#999}.cm-s-ttcn .cm-link{color:#00c;text-decoration:underline}.cm-s-ttcn .cm-meta{color:#555}.cm-s-ttcn .cm-negative{color:#d44}.cm-s-ttcn .cm-positive{color:#292}.cm-s-ttcn .cm-qualifier{color:#555}.cm-s-ttcn .cm-strikethrough{text-decoration:line-through}.cm-s-ttcn .cm-string{color:#006400}.cm-s-ttcn .cm-string-2{color:#f50}.cm-s-ttcn .cm-tag{color:#170}.cm-s-ttcn .cm-variable{color:#8B2252}.cm-s-ttcn .cm-variable-2{color:#05a}.cm-s-ttcn .cm-variable-3{color:#085}.cm-s-ttcn .cm-invalidchar{color:red}.cm-s-ttcn .cm-accessTypes,.cm-s-ttcn .cm-compareTypes{color:#27408B}.cm-s-ttcn .cm-cmipVerbs{color:#8B2252}.cm-s-ttcn .cm-modifier{color:#D2691E}.cm-s-ttcn .cm-status{color:#8B4545}.cm-s-ttcn .cm-storage{color:#A020F0}.cm-s-ttcn .cm-tags{color:#006400}.cm-s-ttcn .cm-externalCommands{color:#8B4545}.cm-s-ttcn .cm-fileNCtrlMaskOptions,.cm-s-ttcn .cm-sectionTitle{color:#2E8B57;font-weight:700}.cm-s-ttcn .cm-booleanConsts,.cm-s-ttcn .cm-otherConsts,.cm-s-ttcn .cm-verdictConsts{color:#006400}.cm-s-ttcn .cm-configOps,.cm-s-ttcn .cm-functionOps,.cm-s-ttcn .cm-portOps,.cm-s-ttcn .cm-sutOps,.cm-s-ttcn .cm-timerOps,.cm-s-ttcn .cm-verdictOps{color:#00F}.cm-s-ttcn .cm-preprocessor,.cm-s-ttcn .cm-templateMatch,.cm-s-ttcn .cm-ttcn3Macros{color:#27408B}.cm-s-ttcn .cm-types{color:brown}"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/twilight.css",
    "content": ".cm-s-twilight.CodeMirror{background:#141414;color:#f7f7f7}.cm-s-twilight div.CodeMirror-selected{background:#323232}.cm-s-twilight .CodeMirror-line::selection,.cm-s-twilight .CodeMirror-line>span::selection,.cm-s-twilight .CodeMirror-line>span>span::selection{background:rgba(50,50,50,.99)}.cm-s-twilight .CodeMirror-line::-moz-selection,.cm-s-twilight .CodeMirror-line>span::-moz-selection,.cm-s-twilight .CodeMirror-line>span>span::-moz-selection{background:rgba(50,50,50,.99)}.cm-s-twilight .CodeMirror-gutters{background:#222;border-right:1px solid #aaa}.cm-s-twilight .CodeMirror-guttermarker{color:#fff}.cm-s-twilight .CodeMirror-guttermarker-subtle,.cm-s-twilight .CodeMirror-linenumber{color:#aaa}.cm-s-twilight .CodeMirror-cursor{border-left:1px solid #fff}.cm-s-twilight .cm-keyword{color:#f9ee98}.cm-s-twilight .cm-atom{color:#FC0}.cm-s-twilight .cm-number{color:#ca7841}.cm-s-twilight .cm-def{color:#8DA6CE}.cm-s-twilight span.cm-def,.cm-s-twilight span.cm-tag,.cm-s-twilight span.cm-variable-2,.cm-s-twilight span.cm-variable-3{color:#607392}.cm-s-twilight .cm-operator{color:#cda869}.cm-s-twilight .cm-comment{color:#777;font-style:italic;font-weight:400}.cm-s-twilight .cm-string{color:#8f9d6a;font-style:italic}.cm-s-twilight .cm-string-2{color:#bd6b18}.cm-s-twilight .cm-meta{background-color:#141414;color:#f7f7f7}.cm-s-twilight .cm-builtin{color:#cda869}.cm-s-twilight .cm-tag{color:#997643}.cm-s-twilight .cm-attribute{color:#d6bb6d}.cm-s-twilight .cm-header{color:#FF6400}.cm-s-twilight .cm-hr{color:#AEAEAE}.cm-s-twilight .cm-link{color:#ad9361;font-style:italic;text-decoration:none}.cm-s-twilight .cm-error{border-bottom:1px solid red}.cm-s-twilight .CodeMirror-activeline-background{background:#27282E}.cm-s-twilight .CodeMirror-matchingbracket{outline:grey solid 1px;color:#fff!important}"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/vibrant-ink.css",
    "content": ".cm-s-vibrant-ink.CodeMirror{background:#000;color:#fff}.cm-s-vibrant-ink div.CodeMirror-selected{background:#35493c}.cm-s-vibrant-ink .CodeMirror-line::selection,.cm-s-vibrant-ink .CodeMirror-line>span::selection,.cm-s-vibrant-ink .CodeMirror-line>span>span::selection{background:rgba(53,73,60,.99)}.cm-s-vibrant-ink .CodeMirror-line::-moz-selection,.cm-s-vibrant-ink .CodeMirror-line>span::-moz-selection,.cm-s-vibrant-ink .CodeMirror-line>span>span::-moz-selection{background:rgba(53,73,60,.99)}.cm-s-vibrant-ink .CodeMirror-gutters{background:#002240;border-right:1px solid #aaa}.cm-s-vibrant-ink .CodeMirror-guttermarker{color:#fff}.cm-s-vibrant-ink .CodeMirror-guttermarker-subtle,.cm-s-vibrant-ink .CodeMirror-linenumber{color:#d0d0d0}.cm-s-vibrant-ink .CodeMirror-cursor{border-left:1px solid #fff}.cm-s-vibrant-ink .cm-keyword{color:#CC7832}.cm-s-vibrant-ink .cm-atom{color:#FC0}.cm-s-vibrant-ink .cm-number{color:#FFEE98}.cm-s-vibrant-ink .cm-def{color:#8DA6CE}.cm-s-vibrant span.cm-def,.cm-s-vibrant span.cm-tag,.cm-s-vibrant-ink span.cm-variable-2,.cm-s-vibrant-ink span.cm-variable-3{color:#FFC66D}.cm-s-vibrant-ink .cm-operator{color:#888}.cm-s-vibrant-ink .cm-comment{color:gray;font-weight:700}.cm-s-vibrant-ink .cm-string{color:#A5C25C}.cm-s-vibrant-ink .cm-string-2{color:red}.cm-s-vibrant-ink .cm-meta{color:#D8FA3C}.cm-s-vibrant-ink .cm-attribute,.cm-s-vibrant-ink .cm-builtin,.cm-s-vibrant-ink .cm-tag{color:#8DA6CE}.cm-s-vibrant-ink .cm-header{color:#FF6400}.cm-s-vibrant-ink .cm-hr{color:#AEAEAE}.cm-s-vibrant-ink .cm-link{color:#00f}.cm-s-vibrant-ink .cm-error{border-bottom:1px solid red}.cm-s-vibrant-ink .CodeMirror-activeline-background{background:#27282E}.cm-s-vibrant-ink .CodeMirror-matchingbracket{outline:grey solid 1px;color:#fff!important}"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/xq-dark.css",
    "content": ".cm-s-xq-dark.CodeMirror{background:#0a001f;color:#f8f8f8}.cm-s-xq-dark div.CodeMirror-selected{background:#27007A}.cm-s-xq-dark .CodeMirror-line::selection,.cm-s-xq-dark .CodeMirror-line>span::selection,.cm-s-xq-dark .CodeMirror-line>span>span::selection{background:rgba(39,0,122,.99)}.cm-s-xq-dark .CodeMirror-line::-moz-selection,.cm-s-xq-dark .CodeMirror-line>span::-moz-selection,.cm-s-xq-dark .CodeMirror-line>span>span::-moz-selection{background:rgba(39,0,122,.99)}.cm-s-xq-dark .CodeMirror-gutters{background:#0a001f;border-right:1px solid #aaa}.cm-s-xq-dark .CodeMirror-guttermarker{color:#FFBD40}.cm-s-xq-dark .CodeMirror-guttermarker-subtle,.cm-s-xq-dark .CodeMirror-linenumber{color:#f8f8f8}.cm-s-xq-dark .CodeMirror-cursor{border-left:1px solid #fff}.cm-s-xq-dark span.cm-keyword{color:#FFBD40}.cm-s-xq-dark span.cm-atom{color:#6C8CD5}.cm-s-xq-dark span.cm-number{color:#164}.cm-s-xq-dark span.cm-def{color:#FFF;text-decoration:underline}.cm-s-xq-dark span.cm-variable{color:#FFF}.cm-s-xq-dark span.cm-variable-2{color:#EEE}.cm-s-xq-dark span.cm-variable-3{color:#DDD}.cm-s-xq-dark span.cm-comment{color:gray}.cm-s-xq-dark span.cm-string{color:#9FEE00}.cm-s-xq-dark span.cm-meta{color:#ff0}.cm-s-xq-dark span.cm-qualifier{color:#FFF700}.cm-s-xq-dark span.cm-builtin{color:#30a}.cm-s-xq-dark span.cm-bracket{color:#cc7}.cm-s-xq-dark span.cm-tag{color:#FFBD40}.cm-s-xq-dark span.cm-attribute{color:#FFF700}.cm-s-xq-dark span.cm-error{color:red}.cm-s-xq-dark .CodeMirror-activeline-background{background:#27282E}.cm-s-xq-dark .CodeMirror-matchingbracket{outline:grey solid 1px;color:#fff!important}"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/xq-light.css",
    "content": ".cm-s-xq-light span.cm-keyword{line-height:1em;font-weight:700;color:#5A5CAD}.cm-s-xq-light span.cm-atom{color:#6C8CD5}.cm-s-xq-light span.cm-number{color:#164}.cm-s-xq-light span.cm-def{text-decoration:underline}.cm-s-xq-light span.cm-variable,.cm-s-xq-light span.cm-variable-2,.cm-s-xq-light span.cm-variable-3{color:#000}.cm-s-xq-light span.cm-comment{color:#0080FF;font-style:italic}.cm-s-xq-light span.cm-string{color:red}.cm-s-xq-light span.cm-meta{color:#ff0}.cm-s-xq-light span.cm-qualifier{color:grey}.cm-s-xq-light span.cm-builtin{color:#7EA656}.cm-s-xq-light span.cm-bracket{color:#cc7}.cm-s-xq-light span.cm-tag{color:#3F7F7F}.cm-s-xq-light span.cm-attribute{color:#7F007F}.cm-s-xq-light span.cm-error{color:red}.cm-s-xq-light .CodeMirror-activeline-background{background:#e8f2ff}.cm-s-xq-light .CodeMirror-matchingbracket{outline:grey solid 1px;color:#000!important;background:#ff0}"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/yeti.css",
    "content": ".cm-s-yeti.CodeMirror{background-color:#ECEAE8!important;color:#d1c9c0!important;border:none}.cm-s-yeti .CodeMirror-gutters{color:#adaba6;background-color:#E5E1DB;border:none}.cm-s-yeti .CodeMirror-cursor{border-left:solid thin #d1c9c0}.cm-s-yeti .CodeMirror-linenumber{color:#adaba6}.cm-s-yeti .CodeMirror-line::selection,.cm-s-yeti .CodeMirror-line>span::selection,.cm-s-yeti .CodeMirror-line>span>span::selection,.cm-s-yeti.CodeMirror-focused div.CodeMirror-selected{background:#DCD8D2}.cm-s-yeti .CodeMirror-line::-moz-selection,.cm-s-yeti .CodeMirror-line>span::-moz-selection,.cm-s-yeti .CodeMirror-line>span>span::-moz-selection{background:#DCD8D2}.cm-s-yeti span.cm-comment{color:#d4c8be}.cm-s-yeti span.cm-string,.cm-s-yeti span.cm-string-2{color:#96c0d8}.cm-s-yeti span.cm-number{color:#a074c4}.cm-s-yeti span.cm-variable{color:#55b5db}.cm-s-yeti span.cm-variable-2{color:#a074c4}.cm-s-yeti span.cm-def{color:#55b5db}.cm-s-yeti span.cm-keyword,.cm-s-yeti span.cm-operator{color:#9fb96e}.cm-s-yeti span.cm-atom{color:#a074c4}.cm-s-yeti span.cm-meta,.cm-s-yeti span.cm-tag{color:#96c0d8}.cm-s-yeti span.cm-attribute{color:#9fb96e}.cm-s-yeti span.cm-qualifier{color:#96c0d8}.cm-s-yeti span.cm-builtin,.cm-s-yeti span.cm-property{color:#a074c4}.cm-s-yeti span.cm-variable-3{color:#96c0d8}.cm-s-yeti .CodeMirror-activeline-background{background:#E7E4E0}.cm-s-yeti .CodeMirror-matchingbracket{text-decoration:underline}"
  },
  {
    "path": "app/src/main/assets/code_mirror/theme/zenburn.css",
    "content": ".cm-s-zenburn .CodeMirror-gutters{background:#3f3f3f!important}.CodeMirror-foldgutter-folded,.cm-s-zenburn .CodeMirror-foldgutter-open{color:#999}.cm-s-zenburn .CodeMirror-cursor{border-left:1px solid #fff}.cm-s-zenburn{background-color:#3f3f3f;color:#dcdccc}.cm-s-zenburn span.cm-builtin{color:#dcdccc;font-weight:700}.cm-s-zenburn span.cm-comment{color:#7f9f7f}.cm-s-zenburn span.cm-keyword{color:#f0dfaf;font-weight:700}.cm-s-zenburn span.cm-atom{color:#bfebbf}.cm-s-zenburn span.cm-def{color:#dcdccc}.cm-s-zenburn span.cm-variable{color:#dfaf8f}.cm-s-zenburn span.cm-variable-2{color:#dcdccc}.cm-s-zenburn span.cm-string,.cm-s-zenburn span.cm-string-2{color:#cc9393}.cm-s-zenburn span.cm-number{color:#dcdccc}.cm-s-zenburn span.cm-tag{color:#93e0e3}.cm-s-zenburn span.cm-attribute,.cm-s-zenburn span.cm-property{color:#dfaf8f}.cm-s-zenburn span.cm-qualifier{color:#7cb8bb}.cm-s-zenburn span.cm-meta{color:#f0dfaf}.cm-s-zenburn span.cm-header,.cm-s-zenburn span.cm-operator{color:#f0efd0}.cm-s-zenburn span.CodeMirror-matchingbracket{box-sizing:border-box;background:0 0;border-bottom:1px solid}.cm-s-zenburn span.CodeMirror-nonmatchingbracket{border-bottom:1px solid;background:0 0}.cm-s-zenburn .CodeMirror-activeline,.cm-s-zenburn .CodeMirror-activeline-background{background:#000}.cm-s-zenburn div.CodeMirror-selected{background:#545454}.cm-s-zenburn .CodeMirror-focused div.CodeMirror-selected{background:#4f4f4f}"
  },
  {
    "path": "app/src/main/assets/github.css",
    "content": ".markdown-body {\n    font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol;\n    font-size: 16px;\n    line-height: 1.5;\n    word-wrap: break-word\n}\n\n.markdown-body:before {\n    content: \"\";\n    display: table\n}\n\n.markdown-body:after {\n    clear: both;\n    content: \"\";\n    display: table\n}\n\n.markdown-body>:first-child {\n    margin-top: 0 !important\n}\n\n.markdown-body>:last-child {\n    margin-bottom: 0 !important\n}\n\n.markdown-body a:not([href]) {\n    color: inherit;\n    text-decoration: none\n}\n\n.markdown-body .absent {\n    color: #cb2431\n}\n\n.markdown-body .anchor {\n    float: left;\n    line-height: 1;\n    margin-left: -20px;\n    padding-right: 4px\n}\n\n.markdown-body .anchor:focus {\n    outline: none\n}\n\n.markdown-body blockquote,\n.markdown-body dl,\n.markdown-body ol,\n.markdown-body p,\n.markdown-body pre,\n.markdown-body table,\n.markdown-body ul {\n    margin-bottom: 16px;\n    margin-top: 0\n}\n\n.markdown-body hr {\n    background-color: #e1e4e8;\n    border: 0;\n    height: .25em;\n    margin: 24px 0;\n    padding: 0\n}\n\n.markdown-body blockquote {\n    border-left: .25em solid #dfe2e5;\n    color: #6a737d;\n    padding: 0 1em\n}\n\n.markdown-body blockquote>:first-child {\n    margin-top: 0\n}\n\n.markdown-body blockquote>:last-child {\n    margin-bottom: 0\n}\n\n.markdown-body kbd {\n    background-color: #fafbfc;\n    border: 1px solid #c6cbd1;\n    border-bottom-color: #959da5;\n    border-radius: 3px;\n    box-shadow: inset 0 -1px 0 #959da5;\n    color: #444d56;\n    display: inline-block;\n    font-size: 11px;\n    line-height: 10px;\n    padding: 3px 5px;\n    vertical-align: middle\n}\n\n.markdown-body h1,\n.markdown-body h2,\n.markdown-body h3,\n.markdown-body h4,\n.markdown-body h5,\n.markdown-body h6 {\n    font-weight: 600;\n    line-height: 1.25;\n    margin-bottom: 16px;\n    margin-top: 24px\n}\n\n.markdown-body h1 .octicon-link,\n.markdown-body h2 .octicon-link,\n.markdown-body h3 .octicon-link,\n.markdown-body h4 .octicon-link,\n.markdown-body h5 .octicon-link,\n.markdown-body h6 .octicon-link {\n    color: #1b1f23;\n    vertical-align: middle;\n    visibility: hidden\n}\n\n.markdown-body h1:hover .anchor,\n.markdown-body h2:hover .anchor,\n.markdown-body h3:hover .anchor,\n.markdown-body h4:hover .anchor,\n.markdown-body h5:hover .anchor,\n.markdown-body h6:hover .anchor {\n    text-decoration: none\n}\n\n.markdown-body h1:hover .anchor .octicon-link,\n.markdown-body h2:hover .anchor .octicon-link,\n.markdown-body h3:hover .anchor .octicon-link,\n.markdown-body h4:hover .anchor .octicon-link,\n.markdown-body h5:hover .anchor .octicon-link,\n.markdown-body h6:hover .anchor .octicon-link {\n    visibility: visible\n}\n\n.markdown-body h1 code,\n.markdown-body h1 tt,\n.markdown-body h2 code,\n.markdown-body h2 tt,\n.markdown-body h3 code,\n.markdown-body h3 tt,\n.markdown-body h4 code,\n.markdown-body h4 tt,\n.markdown-body h5 code,\n.markdown-body h5 tt,\n.markdown-body h6 code,\n.markdown-body h6 tt {\n    font-size: inherit\n}\n\n.markdown-body h1 {\n    font-size: 2em\n}\n\n.markdown-body h1,\n.markdown-body h2 {\n    border-bottom: 1px solid #eaecef;\n    padding-bottom: .3em\n}\n\n.markdown-body h2 {\n    font-size: 1.5em\n}\n\n.markdown-body h3 {\n    font-size: 1.25em\n}\n\n.markdown-body h4 {\n    font-size: 1em\n}\n\n.markdown-body h5 {\n    font-size: .875em\n}\n\n.markdown-body h6 {\n    color: #6a737d;\n    font-size: .85em\n}\n\n.markdown-body ol,\n.markdown-body ul {\n    padding-left: 2em\n}\n\n.markdown-body ol.no-list,\n.markdown-body ul.no-list {\n    list-style-type: none;\n    padding: 0\n}\n\n.markdown-body ol ol,\n.markdown-body ol ul,\n.markdown-body ul ol,\n.markdown-body ul ul {\n    margin-bottom: 0;\n    margin-top: 0\n}\n\n.markdown-body li {\n    word-wrap: break-all\n}\n\n.markdown-body li>p {\n    margin-top: 16px\n}\n\n.markdown-body li+li {\n    margin-top: .25em\n}\n\n.markdown-body dl {\n    padding: 0\n}\n\n.markdown-body dl dt {\n    font-size: 1em;\n    font-style: italic;\n    font-weight: 600;\n    margin-top: 16px;\n    padding: 0\n}\n\n.markdown-body dl dd {\n    margin-bottom: 16px;\n    padding: 0 16px\n}\n\n.markdown-body table {\n    display: block;\n    overflow: auto;\n    width: 100%\n}\n\n.markdown-body table th {\n    font-weight: 600\n}\n\n.markdown-body table td,\n.markdown-body table th {\n    border: 4px solid #dfe2e5;\n    padding: 6px 13px\n}\n\n.markdown-body table tr {\n    background-color: #fff;\n    border-top: 1px solid #c6cbd1\n}\n\n.markdown-body table tr:nth-child(2n) {\n    background-color: #f6f8fa\n}\n\n.markdown-body table img {\n    background-color: transparent\n}\n\n.markdown-body img {\n    background-color: #fff;\n    box-sizing: content-box;\n    max-width: 100%\n}\n\n.markdown-body img[align=right] {\n    padding-left: 20px\n}\n\n.markdown-body img[align=left] {\n    padding-right: 20px\n}\n\n.markdown-body .emoji {\n    background-color: transparent;\n    max-width: none;\n    vertical-align: text-top\n}\n\n.markdown-body span.frame {\n    display: block;\n    overflow: hidden\n}\n\n.markdown-body span.frame>span {\n    border: 1px solid #dfe2e5;\n    display: block;\n    float: left;\n    margin: 13px 0 0;\n    overflow: hidden;\n    padding: 7px;\n    width: auto\n}\n\n.markdown-body span.frame span img {\n    display: block;\n    float: left\n}\n\n.markdown-body span.frame span span {\n    clear: both;\n    color: #24292e;\n    display: block;\n    padding: 5px 0 0\n}\n\n.markdown-body span.align-center {\n    clear: both;\n    display: block;\n    overflow: hidden\n}\n\n.markdown-body span.align-center>span {\n    display: block;\n    margin: 13px auto 0;\n    overflow: hidden;\n    text-align: center\n}\n\n.markdown-body span.align-center span img {\n    margin: 0 auto;\n    text-align: center\n}\n\n.markdown-body span.align-right {\n    clear: both;\n    display: block;\n    overflow: hidden\n}\n\n.markdown-body span.align-right>span {\n    display: block;\n    margin: 13px 0 0;\n    overflow: hidden;\n    text-align: right\n}\n\n.markdown-body span.align-right span img {\n    margin: 0;\n    text-align: right\n}\n\n.markdown-body span.float-left {\n    display: block;\n    float: left;\n    margin-right: 13px;\n    overflow: hidden\n}\n\n.markdown-body span.float-left span {\n    margin: 13px 0 0\n}\n\n.markdown-body span.float-right {\n    display: block;\n    float: right;\n    margin-left: 13px;\n    overflow: hidden\n}\n\n.markdown-body span.float-right>span {\n    display: block;\n    margin: 13px auto 0;\n    overflow: hidden;\n    text-align: right\n}\n\n.markdown-body code,\n.markdown-body tt {\n    background-color: rgba(27, 31, 35, .05);\n    border-radius: 3px;\n    font-size: 85%;\n    margin: 0;\n    padding: .2em .4em\n}\n\n.markdown-body code br,\n.markdown-body tt br {\n    display: none\n}\n\n.markdown-body del code {\n    text-decoration: inherit\n}\n\n.markdown-body pre {\n    word-wrap: normal\n}\n\n.markdown-body pre>code {\n    background: transparent;\n    border: 0;\n    font-size: 100%;\n    margin: 0;\n    padding: 0;\n    white-space: pre;\n    word-break: normal\n}\n\n.markdown-body .highlight {\n    margin-bottom: 16px\n}\n\n.markdown-body .highlight pre {\n    margin-bottom: 0;\n    word-break: normal\n}\n\n.markdown-body .highlight pre,\n.markdown-body pre {\n    background-color: #f6f8fa;\n    border-radius: 3px;\n    font-size: 85%;\n    line-height: 1.45;\n    overflow: auto;\n    padding: 16px\n}\n\n.markdown-body pre code,\n.markdown-body pre tt {\n    background-color: transparent;\n    border: 0;\n    display: inline;\n    line-height: inherit;\n    margin: 0;\n    max-width: auto;\n    overflow: visible;\n    padding: 0;\n    word-wrap: normal\n}\n\n.markdown-body .csv-data td,\n.markdown-body .csv-data th {\n    font-size: 12px;\n    line-height: 1;\n    overflow: hidden;\n    padding: 5px;\n    text-align: left;\n    white-space: nowrap\n}\n\n.markdown-body .csv-data .blob-num {\n    background: #fff;\n    border: 0;\n    padding: 10px 8px 9px;\n    text-align: right\n}\n\n.markdown-body .csv-data tr {\n    border-top: 0\n}\n\n.markdown-body .csv-data th {\n    background: #f6f8fa;\n    border-top: 0;\n    font-weight: 600\n}\n\nhtml {\n    -ms-text-size-adjust: 100%;\n    -webkit-text-size-adjust: 100%;\n    font-family: sans-serif\n}\n\nbody {\n    margin: 0\n}\n\narticle, aside, details, figcaption, figure, footer, header, main, menu, nav, section {\n    display: block\n}\n\nsummary {\n    display: list-item\n}\n\naudio, canvas, progress, video {\n    display: inline-block\n}\n\naudio:not([controls]) {\n    display: none;\n    height: 0\n}\n\nprogress {\n    vertical-align: baseline\n}\n\n[hidden], template {\n    display: none!important\n}\n\na {\n    background-color: transparent\n}\n\na:active, a:hover {\n    outline-width: 0\n}\n\nabbr[title] {\n    -webkit-text-decoration: underline dotted;\n    border-bottom: none;\n    text-decoration: underline;\n    text-decoration: underline dotted\n}\n\nb, strong {\n    font-weight: inherit;\n    font-weight: bolder\n}\n\ndfn {\n    font-style: italic\n}\n\nh1 {\n    font-size: 2em;\n    margin: .67em 0\n}\n\nmark {\n    background-color: #ff0;\n    color: #000\n}\n\nsmall {\n    font-size: 80%\n}\n\nsub, sup {\n    font-size: 75%;\n    line-height: 0;\n    position: relative;\n    vertical-align: baseline\n}\n\nsub {\n    bottom: -.25em\n}\n\nsup {\n    top: -.5em\n}\n\nimg {\n    border-style: none\n}\n\nsvg:not(:root) {\n    overflow: hidden\n}\n\ncode, kbd, pre, samp {\n    font-family: monospace, monospace;\n    font-size: 1em\n}\n\nfigure {\n    margin: 1em 40px\n}\n\nhr {\n    box-sizing: content-box;\n    height: 0;\n    overflow: visible\n}\n\nbutton, input, select, textarea {\n    font: inherit;\n    margin: 0\n}\n\noptgroup {\n    font-weight: 700\n}\n\nbutton, input {\n    overflow: visible\n}\n\nbutton, select {\n    text-transform: none\n}\n\n[type=reset], [type=submit], button, html [type=button] {\n    -webkit-appearance: button\n}\n\n[type=button]::-moz-focus-inner, [type=reset]::-moz-focus-inner, [type=submit]::-moz-focus-inner, button::-moz-focus-inner {\n    border-style: none;\n    padding: 0\n}\n\n[type=button]:-moz-focusring, [type=reset]:-moz-focusring, [type=submit]:-moz-focusring, button:-moz-focusring {\n    outline: 1px dotted ButtonText\n}\n\nfieldset {\n    border: 1px solid silver;\n    margin: 0 2px;\n    padding: .35em .625em .75em\n}\n\nlegend {\n    box-sizing: border-box;\n    color: inherit;\n    display: table;\n    max-width: 100%;\n    padding: 0;\n    white-space: normal\n}\n\ntextarea {\n    overflow: auto\n}\n\n[type=checkbox], [type=radio] {\n    box-sizing: border-box;\n    padding: 0\n}\n\n[type=number]::-webkit-inner-spin-button, [type=number]::-webkit-outer-spin-button {\n    height: auto\n}\n\n[type=search] {\n    -webkit-appearance: textfield;\n    outline-offset: -2px\n}\n\n[type=search]::-webkit-search-cancel-button, [type=search]::-webkit-search-decoration {\n    -webkit-appearance: none\n}\n\n::-webkit-input-placeholder {\n    color: inherit;\n    opacity: .54\n}\n\n::-webkit-file-upload-button {\n    -webkit-appearance: button;\n    font: inherit\n}\n\n* {\n    box-sizing: border-box\n}\n\nbutton, input, select, textarea {\n    font-family: inherit;\n    font-size: inherit;\n    line-height: inherit\n}\n\nbody {\n    background-color: #fff;\n    color: #24292e;\n    font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol;\n    font-size: 14px;\n    line-height: 1.5\n}\n\na {\n    color: #0366d6;\n    text-decoration: none\n}\n\na:hover {\n    text-decoration: underline\n}\n\nb, strong {\n    font-weight: 600\n}\n\n.rule, hr {\n    background: transparent;\n    border: 0;\n    border-bottom: 1px solid #dfe2e5;\n    height: 0;\n    margin: 15px 0;\n    overflow: hidden\n}\n\n.rule:before, hr:before {\n    content: \"\";\n    display: table\n}\n\n.rule:after, hr:after {\n    clear: both;\n    content: \"\";\n    display: table\n}\n\ntable {\n    border-collapse: collapse;\n    border-spacing: 0\n}\n\ntd, th {\n    padding: 0\n}\n\nbutton {\n    border-radius: 0;\n    cursor: pointer\n}\n\n[hidden][hidden] {\n    display: none!important\n}\n\ndetails summary {\n    cursor: pointer\n}\n\ndetails:not([open])>:not(summary) {\n    display: none!important\n}\n\nh1, h2, h3, h4, h5, h6 {\n    margin-bottom: 0;\n    margin-top: 0\n}\n\nh1 {\n    font-size: 32px\n}\n\nh1, h2 {\n    font-weight: 600\n}\n\nh2 {\n    font-size: 24px\n}\n\nh3 {\n    font-size: 20px\n}\n\nh3, h4 {\n    font-weight: 600\n}\n\nh4 {\n    font-size: 16px\n}\n\nh5 {\n    font-size: 14px\n}\n\nh5, h6 {\n    font-weight: 600\n}\n\nh6 {\n    font-size: 12px\n}\n\np {\n    margin-bottom: 10px;\n    margin-top: 0\n}\n\nsmall {\n    font-size: 90%\n}\n\nblockquote {\n    margin: 0\n}\n\nol, ul {\n    margin-bottom: 0;\n    margin-top: 0;\n    padding-left: 0\n}\n\nol ol, ul ol {\n    list-style-type: lower-roman\n}\n\nol ol ol, ol ul ol, ul ol ol, ul ul ol {\n    list-style-type: lower-alpha\n}\n\ndd {\n    margin-left: 0\n}\n\ncode, pre, tt {\n    font-family: SFMono-Regular, Consolas, Liberation Mono, Menlo, Courier, monospace;\n    font-size: 12px\n}\n\npre {\n    margin-bottom: 0;\n    margin-top: 0\n}\n\n.octicon {\n    vertical-align: text-bottom\n}\n.pl-c {\n    color: #6a737d\n}\n\n.pl-c1, .pl-s .pl-v {\n    color: #005cc5\n}\n\n.pl-e, .pl-en {\n    color: #6f42c1\n}\n\n.pl-s .pl-s1, .pl-smi {\n    color: #24292e\n}\n\n.pl-ent {\n    color: #22863a\n}\n\n.pl-k {\n    color: #d73a49\n}\n\n.pl-pds, .pl-s, .pl-s .pl-pse .pl-s1, .pl-sr, .pl-sr .pl-cce, .pl-sr .pl-sra, .pl-sr .pl-sre {\n    color: #032f62\n}\n\n.pl-smw, .pl-v {\n    color: #e36209\n}\n\n.pl-bu {\n    color: #b31d28\n}\n\n.pl-ii {\n    background-color: #b31d28;\n    color: #fafbfc\n}\n\n.pl-c2 {\n    background-color: #d73a49;\n    color: #fafbfc\n}\n\n.pl-c2:before {\n    content: \"^M\"\n}\n\n.pl-sr .pl-cce {\n    color: #22863a;\n    font-weight: 700\n}\n\n.pl-ml {\n    color: #735c0f\n}\n\n.pl-mh, .pl-mh .pl-en, .pl-ms {\n    color: #005cc5;\n    font-weight: 700\n}\n\n.pl-mi {\n    color: #24292e;\n    font-style: italic\n}\n\n.pl-mb {\n    color: #24292e;\n    font-weight: 700\n}\n\n.pl-md {\n    background-color: #ffeef0;\n    color: #b31d28\n}\n\n.pl-mi1 {\n    background-color: #f0fff4;\n    color: #22863a\n}\n\n.pl-mc {\n    background-color: #ffebda;\n    color: #e36209\n}\n\n.pl-mi2 {\n    background-color: #005cc5;\n    color: #f6f8fa\n}\n\n.pl-mdr {\n    color: #6f42c1;\n    font-weight: 700\n}\n\n.pl-ba {\n    color: #586069\n}\n\n.pl-sg {\n    color: #959da5\n}\n\n.pl-corl {\n    color: #032f62;\n    text-decoration: underline\n}\n"
  },
  {
    "path": "app/src/main/assets/intercept.js",
    "content": "window.onload = function(){\n    addTouchEvents(document.getElementsByTagName(\"pre\"));\n    addTouchEvents(document.getElementsByTagName(\"table\"));\n};\n\nfunction addTouchEvents(elements){\n    for(var i = 0; i < elements.length; i++){\n        elements[i].addEventListener(\"touchstart\", touchStart, false);\n        elements[i].addEventListener(\"touchend\", touchEnd, false);\n    }\n}\n\nfunction touchStart(event){\n    //if(event.target.scrollWidth > event.target.clientWidth)\n        Readme.startIntercept();\n}\n\nfunction touchEnd(event){\n    //if(event.target.scrollWidth > event.target.clientWidth)\n        Readme.stopIntercept();\n}"
  },
  {
    "path": "app/src/main/assets/polyfills.js",
    "content": "// This contains polyfills for Set, Promise and Object.setPrototypeOf\n(function() {\n    //Object.setPrototypeOf\n    Object.setPrototypeOf||(Object.setPrototypeOf=function(t,o){\"use strict\";var e;function r(t,o){return function(t,o){if(\"object\"!=typeof t||null===t)throw new TypeError(\"can not set prototype on a non-object \" + t);if(\"object\"!=typeof o&&null!==o)throw new TypeError(\"can only set prototype to an object or null\")}(t,o),e.call(t,o),t}try{(e=t.getOwnPropertyDescriptor(t.prototype,o).set).call({},null)}catch(n){if(t.prototype!=={}[o])return;e=function(t){this[o]=t},r.polyfill=r(r({},null),t.prototype)instanceof t}return r}(Object,\"__proto__\"));\n    // Set and other collections\n    (function(e){function f(a,c){function b(a){if(!this||this.constructor!==b)return new b(a);this._keys=[];this._values=[];this._itp=[];this.objectOnly=c;a&&v.call(this,a)}c||w(a,\"size\",{get:x});a.constructor=b;b.prototype=a;return b}function v(a){this.add?a.forEach(this.add,this):a.forEach(function(a){this.set(a[0],a[1])},this)}function d(a){this.has(a)&&(this._keys.splice(b,1),this._values.splice(b,1),this._itp.forEach(function(a){b<a[0]&&a[0]--}));return-1<b}function m(a){return this.has(a)?this._values[b]:\n    void 0}function n(a,c){if(this.objectOnly&&c!==Object(c))throw new TypeError(\"Invalid value used as weak collection key\");if(c!=c||0===c)for(b=a.length;b--&&!y(a[b],c););else b=a.indexOf(c);return-1<b}function p(a){return n.call(this,this._values,a)}function q(a){return n.call(this,this._keys,a)}function r(a,c){this.has(a)?this._values[b]=c:this._values[this._keys.push(a)-1]=c;return this}function t(a){this.has(a)||this._values.push(a);return this}function h(){(this._keys||0).length=this._values.length=\n    0}function z(){return k(this._itp,this._keys)}function l(){return k(this._itp,this._values)}function A(){return k(this._itp,this._keys,this._values)}function B(){return k(this._itp,this._values,this._values)}function k(a,c,b){var g=[0],e=!1;a.push(g);return{next:function(){var f,d=g[0];!e&&d<c.length?(f=b?[c[d],b[d]]:c[d],g[0]++):(e=!0,a.splice(a.indexOf(g),1));return{done:e,value:f}}}}function x(){return this._values.length}function u(a,c){for(var b=this.entries();;){var d=b.next();if(d.done)break;\n    a.call(c,d.value[1],d.value[0],this)}}var b,w=Object.defineProperty,y=function(a,b){return isNaN(a)?isNaN(b):a===b};\"undefined\"==typeof WeakMap&&(e.WeakMap=f({\"delete\":d,clear:h,get:m,has:q,set:r},!0));\"undefined\"!=typeof Map&&\"function\"===typeof(new Map).values&&(new Map).values().next||(e.Map=f({\"delete\":d,has:q,get:m,set:r,keys:z,values:l,entries:A,forEach:u,clear:h}));\"undefined\"!=typeof Set&&\"function\"===typeof(new Set).values&&(new Set).values().next||(e.Set=f({has:p,add:t,\"delete\":d,clear:h,\n    keys:l,values:l,entries:B,forEach:u}));\"undefined\"==typeof WeakSet&&(e.WeakSet=f({\"delete\":d,add:t,clear:h,has:p},!0))})(\"undefined\"!=typeof exports&&\"undefined\"!=typeof global?global:window);\n    // Promise\n    !function(e,n){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=n():\"function\"==typeof define&&define.amd?define(n):e.Promise=n()}(this,function(){\"use strict\";function e(){}function n(e){if(!(this instanceof n))throw new TypeError(\"Promises must be constructed via new\");if(\"function\"!=typeof e)throw new TypeError(\"not a function\");this._state=0,this._handled=!1,this._value=undefined,this._deferreds=[],f(e,this)}function t(e,t){for(;3===e._state;)e=e._value;0!==e._state?(e._handled=!0,n._immediateFn(function(){var n=1===e._state?t.onFulfilled:t.onRejected;if(null!==n){var i;try{i=n(e._value)}catch(f){return void r(t.promise,f)}o(t.promise,i)}else(1===e._state?o:r)(t.promise,e._value)})):e._deferreds.push(t)}function o(e,t){try{if(t===e)throw new TypeError(\"A promise cannot be resolved with itself.\");if(t&&(\"object\"==typeof t||\"function\"==typeof t)){var o=t.then;if(t instanceof n)return e._state=3,e._value=t,void i(e);if(\"function\"==typeof o)return void f(function(e,n){return function(){e.apply(n,arguments)}}(o,t),e)}e._state=1,e._value=t,i(e)}catch(u){r(e,u)}}function r(e,n){e._state=2,e._value=n,i(e)}function i(e){2===e._state&&0===e._deferreds.length&&n._immediateFn(function(){e._handled||n._unhandledRejectionFn(e._value)});for(var o=0,r=e._deferreds.length;r>o;o++)t(e,e._deferreds[o]);e._deferreds=null}function f(e,n){var t=!1;try{e(function(e){t||(t=!0,o(n,e))},function(e){t||(t=!0,r(n,e))})}catch(i){if(t)return;t=!0,r(n,i)}}var u=setTimeout;return n.prototype[\"catch\"]=function(e){return this.then(null,e)},n.prototype.then=function(n,o){var r=new this.constructor(e);return t(this,new function(e,n,t){this.onFulfilled=\"function\"==typeof e?e:null,this.onRejected=\"function\"==typeof n?n:null,this.promise=t}(n,o,r)),r},n.prototype[\"finally\"]=function(e){var n=this.constructor;return this.then(function(t){return n.resolve(e()).then(function(){return t})},function(t){return n.resolve(e()).then(function(){return n.reject(t)})})},n.all=function(e){return new n(function(n,t){function o(e,f){try{if(f&&(\"object\"==typeof f||\"function\"==typeof f)){var u=f.then;if(\"function\"==typeof u)return void u.call(f,function(n){o(e,n)},t)}r[e]=f,0==--i&&n(r)}catch(c){t(c)}}if(!e||\"undefined\"==typeof e.length)throw new TypeError(\"Promise.all accepts an array\");var r=Array.prototype.slice.call(e);if(0===r.length)return n([]);for(var i=r.length,f=0;r.length>f;f++)o(f,r[f])})},n.resolve=function(e){return e&&\"object\"==typeof e&&e.constructor===n?e:new n(function(n){n(e)})},n.reject=function(e){return new n(function(n,t){t(e)})},n.race=function(e){return new n(function(n,t){for(var o=0,r=e.length;r>o;o++)e[o].then(n,t)})},n._immediateFn=\"function\"==typeof setImmediate&&function(e){setImmediate(e)}||function(e){u(e,0)},n._unhandledRejectionFn=function(e){void 0!==console&&console&&console.warn(\"Possible Unhandled Promise Rejection:\",e)},n});\n})();"
  },
  {
    "path": "app/src/main/assets/source-editor.css",
    "content": "body {\n  padding: 0;\n  margin: 0;\n  font-size: 12px;\n}\n\n.CodeMirror {\n  height: auto;\n  overflow-y: hidden;\n  overflow-x: hidden;\n  line-height: 1.4em;\n}\n\nimg {\n  display: block;\n  border: 1px solid #999;\n  padding: 1px;\n  margin-top: 10px;\n  margin-left: 10px;\n  background: url(\"trans_bg.gif\") right bottom #EEE;\n}\n"
  },
  {
    "path": "app/src/main/assets/source-editor.html",
    "content": "<!doctype html>\n<html>\n<head>\n    <meta charset=\"utf-8\"/>\n    <meta name=\"viewport\" content=\"width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\"/>\n    <link rel=\"stylesheet\" href=\"code_mirror/lib/codemirror.css\">\n    <link rel=\"stylesheet\" href=\"source-editor.css\">\n    <script src=\"code_mirror/lib/codemirror.js\"></script>\n    <script src=\"code_mirror/mode/meta.js\"></script>\n    <script src=\"code_mirror/addon/mode/loadmode.js\"></script>\n    <script src=\"source-editor.js\"></script>\n</head>\n<body>\n</body>\n</html>\n"
  },
  {
    "path": "app/src/main/assets/source-editor.js",
    "content": "function getExtension(name) {\n  if (!name)\n    return null;\n\n  var lastDot = name.lastIndexOf(\".\");\n  if (lastDot == -1 || lastDot + 1 == name.length)\n    return null;\n  else\n    return name.substring(lastDot + 1).toLowerCase();\n}\n\nfunction updateWidth() {\n  var lines = document.getElementsByClassName(\"CodeMirror-lines\")[0];\n  if (lines) {\n    var root = document.getElementsByClassName(\"CodeMirror\")[0];\n    if (root && lines.scrollWidth > lines.clientWidth)\n      root.style.width = lines.scrollWidth + \"px\";\n  }\n}\n\nfunction loadImage(type, content) {\n  var img = document.createElement(\"img\");\n  img.setAttribute(\"src\", \"data:image/\" + type + \";base64,\" + content);\n  document.body.appendChild(img);\n}\n\nwindow.onload = function () {\n  var name = SourceEditor.getName();\n  var extension = getExtension(name);\n  if (\"png\" == extension || \"gif\" == extension) {\n    loadImage(extension, SourceEditor.getRawContent());\n    return;\n  } else if (\"jpg\" == extension || \"jpeg\" == extension) {\n    loadImage(\"jpeg\", SourceEditor.getRawContent());\n    return;\n  }\n\n  CodeMirror.modeURL = \"code_mirror/mode/%N/%N.js\";\n\n  var config = {};\n  config.value = SourceEditor.getContent();\n  config.readOnly = \"nocursor\";\n  config.lineNumbers = true;\n  config.autofocus = false;\n  config.lineWrapping = !!SourceEditor.getWrap();\n  config.dragDrop = false;\n  config.fixedGutter = false;\n  var editor = CodeMirror(document.body, config);\n\n  var mode, spec;\n\n  var info = CodeMirror.findModeByExtension(extension);\n  if (info) {\n    mode = info.mode;\n    spec = info.mime;\n  }\n\n  if (mode) {\n    editor.setOption(\"mode\", spec);\n    CodeMirror.autoLoadMode(editor, mode);\n  }\n\n  if (!config.lineWrapping)\n    updateWidth();\n};\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ApplicationComponent.java",
    "content": "package com.github.pockethub.android;\n\nimport android.app.Application;\n\nimport com.github.pockethub.android.core.gist.GistStore;\nimport com.github.pockethub.android.dagger.ActivityBuilder;\nimport com.github.pockethub.android.dagger.DialogFragmentBuilder;\nimport com.github.pockethub.android.dagger.ServiceBuilder;\n\nimport javax.inject.Singleton;\n\nimport dagger.BindsInstance;\nimport dagger.Component;\nimport dagger.android.AndroidInjector;\nimport dagger.android.support.AndroidSupportInjectionModule;\n\n@Singleton\n@Component(modules = {\n        AndroidSupportInjectionModule.class,\n        ApplicationModule.class,\n        PocketHubModule.class,\n        ActivityBuilder.class,\n        ServiceBuilder.class,\n        DialogFragmentBuilder.class,\n        GitHubModule.class\n})\npublic interface ApplicationComponent extends AndroidInjector<PocketHub> {\n\n    GistStore gistStore();\n\n    @Component.Builder\n    abstract class Builder extends AndroidInjector.Builder<PocketHub> {\n\n        @BindsInstance\n        abstract Builder application(Application application);\n\n        @Override\n        public abstract ApplicationComponent build();\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ApplicationModule.kt",
    "content": "package com.github.pockethub.android\n\nimport android.app.Application\nimport android.content.Context\nimport com.github.pockethub.android.Database.Companion.Schema\nimport com.meisolsson.githubsdk.core.ServiceGenerator\nimport com.meisolsson.githubsdk.model.IssueState\nimport com.squareup.sqldelight.ColumnAdapter\nimport com.squareup.sqldelight.android.AndroidSqliteDriver\nimport dagger.Binds\nimport dagger.Module\nimport dagger.Provides\nimport javax.inject.Singleton\n\n@Module\ninternal abstract class ApplicationModule {\n    @Binds\n    @Singleton\n    abstract fun provideApplicationContext(application: Application?): Context?\n\n    companion object {\n        @JvmStatic\n        @Singleton\n        @Provides\n        fun provideDatabase(context: Context?): Database {\n            val driver = AndroidSqliteDriver(Schema, context!!, \"cache.db\")\n            return Database(driver, Milestones.Adapter(object : ColumnAdapter<IssueState, String> {\n                var adapter = ServiceGenerator.moshi.adapter<IssueState>(IssueState::class.java)\n                override fun decode(databaseValue: String): IssueState {\n                    return adapter.fromJsonValue(databaseValue)!!\n                }\n\n                override fun encode(value: IssueState): String {\n                    return adapter.toJsonValue(value) as String\n                }\n            }))\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/GitHubModule.java",
    "content": "package com.github.pockethub.android;\n\nimport android.content.Context;\nimport com.meisolsson.githubsdk.core.ServiceGenerator;\nimport com.meisolsson.githubsdk.service.activity.NotificationService;\nimport com.meisolsson.githubsdk.service.gists.GistService;\nimport com.meisolsson.githubsdk.service.issues.IssueService;\nimport com.meisolsson.githubsdk.service.repositories.RepositoryCommentService;\nimport com.meisolsson.githubsdk.service.repositories.RepositoryCommitService;\nimport com.meisolsson.githubsdk.service.repositories.RepositoryService;\nimport com.meisolsson.githubsdk.service.search.SearchService;\nimport com.meisolsson.githubsdk.service.users.UserService;\nimport dagger.Module;\nimport dagger.Provides;\n\nimport javax.inject.Singleton;\n\n@Module\npublic class GitHubModule {\n\n    @Provides\n    @Singleton\n    RepositoryCommitService providesRepositoryCommitService(Context context) {\n        return ServiceGenerator.createService(context, RepositoryCommitService.class);\n    }\n\n    @Provides\n    @Singleton\n    UserService providesUserService(Context context) {\n        return ServiceGenerator.createService(context, UserService.class);\n    }\n\n    @Provides\n    @Singleton\n    RepositoryCommentService providesRepositoryCommentService(Context context) {\n        return ServiceGenerator.createService(context, RepositoryCommentService.class);\n    }\n\n    @Provides\n    @Singleton\n    GistService providesGistService(Context context) {\n        return ServiceGenerator.createService(context, GistService.class);\n    }\n\n    @Provides\n    @Singleton\n    IssueService providesIssueService(Context context) {\n        return ServiceGenerator.createService(context, IssueService.class);\n    }\n\n    @Provides\n    @Singleton\n    RepositoryService providesRepositoryService(Context context) {\n        return ServiceGenerator.createService(context, RepositoryService.class);\n    }\n\n    @Provides\n    @Singleton\n    NotificationService providesNotificationService(Context context) {\n        return ServiceGenerator.createService(context, NotificationService.class);\n    }\n\n    @Provides\n    @Singleton\n    SearchService providesSearchService(Context context) {\n        return ServiceGenerator.createService(context, SearchService.class);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/Intents.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android;\n\nimport android.content.Intent;\nimport android.os.Parcelable;\n\nimport com.github.pockethub.android.util.InfoUtils;\nimport com.meisolsson.githubsdk.model.Gist;\nimport com.meisolsson.githubsdk.model.GistFile;\nimport com.meisolsson.githubsdk.model.Issue;\nimport com.meisolsson.githubsdk.model.Repository;\nimport com.meisolsson.githubsdk.model.User;\n\nimport java.io.Serializable;\nimport java.util.ArrayList;\n\n/**\n * Helper for creating intents\n */\npublic class Intents {\n\n    /**\n     * Prefix for all intents created\n     */\n    public static final String INTENT_PREFIX = BuildConfig.APPLICATION_ID + \".\";\n\n    /**\n     * Prefix for all extra data added to intents\n     */\n    public static final String INTENT_EXTRA_PREFIX = INTENT_PREFIX + \"extra.\";\n\n    /**\n     * Repository handle\n     */\n    public static final String EXTRA_REPOSITORY = INTENT_EXTRA_PREFIX\n            + \"REPOSITORY\";\n\n    /**\n     * Repository ids collection handle\n     */\n    public static final String EXTRA_REPOSITORIES = INTENT_EXTRA_PREFIX\n            + \"REPOSITORIES\";\n\n    /**\n     * Repository name\n     */\n    public static final String EXTRA_REPOSITORY_NAME = INTENT_EXTRA_PREFIX\n            + \"REPOSITORY_NAME\";\n\n    /**\n     * Repository owner\n     */\n    public static final String EXTRA_REPOSITORY_OWNER = INTENT_EXTRA_PREFIX\n            + \"REPOSITORY_OWNER\";\n\n    /**\n     * Issue number\n     */\n    public static final String EXTRA_ISSUE_NUMBER = INTENT_EXTRA_PREFIX\n            + \"ISSUE_NUMBER\";\n\n    /**\n     * Issue handle\n     */\n    public static final String EXTRA_ISSUE = INTENT_EXTRA_PREFIX + \"ISSUE\";\n\n    /**\n     * Issue number collection handle\n     */\n    public static final String EXTRA_ISSUE_NUMBERS = INTENT_EXTRA_PREFIX\n            + \"ISSUE_NUMBERS\";\n\n    /**\n     * Gist id\n     */\n    public static final String EXTRA_GIST_ID = INTENT_EXTRA_PREFIX + \"GIST_ID\";\n\n    /**\n     * List of Gist ids\n     */\n    public static final String EXTRA_GIST_IDS = INTENT_EXTRA_PREFIX\n            + \"GIST_IDS\";\n\n    /**\n     * Gist handle\n     */\n    public static final String EXTRA_GIST = INTENT_EXTRA_PREFIX + \"GIST\";\n\n    /**\n     * Gist file handle\n     */\n    public static final String EXTRA_GIST_FILE = INTENT_EXTRA_PREFIX\n            + \"GIST_FILE\";\n\n    /**\n     * User handle\n     */\n    public static final String EXTRA_USER = INTENT_EXTRA_PREFIX + \"USER\";\n\n    /**\n     * {@link ArrayList} handle of {@link User} objects\n     */\n    public static final String EXTRA_USERS = INTENT_EXTRA_PREFIX + \"USERS\";\n\n    /**\n     * Boolean value which indicates if a user is a collaborator on the repo\n     */\n    public static final String EXTRA_IS_COLLABORATOR = INTENT_EXTRA_PREFIX + \"IS_COLLABORATOR\";\n\n    /**\n     * Boolean value which indicates if a user is owner of the repo\n     */\n    public static final String EXTRA_IS_OWNER = INTENT_EXTRA_PREFIX + \"IS_OWNER\";\n\n    /**\n     * Boolean value which indicates if a user can write to a repo (Push, pull and edit)\n     */\n    public static final String EXTRA_CAN_WRITE_REPO = INTENT_EXTRA_PREFIX + \"CAN_WRITE_REPO\";\n\n    /**\n     * Issue filter handle\n     */\n    public static final String EXTRA_ISSUE_FILTER = INTENT_EXTRA_PREFIX\n            + \"ISSUE_FILTER\";\n\n    /**\n     * Comment body\n     */\n    public static final String EXTRA_COMMENT_BODY = INTENT_EXTRA_PREFIX\n            + \"COMMENT_BODY\";\n\n    /**\n     * Comments handle\n     */\n    public static final String EXTRA_COMMENTS = INTENT_EXTRA_PREFIX\n            + \"COMMENTS\";\n\n    /**\n     * Comment handle\n     */\n    public static final String EXTRA_COMMENT = INTENT_EXTRA_PREFIX + \"COMMENT\";\n\n    /**\n     * Integer position\n     */\n    public static final String EXTRA_POSITION = INTENT_EXTRA_PREFIX\n            + \"POSITION\";\n\n    /**\n     * Base commit name\n     */\n    public static final String EXTRA_BASE = INTENT_EXTRA_PREFIX + \"BASE\";\n\n    /**\n     * Base commit names\n     */\n    public static final String EXTRA_BASES = INTENT_EXTRA_PREFIX + \"BASES\";\n\n    /**\n     * Base commit name\n     */\n    public static final String EXTRA_HEAD = INTENT_EXTRA_PREFIX + \"HEAD\";\n\n    /**\n     * Handle to a {@link String} path\n     */\n    public static final String EXTRA_PATH = INTENT_EXTRA_PREFIX + \"PATH\";\n\n    /**\n     * Resolve the {@link Repository} referenced by the given intent\n     *\n     * @param intent\n     * @return repository id\n     */\n    public static Repository repoFrom(Intent intent) {\n        String repoName = intent.getStringExtra(EXTRA_REPOSITORY_NAME);\n        String repoOwner = intent.getStringExtra(EXTRA_REPOSITORY_OWNER);\n        return InfoUtils.createRepoFromData(repoOwner, repoName);\n    }\n\n    /**\n     * Builder for generating an intent configured with extra data such as an\n     * issue, repository, or gist\n     */\n    public static class Builder {\n\n        private final Intent intent;\n\n        /**\n         * Create builder with suffix\n         *\n         * @param actionSuffix\n         */\n        public Builder(String actionSuffix) {\n            // actionSuffix = e.g. \"repos.VIEW\"\n            intent = new Intent(INTENT_PREFIX + actionSuffix);\n        }\n\n        /**\n         * Add repository to intent being built up\n         *\n         * @param repository\n         * @return this builder\n         */\n        public Builder repo(Repository repository) {\n            return add(EXTRA_REPOSITORY, repository);\n        }\n\n        /**\n         * Add issue to intent being built up\n         *\n         * @param issue\n         * @return this builder\n         */\n        public Builder issue(Issue issue) {\n            return repo(InfoUtils.createRepoFromUrl(issue.htmlUrl())).add(EXTRA_ISSUE,\n                    issue).add(EXTRA_ISSUE_NUMBER, issue.number());\n        }\n\n        /**\n         * Add gist to intent being built up\n         *\n         * @param gist\n         * @return this builder\n         */\n        public Builder gist(Gist gist) {\n            return add(EXTRA_GIST, gist);\n        }\n\n        /**\n         * Add gist id to intent being built up\n         *\n         * @param gist\n         * @return this builder\n         */\n        public Builder gist(String gist) {\n            return add(EXTRA_GIST_ID, gist);\n        }\n\n        /**\n         * Add gist file to intent being built up\n         *\n         * @param file\n         * @return this builder\n         */\n        public Builder gistFile(GistFile file) {\n            return add(EXTRA_GIST_FILE, file);\n        }\n\n        /**\n         * Add user to intent being built up\n         *\n         * @param user\n         * @return this builder;\n         */\n        public Builder user(User user) {\n            return add(EXTRA_USER, user);\n        }\n\n        /**\n         * Add extra field data value to intent being built up\n         *\n         * @param fieldName\n         * @param value\n         * @return this builder\n         */\n        public Builder add(String fieldName, String value) {\n            intent.putExtra(fieldName, value);\n            return this;\n        }\n\n        /**\n         * Add extra field data values to intent being built up\n         *\n         * @param fieldName\n         * @param values\n         * @return this builder\n         */\n        public Builder add(String fieldName, CharSequence[] values) {\n            intent.putExtra(fieldName, values);\n            return this;\n        }\n\n        /**\n         * Add extra field data value to intent being built up\n         *\n         * @param fieldName\n         * @param value\n         * @return this builder\n         */\n        public Builder add(String fieldName, int value) {\n            intent.putExtra(fieldName, value);\n            return this;\n        }\n\n        /**\n         * Add extra field data value to intent being built up\n         *\n         * @param fieldName\n         * @param values\n         * @return this builder\n         */\n        public Builder add(String fieldName, int[] values) {\n            intent.putExtra(fieldName, values);\n            return this;\n        }\n\n        /**\n         * Add extra field data value to intent being built up\n         *\n         * @param fieldName\n         * @param values\n         * @return this builder\n         */\n        public Builder add(String fieldName, boolean[] values) {\n            intent.putExtra(fieldName, values);\n            return this;\n        }\n\n        /**\n         * Add extra field data value to intent being built up\n         *\n         * @param fieldName\n         * @param value\n         * @return this builder\n         */\n        public Builder add(String fieldName, Serializable value) {\n            intent.putExtra(fieldName, value);\n            return this;\n        }\n\n\n        /**\n         * Add extra field data value to intent being built up\n         *\n         * @param fieldName\n         * @param value\n         * @return this builder\n         */\n        public Builder add(String fieldName, Parcelable value) {\n            intent.putExtra(fieldName, value);\n            return this;\n        }\n\n        /**\n         * Add extra field data value to intent being built up\n         *\n         * @param fieldName\n         * @param value\n         * @return this builder\n         */\n        public Builder add(String fieldName, ArrayList<? extends Parcelable> value) {\n            intent.putParcelableArrayListExtra(fieldName, value);\n            return this;\n        }\n\n        /**\n         * Get built intent\n         *\n         * @return intent\n         */\n        public Intent toIntent() {\n            return intent;\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/PocketHub.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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\npackage com.github.pockethub.android;\n\nimport com.bugsnag.android.Bugsnag;\nimport dagger.android.AndroidInjector;\nimport dagger.android.DaggerApplication;\nimport net.danlew.android.joda.JodaTimeAndroid;\n\npublic class PocketHub extends DaggerApplication {\n\n    private ApplicationComponent applicationComponent;\n\n    @Override\n    public void onCreate() {\n        super.onCreate();\n        JodaTimeAndroid.init(this);\n        Bugsnag.init(this);\n        Bugsnag.setNotifyReleaseStages(\"production\");\n    }\n\n    public ApplicationComponent applicationComponent() {\n        return applicationComponent;\n    }\n\n    @Override\n    protected AndroidInjector<? extends DaggerApplication> applicationInjector() {\n        applicationComponent = (ApplicationComponent) DaggerApplicationComponent.builder()\n                .application(this)\n                .create(this);\n\n        return applicationComponent;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/PocketHubModule.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android;\n\nimport android.accounts.Account;\nimport android.accounts.AccountManager;\nimport android.content.Context;\nimport dagger.Module;\nimport dagger.Provides;\n\nimport javax.inject.Named;\nimport java.io.File;\n\n/**\n * Main module provide services and clients\n */\n@Module\npublic class PocketHubModule {\n\n    @Provides\n    Account account(Context context) {\n        AccountManager accountManager = (AccountManager) context.getSystemService(Context.ACCOUNT_SERVICE);\n        Account[] accounts = accountManager.getAccountsByType(context.getString(R.string.account_type));\n        return accounts[0];\n    }\n\n    @Provides\n    @Named(\"cacheDir\")\n    File cacheDir(Context context) {\n        return new File(context.getFilesDir(), \"cache\");\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/RequestCodes.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android;\n\n/**\n * Request codes\n */\npublic interface RequestCodes {\n\n    /**\n     * Request to view a Gist\n     */\n    int GIST_VIEW = 1;\n\n    /**\n     * Request to view an issue\n     */\n    int ISSUE_VIEW = 2;\n\n    /**\n     * Request to edit an issue filter\n     */\n    int ISSUE_FILTER_EDIT = 3;\n\n    /**\n     * Request to create a new issue\n     */\n    int ISSUE_CREATE = 4;\n\n    /**\n     * Request to update an issue's labels\n     */\n    int ISSUE_LABELS_UPDATE = 2;\n\n    /**\n     * Request to update an issue's milestone\n     */\n    int ISSUE_MILESTONE_UPDATE = 3;\n\n    /**\n     * Request to update an issue's assignee\n     */\n    int ISSUE_ASSIGNEE_UPDATE = 4;\n\n    /**\n     * Request to close an issue\n     */\n    int ISSUE_CLOSE = 5;\n\n    /**\n     * Request to reopen an issue\n     */\n    int ISSUE_REOPEN = 6;\n\n    /**\n     * Request to edit an issue\n     */\n    int ISSUE_EDIT = 7;\n\n    /**\n     * Request to create a comment\n     */\n    int COMMENT_CREATE = 8;\n\n    /**\n     * Request to create a gist\n     */\n    int GIST_CREATE = 9;\n\n    /**\n     * Request to view a commit\n     */\n    int COMMIT_VIEW = 10;\n\n    /**\n     * Request to update the current reference\n     */\n    int REF_UPDATE = 11;\n\n    /**\n     * Request to view a repository\n     */\n    int REPOSITORY_VIEW = 12;\n\n    /**\n     * Request to enter two-factor authentication OTP code\n     */\n    int OTP_CODE_ENTER = 13;\n\n    /**\n     * Request to edit a comment\n     */\n    int COMMENT_EDIT = 14;\n\n    /**\n     * Request to delete a comment\n     */\n    int COMMENT_DELETE = 15;\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/RequestReader.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android;\n\nimport android.util.Log;\n\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.IOException;\nimport java.io.ObjectInputStream;\nimport java.io.RandomAccessFile;\nimport java.nio.channels.FileLock;\nimport java.nio.channels.OverlappingFileLockException;\nimport java.util.zip.GZIPInputStream;\n\n/**\n * Reader of previously fetched request data\n */\npublic class RequestReader {\n\n    private static final String TAG = \"RequestReader\";\n\n    private final File handle;\n\n    private final int version;\n\n    /**\n     * Create request reader\n     *\n     * @param file\n     * @param formatVersion\n     */\n    public RequestReader(File file, int formatVersion) {\n        handle = file;\n        version = formatVersion;\n    }\n\n    /**\n     * Read request data\n     *\n     * @return read data\n     */\n    @SuppressWarnings(\"unchecked\")\n    public <V> V read() {\n        if (!handle.exists() || handle.length() == 0) {\n            return null;\n        }\n\n        RandomAccessFile dir = null;\n        FileLock lock = null;\n        ObjectInputStream input = null;\n        boolean delete = false;\n        try {\n            dir = new RandomAccessFile(handle, \"rw\");\n            lock = dir.getChannel().lock();\n            input = new ObjectInputStream(new GZIPInputStream(\n                    new FileInputStream(dir.getFD()), 8192 * 8));\n            int streamVersion = input.readInt();\n            if (streamVersion != version) {\n                delete = true;\n                return null;\n            }\n            return (V) input.readObject();\n        } catch (IOException | OverlappingFileLockException | ClassNotFoundException e) {\n            Log.d(TAG, \"Exception reading cache \" + handle.getName(), e);\n            return null;\n        } finally {\n            if (input != null) {\n                try {\n                    input.close();\n                } catch (IOException e) {\n                    Log.d(TAG, \"Exception closing stream\", e);\n                }\n            }\n            if (delete) {\n                try {\n                    dir.setLength(0);\n                } catch (IOException e) {\n                    Log.d(TAG, \"Exception truncating file\", e);\n                }\n            }\n            if (lock != null) {\n                try {\n                    lock.release();\n                } catch (IOException e) {\n                    Log.d(TAG, \"Exception unlocking file\", e);\n                }\n            }\n            if (dir != null) {\n                try {\n                    dir.close();\n                } catch (IOException e) {\n                    Log.d(TAG, \"Exception closing file\", e);\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/RequestWriter.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android;\n\nimport android.util.Log;\n\nimport java.io.File;\nimport java.io.FileOutputStream;\nimport java.io.IOException;\nimport java.io.ObjectOutputStream;\nimport java.io.RandomAccessFile;\nimport java.nio.channels.FileLock;\nimport java.util.zip.GZIPOutputStream;\n\n/**\n * Request writer\n */\npublic class RequestWriter {\n\n    private static final String TAG = \"RequestWriter\";\n\n    private final File handle;\n\n    private final int version;\n\n    /**\n     * Create a request writer that writes to the given file\n     *\n     * @param file\n     * @param formatVersion\n     */\n    public RequestWriter(File file, int formatVersion) {\n        handle = file;\n        version = formatVersion;\n    }\n\n    private void createDirectory(final File dir) {\n        if (dir != null && !dir.exists()) {\n            dir.mkdirs();\n        }\n    }\n\n    /**\n     * Write request to file\n     *\n     * @param request\n     * @return request\n     */\n    public <V> V write(V request) {\n        RandomAccessFile dir = null;\n        FileLock lock = null;\n        ObjectOutputStream output = null;\n        try {\n            createDirectory(handle.getParentFile());\n            dir = new RandomAccessFile(handle, \"rw\");\n            lock = dir.getChannel().lock();\n            output = new ObjectOutputStream(new GZIPOutputStream(\n                    new FileOutputStream(dir.getFD()), 8192));\n            output.writeInt(version);\n            output.writeObject(request);\n        } catch (IOException e) {\n            Log.d(TAG, \"Exception writing cache \" + handle.getName(), e);\n            return null;\n        } finally {\n            if (output != null) {\n                try {\n                    output.close();\n                } catch (IOException e) {\n                    Log.d(TAG, \"Exception closing stream\", e);\n                }\n            }\n            if (lock != null) {\n                try {\n                    lock.release();\n                } catch (IOException e) {\n                    Log.d(TAG, \"Exception unlocking file\", e);\n                }\n            }\n            if (dir != null) {\n                try {\n                    dir.close();\n                } catch (IOException e) {\n                    Log.d(TAG, \"Exception closing file\", e);\n                }\n            }\n        }\n        return request;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ResultCodes.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android;\n\nimport static android.app.Activity.RESULT_FIRST_USER;\n\n/**\n * Result codes\n */\npublic interface ResultCodes {\n\n    /**\n     * Resource being viewed was modified\n     */\n    int RESOURCE_CHANGED = RESULT_FIRST_USER;\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/accounts/AccountAuthenticator.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.accounts;\n\nimport android.accounts.AbstractAccountAuthenticator;\nimport android.accounts.Account;\nimport android.accounts.AccountAuthenticatorResponse;\nimport android.accounts.NetworkErrorException;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.os.Bundle;\nimport android.text.TextUtils;\n\nimport com.github.pockethub.android.BuildConfig;\n\nimport static android.accounts.AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE;\nimport static android.accounts.AccountManager.KEY_BOOLEAN_RESULT;\nimport static android.accounts.AccountManager.KEY_INTENT;\nimport static com.github.pockethub.android.BuildConfig.ACCOUNT_TYPE;\nimport static com.github.pockethub.android.accounts.LoginActivity.PARAM_AUTHTOKEN_TYPE;\nimport static com.github.pockethub.android.accounts.LoginActivity.PARAM_USERNAME;\n\npublic class AccountAuthenticator extends AbstractAccountAuthenticator {\n\n    private Context context;\n\n    public AccountAuthenticator(final Context context) {\n        super(context);\n\n        this.context = context;\n    }\n\n    /**\n     * The user has requested to add a new account to the system. We return an\n     * intent that will launch our login screen if the user has not logged in\n     * yet, otherwise our activity will just pass the user's credentials on to\n     * the account manager.\n     */\n    @Override\n    public Bundle addAccount(final AccountAuthenticatorResponse response,\n            final String accountType, final String authTokenType,\n            final String[] requiredFeatures, final Bundle options)\n            throws NetworkErrorException {\n        final Intent intent = new Intent(context, LoginActivity.class);\n        intent.putExtra(PARAM_AUTHTOKEN_TYPE, authTokenType);\n        intent.putExtra(KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response);\n        final Bundle bundle = new Bundle();\n        bundle.putParcelable(KEY_INTENT, intent);\n        return bundle;\n    }\n\n    @Override\n    public Bundle confirmCredentials(\n            final AccountAuthenticatorResponse response, final Account account,\n            final Bundle options) {\n        return null;\n    }\n\n    @Override\n    public Bundle editProperties(final AccountAuthenticatorResponse response,\n            final String accountType) {\n        return null;\n    }\n\n    @Override\n    public Bundle getAuthToken(final AccountAuthenticatorResponse response,\n            final Account account, final String authTokenType,\n            final Bundle options) throws NetworkErrorException {\n        return null;\n    }\n\n    @Override\n    public String getAuthTokenLabel(final String authTokenType) {\n        if (ACCOUNT_TYPE.equals(authTokenType)) {\n            return authTokenType;\n        } else {\n            return null;\n        }\n    }\n\n    @Override\n    public Bundle hasFeatures(final AccountAuthenticatorResponse response,\n            final Account account, final String[] features)\n            throws NetworkErrorException {\n        final Bundle result = new Bundle();\n        result.putBoolean(KEY_BOOLEAN_RESULT, false);\n        return result;\n    }\n\n    @Override\n    public Bundle updateCredentials(\n            final AccountAuthenticatorResponse response, final Account account,\n            final String authTokenType, final Bundle options) {\n\n        final Intent intent = new Intent(context, LoginActivity.class);\n        intent.putExtra(PARAM_AUTHTOKEN_TYPE, authTokenType);\n        intent.putExtra(KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response);\n        if (!TextUtils.isEmpty(account.name)) {\n            intent.putExtra(PARAM_USERNAME, account.name);\n        }\n\n        final Bundle bundle = new Bundle();\n        bundle.putParcelable(KEY_INTENT, intent);\n        return bundle;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/accounts/AccountAuthenticatorService.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.accounts;\n\nimport android.app.Service;\nimport android.content.Intent;\nimport android.os.IBinder;\n\nimport static android.accounts.AccountManager.ACTION_AUTHENTICATOR_INTENT;\n\n/**\n * Authenticator service that returns a subclass of AbstractAccountAuthenticator\n * in onBind()\n */\npublic class AccountAuthenticatorService extends Service {\n\n    private static AccountAuthenticator AUTHENTICATOR;\n\n    @Override\n    public IBinder onBind(Intent intent) {\n        return intent.getAction().equals(ACTION_AUTHENTICATOR_INTENT) ? getAuthenticator()\n                .getIBinder() : null;\n    }\n\n    private AccountAuthenticator getAuthenticator() {\n        if (AUTHENTICATOR == null) {\n            AUTHENTICATOR = new AccountAuthenticator(this);\n        }\n        return AUTHENTICATOR;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/accounts/AccountUtils.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.accounts;\n\nimport android.accounts.*;\nimport android.app.Activity;\nimport android.content.Context;\nimport android.os.Build;\nimport android.os.Bundle;\nimport android.text.TextUtils;\nimport android.util.Log;\nimport com.afollestad.materialdialogs.MaterialDialog;\nimport com.github.pockethub.android.BuildConfig;\nimport com.github.pockethub.android.R;\nimport com.meisolsson.githubsdk.model.User;\n\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.concurrent.atomic.AtomicInteger;\n\nimport static android.accounts.AccountManager.KEY_ACCOUNT_NAME;\nimport static android.util.Log.DEBUG;\nimport static com.github.pockethub.android.BuildConfig.ACCOUNT_TYPE;\n\n/**\n * Helpers for accessing {@link AccountManager}\n */\npublic class AccountUtils {\n\n    private static final String TAG = \"AccountUtils\";\n\n    private static boolean AUTHENTICATOR_CHECKED;\n\n    private static boolean HAS_AUTHENTICATOR;\n\n    private static final AtomicInteger UPDATE_COUNT = new AtomicInteger(0);\n\n    private static class AuthenticatorConflictException extends IOException {\n\n        private static final long serialVersionUID = 641279204734869183L;\n    }\n\n    /**\n     * Verify authenticator registered for account type matches the package name\n     * of this application\n     *\n     * @param manager\n     * @return true is authenticator registered, false otherwise\n     */\n    public static boolean hasAuthenticator(final AccountManager manager) {\n        if (!AUTHENTICATOR_CHECKED) {\n            final AuthenticatorDescription[] types = manager\n                    .getAuthenticatorTypes();\n            if (types != null && types.length > 0) {\n                for (AuthenticatorDescription descriptor : types) {\n                    if (descriptor != null\n                            && ACCOUNT_TYPE.equals(descriptor.type)) {\n                        HAS_AUTHENTICATOR = BuildConfig.APPLICATION_ID.equals(descriptor.packageName);\n                        break;\n                    }\n                }\n            }\n            AUTHENTICATOR_CHECKED = true;\n        }\n\n        return HAS_AUTHENTICATOR;\n    }\n\n    /**\n     * Is the given user the owner of the default account?\n     *\n     * @param context\n     * @param user\n     * @return true if default account user, false otherwise\n     */\n    public static boolean isUser(final Context context, final User user) {\n        if (user == null) {\n            return false;\n        }\n\n        String login = user.login();\n        if (login == null) {\n            return false;\n        }\n\n        return login.equals(getLogin(context));\n    }\n\n    /**\n     * Get login name of configured account\n     *\n     * @param context\n     * @return login name or null if none configure\n     */\n    public static String getLogin(final Context context) {\n        final Account account = getAccount(context);\n        return account != null ? account.name : null;\n    }\n\n    /**\n     * Get configured account\n     *\n     * @param context\n     * @return account or null if none\n     */\n    public static Account getAccount(final Context context) {\n        final Account[] accounts = AccountManager.get(context)\n                .getAccountsByType(ACCOUNT_TYPE);\n        return accounts.length > 0 ? accounts[0] : null;\n    }\n\n    private static Account[] getAccounts(final AccountManager manager)\n            throws OperationCanceledException, AuthenticatorException,\n            IOException {\n        final AccountManagerFuture<Account[]> future = manager\n                .getAccountsByTypeAndFeatures(ACCOUNT_TYPE, null, null, null);\n        final Account[] accounts = future.getResult();\n        if (accounts != null && accounts.length > 0) {\n            return getPasswordAccessibleAccounts(manager, accounts);\n        } else {\n            return new Account[0];\n        }\n    }\n\n    public static boolean renameAccount(String newName, Account account,\n            AccountManager accountManager, Context context) {\n\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {\n            accountManager.renameAccount(account, newName, null, null);\n        } else {\n            Account newAccount = new Account(newName, account.type);\n            Bundle userData = AccountsHelper.buildBundle(\n                    AccountsHelper.getUserName(context, account),\n                    AccountsHelper.getUserMail(context, account),\n                    AccountsHelper.getUserAvatar(context, account),\n                    AccountsHelper.getUrl(context, account)\n            );\n\n            String authToken = accountManager.getUserData(account, AccountManager.KEY_AUTHTOKEN);\n            userData.putString(AccountManager.KEY_AUTHTOKEN, authToken);\n\n            removeAccount(account, accountManager);\n\n            accountManager.addAccountExplicitly(newAccount, null, userData);\n            accountManager.setAuthToken(newAccount, account.type, authToken);\n            LoginActivity.configureSyncFor(newAccount);\n        }\n\n        return true;\n    }\n\n    private static void removeAccount(Account account, AccountManager accountManager) {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {\n            accountManager.removeAccountExplicitly(account);\n        } else {\n            accountManager.removeAccount(account, null, null);\n        }\n    }\n\n    /**\n     * Get default account where password can be retrieved\n     *\n     * @param context\n     * @return password accessible account or null if none\n     */\n    public static Account getPasswordAccessibleAccount(final Context context) {\n        AccountManager manager = AccountManager.get(context);\n        Account[] accounts = manager.getAccountsByType(ACCOUNT_TYPE);\n        if (accounts == null || accounts.length == 0) {\n            return null;\n        }\n\n        try {\n            accounts = getPasswordAccessibleAccounts(manager, accounts);\n        } catch (AuthenticatorConflictException e) {\n            return null;\n        }\n        return accounts != null && accounts.length > 0 ? accounts[0] : null;\n    }\n\n    private static Account[] getPasswordAccessibleAccounts(\n            final AccountManager manager, final Account[] candidates)\n            throws AuthenticatorConflictException {\n        final List<Account> accessible = new ArrayList<>(\n                candidates.length);\n        boolean exceptionThrown = false;\n        for (Account account : candidates) {\n            try {\n                manager.getPassword(account);\n                accessible.add(account);\n            } catch (SecurityException ignored) {\n                exceptionThrown = true;\n            }\n        }\n        if (accessible.isEmpty() && exceptionThrown) {\n            throw new AuthenticatorConflictException();\n        }\n        return accessible.toArray(new Account[accessible.size()]);\n    }\n\n    /**\n     * Get account used for authentication\n     *\n     * @param manager\n     * @param activity\n     * @return account\n     * @throws IOException\n     * @throws AccountsException\n     */\n    public static Account getAccount(final AccountManager manager,\n            final Activity activity) throws IOException, AccountsException {\n        final boolean loggable = Log.isLoggable(TAG, DEBUG);\n        if (loggable) {\n            Log.d(TAG, \"Getting account\");\n        }\n\n        if (activity == null) {\n            throw new IllegalArgumentException(\"Activity cannot be null\");\n        }\n\n        if (activity.isFinishing()) {\n            throw new OperationCanceledException();\n        }\n\n        Account[] accounts;\n        try {\n            if (!hasAuthenticator(manager)) {\n                throw new AuthenticatorConflictException();\n            }\n\n            while ((accounts = getAccounts(manager)).length == 0) {\n                if (loggable) {\n                    Log.d(TAG, \"No GitHub accounts for activity=\" + activity);\n                }\n\n                Bundle result = manager.addAccount(ACCOUNT_TYPE, null, null,\n                        null, activity, null, null).getResult();\n\n                if (loggable) {\n                    Log.d(TAG,\n                            \"Added account \"\n                                    + result.getString(KEY_ACCOUNT_NAME));\n                }\n            }\n        } catch (OperationCanceledException e) {\n            Log.d(TAG, \"Excepting retrieving account\", e);\n            activity.finish();\n            throw e;\n        } catch (AccountsException e) {\n            Log.d(TAG, \"Excepting retrieving account\", e);\n            throw e;\n        } catch (AuthenticatorConflictException e) {\n            activity.runOnUiThread(() -> showConflictMessage(activity));\n            throw e;\n        } catch (IOException e) {\n            Log.d(TAG, \"Excepting retrieving account\", e);\n            throw e;\n        }\n\n        if (loggable) {\n            Log.d(TAG, \"Returning account \" + accounts[0].name);\n        }\n\n        return accounts[0];\n    }\n\n    /**\n     * Update account\n     *\n     * @param account\n     * @param activity\n     * @return true if account was updated, false otherwise\n     */\n    public static boolean updateAccount(final Account account,\n            final Activity activity) {\n        int count = UPDATE_COUNT.get();\n        synchronized (UPDATE_COUNT) {\n            // Don't update the account if the account was successfully updated\n            // while the lock was being waited for\n            if (count != UPDATE_COUNT.get()) {\n                return true;\n            }\n\n            AccountManager manager = AccountManager.get(activity);\n            try {\n                if (!hasAuthenticator(manager)) {\n                    throw new AuthenticatorConflictException();\n                }\n                manager.updateCredentials(account, ACCOUNT_TYPE, null,\n                        activity, null, null).getResult();\n                UPDATE_COUNT.incrementAndGet();\n                return true;\n            } catch (OperationCanceledException e) {\n                Log.d(TAG, \"Excepting retrieving account\", e);\n                activity.finish();\n                return false;\n            } catch (AccountsException e) {\n                Log.d(TAG, \"Excepting retrieving account\", e);\n                return false;\n            } catch (AuthenticatorConflictException e) {\n                activity.runOnUiThread(() -> showConflictMessage(activity));\n                return false;\n            } catch (IOException e) {\n                Log.d(TAG, \"Excepting retrieving account\", e);\n                return false;\n            }\n        }\n    }\n\n    /**\n     * Show conflict message about previously registered authenticator from\n     * another application\n     *\n     * @param activity\n     */\n    private static void showConflictMessage(final Activity activity) {\n        new MaterialDialog.Builder(activity)\n                .title(R.string.authenticator_conflict_title)\n                .content(R.string.authenticator_conflict_message)\n                .positiveText(android.R.string.ok)\n                .cancelListener(dialog -> activity.finish())\n                .onPositive((dialog, which) -> activity.finish())\n                .show();\n    }\n\n    /**\n     * Is the given {@link Exception} due to a 401 Unauthorized API response?\n     *\n     * @param e\n     * @return true if 401, false otherwise\n     */\n    public static boolean isUnauthorized(final Exception e) {\n        String message = null;\n        if (e instanceof IOException) {\n            message = e.getMessage();\n        }\n        final Throwable cause = e.getCause();\n        if (cause instanceof IOException) {\n            String causeMessage = cause.getMessage();\n            if (!TextUtils.isEmpty(causeMessage)) {\n                message = causeMessage;\n            }\n        }\n\n        if (TextUtils.isEmpty(message)) {\n            return false;\n        }\n\n        if (\"Received authentication challenge is null\".equals(message)) {\n            return true;\n        }\n        return \"No authentication challenges found\".equals(message);\n\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/accounts/AccountsHelper.java",
    "content": "/*\n * Copyright (c) 2016 PocketHub\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\npackage com.github.pockethub.android.accounts;\n\nimport android.accounts.Account;\nimport android.accounts.AccountManager;\nimport android.content.Context;\nimport android.os.Bundle;\n\npublic class AccountsHelper {\n    public static final String USER_PIC = \"USER_PIC\";\n    public static final String USER_URL = \"USER_URL\";\n    private static final String USER_MAIL = \"USER_MAIL\";\n    private static final String USER_NAME = \"USER_NAME\";\n\n    public static Bundle buildBundle(String name, String mail, String avatar) {\n        Bundle userData = new Bundle();\n\n        userData.putString(AccountsHelper.USER_PIC, avatar);\n        userData.putString(AccountsHelper.USER_MAIL, mail);\n        userData.putString(AccountsHelper.USER_NAME, name);\n\n        return userData;\n    }\n\n    public static Bundle buildBundle(String name, String mail, String avatar, String url) {\n        Bundle userData = new Bundle();\n\n        userData.putString(AccountsHelper.USER_PIC, avatar);\n        userData.putString(AccountsHelper.USER_MAIL, mail);\n        userData.putString(AccountsHelper.USER_NAME, name);\n\n        if (url != null) {\n            userData.putString(AccountsHelper.USER_URL, url);\n        }\n\n        return userData;\n    }\n\n    public static String getUserAvatar(Context context, Account account) {\n        AccountManager manager = AccountManager.get(context);\n        return manager.getUserData(account, USER_PIC);\n    }\n\n    public static String getUserMail(Context context, Account account) {\n        AccountManager manager = AccountManager.get(context);\n        return manager.getUserData(account, USER_MAIL);\n    }\n\n    public static String getUrl(Context context, Account account) {\n        AccountManager manager = AccountManager.get(context);\n        return manager.getUserData(account, USER_URL);\n    }\n\n    public static String getUserName(Context context, Account account) {\n        AccountManager manager = AccountManager.get(context);\n        return manager.getUserData(account, USER_NAME);\n    }\n\n    public static String getUserToken(Context context, Account account) {\n        AccountManager manager = AccountManager.get(context);\n        return manager.getUserData(account, AccountManager.KEY_AUTHTOKEN);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/accounts/LoginActivity.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.accounts;\n\nimport android.accounts.Account;\nimport android.accounts.AccountManager;\nimport android.content.ContentResolver;\nimport android.content.Intent;\nimport android.content.PeriodicSync;\nimport android.net.Uri;\nimport android.os.Bundle;\nimport android.util.Log;\nimport android.view.Menu;\nimport android.view.MenuItem;\nimport android.widget.Toast;\nimport com.afollestad.materialdialogs.MaterialDialog;\nimport com.github.pockethub.android.BuildConfig;\nimport com.github.pockethub.android.R;\nimport com.github.pockethub.android.rx.AutoDisposeUtils;\nimport com.github.pockethub.android.ui.MainActivity;\nimport com.github.pockethub.android.ui.base.AccountAuthenticatorAppCompatActivity;\nimport com.meisolsson.githubsdk.core.ServiceGenerator;\nimport com.meisolsson.githubsdk.core.TokenStore;\nimport com.meisolsson.githubsdk.model.GitHubToken;\nimport com.meisolsson.githubsdk.model.User;\nimport com.meisolsson.githubsdk.model.request.RequestToken;\nimport com.meisolsson.githubsdk.service.users.UserService;\nimport io.reactivex.android.schedulers.AndroidSchedulers;\nimport io.reactivex.schedulers.Schedulers;\nimport okhttp3.HttpUrl;\n\nimport javax.inject.Inject;\nimport java.util.List;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * Activity to login\n */\npublic class LoginActivity extends AccountAuthenticatorAppCompatActivity {\n\n    /**\n     * Auth token type parameter\n     */\n    public static final String PARAM_AUTHTOKEN_TYPE = \"authtokenType\";\n\n    /**\n     * Initial user name\n     */\n    public static final String PARAM_USERNAME = \"username\";\n\n    public static final String OAUTH_HOST = \"www.github.com\";\n\n    public static final String INTENT_EXTRA_URL = \"url\";\n\n    private static int WEBVIEW_REQUEST_CODE = 0;\n\n    private static final String TAG = \"LoginActivity\";\n\n    private static final long SYNC_PERIOD = TimeUnit.HOURS.toSeconds(8);\n    private String clientId;\n    private String secret;\n    private String redirectUri;\n\n    public static void configureSyncFor(Account account) {\n        Log.d(TAG, \"Configuring account sync\");\n\n        ContentResolver.setIsSyncable(account, BuildConfig.PROVIDER_AUTHORITY_SYNC, 1);\n        ContentResolver.setSyncAutomatically(account, BuildConfig.PROVIDER_AUTHORITY_SYNC, true);\n\n        List<PeriodicSync> syncs = ContentResolver.getPeriodicSyncs(\n                account,\n                BuildConfig.PROVIDER_AUTHORITY_SYNC\n        );\n\n        if (syncs.isEmpty()) {\n            ContentResolver.addPeriodicSync(\n                    account,\n                    BuildConfig.PROVIDER_AUTHORITY_SYNC,\n                    new Bundle(),\n                    SYNC_PERIOD\n            );\n        }\n    }\n\n    private AccountManager accountManager;\n\n    private MaterialDialog progressDialog;\n\n    @Inject\n    protected UserService userService;\n\n    @Override\n    public void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.login);\n\n        clientId = getString(R.string.github_client);\n        secret = getString(R.string.github_secret);\n        redirectUri = getString(R.string.github_oauth);\n\n        accountManager = AccountManager.get(this);\n\n        Account[] accounts = accountManager.getAccountsByType(getString(R.string.account_type));\n\n        if (accounts.length > 0) {\n            openMain();\n        }\n        checkOauthConfig();\n    }\n\n    private void checkOauthConfig() {\n        if (clientId.equals(\"dummy_client\") || secret.equals(\"dummy_secret\")) {\n            Toast.makeText(this, R.string.error_oauth_not_configured, Toast.LENGTH_LONG).show();\n        }\n    }\n\n    @Override\n    protected void onNewIntent(Intent intent) {\n        super.onNewIntent(intent);\n        Uri uri = intent.getData();\n        onUserLoggedIn(uri);\n    }\n\n    private void onUserLoggedIn(Uri uri) {\n        if (uri != null && uri.getScheme().equals(getString(R.string.github_oauth_scheme))) {\n            openLoadingDialog();\n            String code = uri.getQueryParameter(\"code\");\n            RequestToken request = RequestToken.builder()\n                    .clientId(clientId)\n                    .clientSecret(secret)\n                    .redirectUri(redirectUri)\n                    .code(code)\n                    .build();\n\n            ServiceGenerator.createAuthService()\n                    .getToken(request)\n                    .subscribeOn(Schedulers.io())\n                    .observeOn(AndroidSchedulers.mainThread())\n                    .as(AutoDisposeUtils.bindToLifecycle(this))\n                    .subscribe(response -> {\n                        GitHubToken token = response.body();\n                        if (token.accessToken() != null) {\n                            endAuth(token.accessToken(), token.scope());\n                        } else if (token.error() != null) {\n                            Toast.makeText(this, token.error(), Toast.LENGTH_LONG).show();\n                            progressDialog.dismiss();\n                        }\n                    }, Throwable::printStackTrace);\n        }\n    }\n\n    private void openMain() {\n        Intent intent = new Intent(this, MainActivity.class);\n        startActivity(intent);\n        finish();\n    }\n\n    private void openLoadingDialog() {\n        progressDialog = new MaterialDialog.Builder(this)\n                .progress(true, 0)\n                .content(R.string.login_activity_authenticating)\n                .show();\n    }\n\n    public void handleLogin() {\n        openLoginInBrowser();\n    }\n\n    private void openLoginInBrowser() {\n        String initialScope = \"user,public_repo,repo,delete_repo,notifications,gist\";\n        HttpUrl.Builder url = new HttpUrl.Builder()\n                .scheme(\"https\")\n                .host(OAUTH_HOST)\n                .addPathSegment(\"login\")\n                .addPathSegment(\"oauth\")\n                .addPathSegment(\"authorize\")\n                .addQueryParameter(\"client_id\", getString(R.string.github_client))\n                .addQueryParameter(\"scope\", initialScope);\n\n        Intent intent = new Intent(this, LoginWebViewActivity.class);\n        intent.putExtra(INTENT_EXTRA_URL, url.toString());\n        startActivityForResult(intent, WEBVIEW_REQUEST_CODE);\n    }\n\n    @Override\n    protected void onActivityResult(int requestCode, int resultCode, Intent data) {\n        super.onActivityResult(requestCode, resultCode, data);\n        if (requestCode == WEBVIEW_REQUEST_CODE && resultCode == RESULT_OK) {\n            onUserLoggedIn(data.getData());\n        }\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(MenuItem item) {\n        switch (item.getItemId()) {\n            case R.id.m_login:\n                handleLogin();\n                return true;\n            default:\n                return super.onOptionsItemSelected(item);\n        }\n    }\n\n    private void endAuth(final String accessToken, final String scope) {\n        progressDialog.setContent(getString(R.string.loading_user));\n\n        TokenStore.getInstance(this).saveToken(accessToken);\n        userService\n                .getUser()\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .as(AutoDisposeUtils.bindToLifecycle(this))\n                .subscribe(response -> {\n                    User user = response.body();\n                    Account account = new Account(user.login(), getString(R.string.account_type));\n                    Bundle userData = AccountsHelper.buildBundle(user.name(),\n                            user.email(), user.avatarUrl(), scope);\n                    userData.putString(AccountManager.KEY_AUTHTOKEN, accessToken);\n\n                    accountManager.addAccountExplicitly(account, null, userData);\n                    accountManager.setAuthToken(account, getString(R.string.account_type), accessToken);\n\n                    Bundle result = new Bundle();\n                    result.putString(AccountManager.KEY_ACCOUNT_NAME, account.name);\n                    result.putString(AccountManager.KEY_ACCOUNT_TYPE, account.type);\n                    result.putString(AccountManager.KEY_AUTHTOKEN, accessToken);\n\n                    configureSyncFor(account);\n                    setAccountAuthenticatorResult(result);\n\n                    finish();\n                }, Throwable::printStackTrace);\n    }\n\n    @Override\n    public void finish() {\n        if (progressDialog != null) {\n            progressDialog.dismiss();\n        }\n        super.finish();\n    }\n\n    @Override\n    public boolean onCreateOptionsMenu(Menu optionMenu) {\n        getMenuInflater().inflate(R.menu.activity_login, optionMenu);\n        return true;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/accounts/LoginWebViewActivity.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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\npackage com.github.pockethub.android.accounts;\n\nimport android.annotation.TargetApi;\nimport android.content.Intent;\nimport android.graphics.Bitmap;\nimport android.net.Uri;\nimport android.os.Build;\nimport android.os.Bundle;\nimport android.webkit.WebResourceRequest;\nimport android.webkit.WebResourceResponse;\nimport android.webkit.WebViewClient;\nimport androidx.appcompat.app.AppCompatActivity;\nimport com.afollestad.materialdialogs.MaterialDialog;\nimport com.github.pockethub.android.R;\nimport com.github.pockethub.android.ui.WebView;\nimport okhttp3.OkHttpClient;\nimport okhttp3.Request;\nimport okhttp3.Response;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.SequenceInputStream;\n\npublic class LoginWebViewActivity extends AppCompatActivity {\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        WebView webView = new WebView(this);\n        WebView.setWebContentsDebuggingEnabled(true);\n\n        // Needs the be activated to allow GitHub to perform their requests.\n        webView.getSettings().setJavaScriptEnabled(true);\n\n        String userAgent = webView.getSettings().getUserAgentString();\n        // Remove chrome from the user agent since GitHub checks it incorrectly\n        userAgent = userAgent.replaceAll(\"Chrome/\\\\d{2}\\\\.\\\\d+\\\\.\\\\d+\\\\.\\\\d+\", \"\");\n        webView.getSettings().setUserAgentString(userAgent);\n\n        String url = getIntent().getStringExtra(LoginActivity.INTENT_EXTRA_URL);\n        webView.loadUrl(url);\n\n        webView.setWebViewClient(new WebViewClient() {\n            MaterialDialog dialog = new MaterialDialog.Builder(LoginWebViewActivity.this)\n                    .content(R.string.loading)\n                    .progress(true, 0)\n                    .build();\n\n            @Override\n            public void onPageStarted(android.webkit.WebView view, String url, Bitmap favicon) {\n                dialog.show();\n            }\n\n            @Override\n            public void onPageFinished(android.webkit.WebView view, String url) {\n                dialog.dismiss();\n            }\n\n            @TargetApi(Build.VERSION_CODES.LOLLIPOP)\n            @Override\n            public WebResourceResponse shouldInterceptRequest(android.webkit.WebView view,\n                                                              WebResourceRequest request) {\n                return shouldIntercept(request.getUrl().toString());\n            }\n\n            @Override\n            public WebResourceResponse shouldInterceptRequest(android.webkit.WebView view,\n                                                              String url) {\n                return shouldIntercept(url);\n            }\n\n            @Override\n            public boolean shouldOverrideUrlLoading(android.webkit.WebView view, String url) {\n                Uri uri = Uri.parse(url);\n                return overrideOAuth(uri) || super.shouldOverrideUrlLoading(view, url);\n            }\n\n            @TargetApi(Build.VERSION_CODES.LOLLIPOP)\n            @Override\n            public boolean shouldOverrideUrlLoading(android.webkit.WebView view,\n                                                    WebResourceRequest request) {\n\n                return overrideOAuth(request.getUrl())\n                        || super.shouldOverrideUrlLoading(view, request);\n            }\n\n            /**\n             * This method will inject polyfills to the auth javascript if the version is\n             * below Lollipop. After Lollipop WebView is updated via the Play Store so the polyfills\n             * are not needed.\n             *\n             * @param url The requests url\n             * @return null if there request should not be altered or a new response\n             *     instance with polyfills.\n             */\n            private WebResourceResponse shouldIntercept(String url) {\n                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {\n                    return null;\n                }\n\n                if (url.matches(\".*frameworks.*.js\")) {\n                    InputStream in1 = null;\n                    InputStream in2 = null;\n                    Response response = null;\n                    try {\n                        response = new OkHttpClient.Builder()\n                                .build()\n                                .newCall(new Request.Builder().get().url(url).build())\n                                .execute();\n\n                        if (response.body() != null) {\n                            in1 = response\n                                    .body()\n                                    .byteStream();\n                        }\n\n                        in2 = getAssets().open(\"polyfills.js\");\n                    } catch (IOException e) {\n                        e.printStackTrace();\n                    }\n\n                    if (response == null) {\n                        return null;\n                    }\n\n                    SequenceInputStream inputStream = new SequenceInputStream(in2, in1);\n                    return new WebResourceResponse(\"text/javascript\", \"utf-8\", inputStream);\n                } else {\n                    return null;\n                }\n            }\n\n            private boolean overrideOAuth(Uri uri) {\n                if (uri.getScheme().equals(getString(R.string.github_oauth_scheme))) {\n                    Intent data = new Intent();\n                    data.setData(uri);\n                    setResult(RESULT_OK, data);\n                    finish();\n                    return true;\n                }\n\n                return false;\n            }\n        });\n\n        setContentView(webView);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/core/GitHubRequest.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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\npackage com.github.pockethub.android.core\n\nimport io.reactivex.Single\n\ninterface GitHubRequest<V> {\n\n    fun execute(page: Int): Single<V>\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/core/ItemStore.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.core;\n\nimport java.lang.ref.ReferenceQueue;\nimport java.lang.ref.WeakReference;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\n\n/**\n * Generic weak store of ids to items\n */\npublic abstract class ItemStore {\n\n    private static class ItemReference<V> extends WeakReference<V> {\n\n        private Object id;\n\n        /**\n         * Create item reference\n         *\n         * @param item\n         * @param id\n         * @param queue\n         */\n        public ItemReference(V item, Object id, ReferenceQueue<? super V> queue) {\n            super(item, queue);\n            this.id = id;\n        }\n    }\n\n    /**\n     * Generic reference store\n     *\n     * @param <V>\n     */\n    protected static class ItemReferences<V> {\n\n        private final ReferenceQueue<V> queue;\n\n        private final Map<Object, ItemReference<V>> items;\n\n        /**\n         * Create reference store\n         */\n        public ItemReferences() {\n            queue = new ReferenceQueue<>();\n            items = new ConcurrentHashMap<>();\n        }\n\n        @SuppressWarnings(\"rawtypes\")\n        private void expungeEntries() {\n            ItemReference ref;\n            while ((ref = (ItemReference) queue.poll()) != null) {\n                items.remove(ref.id);\n            }\n        }\n\n        /**\n         * Get item with id from store\n         *\n         * @param id\n         * @return item\n         */\n        public V get(final Object id) {\n            expungeEntries();\n            WeakReference<V> ref = items.get(id);\n            return ref != null ? ref.get() : null;\n        }\n\n        /**\n         * Insert item with id into store\n         *\n         * @param id\n         * @param item\n         */\n        public void put(Object id, V item) {\n            expungeEntries();\n            items.put(id, new ItemReference<>(item, id, queue));\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/core/OnLoadListener.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.core;\n\n/**\n * Load listener callback\n *\n * @param <V>\n */\npublic interface OnLoadListener<V> {\n\n  /**\n   * Loaded callback\n   *\n   * @param data\n   */\n  void loaded(V data);\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/core/code/FullTree.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.core.code;\n\nimport android.text.TextUtils;\n\nimport com.github.pockethub.android.core.commit.CommitUtils;\nimport com.github.pockethub.android.core.ref.RefUtils;\nimport com.meisolsson.githubsdk.model.git.GitEntryType;\nimport com.meisolsson.githubsdk.model.git.GitReference;\nimport com.meisolsson.githubsdk.model.git.GitTree;\nimport com.meisolsson.githubsdk.model.git.GitTreeEntry;\n\nimport java.util.List;\nimport java.util.Map;\nimport java.util.TreeMap;\n\nimport static java.lang.String.CASE_INSENSITIVE_ORDER;\n\n/**\n * {@link GitTree} with additional information\n */\npublic class FullTree {\n\n    /**\n     * Entry in a tree\n     */\n    public static class Entry implements Comparable<Entry> {\n\n        /**\n         * Parent folder\n         */\n        public final Folder parent;\n\n        /**\n         * Raw tree entry\n         */\n        public final GitTreeEntry entry;\n\n        /**\n         * Name\n         */\n        public final String name;\n\n        private Entry() {\n            this.parent = null;\n            this.entry = null;\n            this.name = null;\n        }\n\n        private Entry(GitTreeEntry entry, Folder parent) {\n            this.entry = entry;\n            this.parent = parent;\n            this.name = CommitUtils.getName(entry.path());\n        }\n\n        public boolean isRoot() {\n            return parent == null;\n        }\n\n        @Override\n        public int compareTo(Entry another) {\n            return CASE_INSENSITIVE_ORDER.compare(name, another.name);\n        }\n    }\n\n    /**\n     * Folder in a tree\n     */\n    public static class Folder extends Entry {\n\n        /**\n         * Sub folders\n         */\n        public final Map<String, Folder> folders = new TreeMap<>();\n\n        /**\n         * Files\n         */\n        public final Map<String, Entry> files = new TreeMap<>();\n\n        private Folder() {\n            super();\n        }\n\n        private Folder(GitTreeEntry entry, Folder parent) {\n            super(entry, parent);\n        }\n\n        private void addFile(GitTreeEntry entry, String[] pathSegments, int index) {\n            if (index == pathSegments.length - 1) {\n                Entry file = new Entry(entry, this);\n                files.put(file.name, file);\n            } else {\n                Folder folder = folders.get(pathSegments[index]);\n                if (folder != null) {\n                    folder.addFile(entry, pathSegments, index + 1);\n                }\n            }\n        }\n\n        private void addFolder(GitTreeEntry entry, String[] pathSegments, int index) {\n            if (index == pathSegments.length - 1) {\n                Folder folder = new Folder(entry, this);\n                folders.put(folder.name, folder);\n            } else {\n                Folder folder = folders.get(pathSegments[index]);\n                if (folder != null) {\n                    folder.addFolder(entry, pathSegments, index + 1);\n                }\n            }\n        }\n\n        private void add(final GitTreeEntry entry) {\n            String path = entry.path();\n            if (TextUtils.isEmpty(path)) {\n                return;\n            }\n\n            if (entry.type() == GitEntryType.Blob) {\n                String[] segments = path.split(\"/\");\n                if (segments.length > 1) {\n                    Folder folder = folders.get(segments[0]);\n                    if (folder != null) {\n                        folder.addFile(entry, segments, 1);\n                    }\n                } else if (segments.length == 1) {\n                    Entry file = new Entry(entry, this);\n                    files.put(file.name, file);\n                }\n            } else if (entry.type() == GitEntryType.Tree) {\n                String[] segments = path.split(\"/\");\n                if (segments.length > 1) {\n                    Folder folder = folders.get(segments[0]);\n                    if (folder != null) {\n                        folder.addFolder(entry, segments, 1);\n                    }\n                } else if (segments.length == 1) {\n                    Folder folder = new Folder(entry, this);\n                    folders.put(folder.name, folder);\n                }\n            }\n        }\n    }\n\n    /**\n     * Tree\n     */\n    public final GitTree tree;\n\n    /**\n     * Root folder\n     */\n    public final Folder root;\n\n    /**\n     * Reference\n     */\n    public final GitReference reference;\n\n    /**\n     * Branch where tree is present\n     */\n    public final String branch;\n\n    /**\n     * Create tree with branch\n     *\n     * @param tree\n     * @param reference\n     */\n    public FullTree(final GitTree tree, final GitReference reference) {\n        this.tree = tree;\n        this.reference = reference;\n        this.branch = RefUtils.getName(reference);\n\n        root = new Folder();\n        List<GitTreeEntry> entries = tree.tree();\n        if (entries != null && !entries.isEmpty()) {\n            for (GitTreeEntry entry : entries) {\n                root.add(entry);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/core/code/RefreshTreeTask.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.core.code;\n\nimport android.content.Context;\nimport android.text.TextUtils;\n\nimport com.github.pockethub.android.core.ref.RefUtils;\nimport com.meisolsson.githubsdk.core.ServiceGenerator;\nimport com.meisolsson.githubsdk.model.Commit;\nimport com.meisolsson.githubsdk.model.Repository;\nimport com.meisolsson.githubsdk.model.git.GitCommit;\nimport com.meisolsson.githubsdk.model.git.GitReference;\nimport com.meisolsson.githubsdk.model.git.GitTree;\nimport com.meisolsson.githubsdk.service.git.GitService;\nimport com.meisolsson.githubsdk.service.repositories.RepositoryService;\n\nimport java.io.IOException;\nimport java.sql.Ref;\n\nimport io.reactivex.Observable;\nimport io.reactivex.Single;\nimport io.reactivex.SingleEmitter;\nimport io.reactivex.SingleOnSubscribe;\nimport retrofit2.Response;\n\n/**\n * Task to load the tree for a repo's default branch\n */\npublic class RefreshTreeTask {\n\n    private static final String TAG = \"RefreshTreeTask\";\n\n    private final Context context;\n\n    private final Repository repo;\n\n    private final GitReference reference;\n\n    /**\n     * Create task to refresh repo's tree\n     *\n     * @param repository\n     * @param reference\n     */\n    public RefreshTreeTask(final Context context, final Repository repository,\n                           final GitReference reference) {\n        this.context = context;\n        this.repo = repository;\n        this.reference = reference;\n    }\n\n    private boolean isValidRef(GitReference ref) {\n        return ref != null && ref.object() != null\n                && !TextUtils.isEmpty(ref.object().sha());\n    }\n\n    private Single<GitReference> getValidRef(GitService service, GitReference ref, String branch) {\n        if (!isValidRef(ref)) {\n            return service.getGitReference(repo.owner().login(), repo.name(), branch)\n                    .map(response -> {\n                        if (response.isSuccessful()) {\n                            GitReference fetchedRef = response.body();\n                            if (isValidRef(fetchedRef)) {\n                                return fetchedRef;\n                            } else {\n                                throw new IOException(\"Reference does not have associated commit SHA-1\");\n                            }\n                        } else {\n                            throw new IOException(\"Request for Git Reference was unsuccessful\");\n                        }\n                    });\n        }\n\n        return Single.just(ref);\n    }\n\n    private Single<String> getBranch(GitReference ref) {\n        String branch = RefUtils.getPath(ref);\n        if (branch == null) {\n            branch = repo.defaultBranch();\n            if (TextUtils.isEmpty(branch)) {\n                return ServiceGenerator\n                        .createService(context, RepositoryService.class)\n                        .getRepository(repo.owner().login(), repo.name())\n                        .map(response -> response.body().defaultBranch());\n            }\n        }\n\n        return Single.just(branch);\n    }\n\n    public Single<FullTree> refresh() {\n        GitService gitService = ServiceGenerator.createService(context, GitService.class);\n\n        return getBranch(reference)\n                .map(branch -> branch.replace(\"heads/\", \"\"))\n                .flatMap(branch -> getValidRef(gitService, reference, branch))\n                .flatMap(reference ->\n                        gitService.getGitCommit(repo.owner().login(), repo.name(),\n                                reference.object().sha())\n                                .map(Response::body)\n                                .zipWith(Single.just(reference), RefreshTreeModel::new))\n                .flatMap(model ->\n                        gitService.getGitTreeRecursive(repo.owner().login(),\n                                repo.name(), model.getCommit().tree().sha())\n                                .map(Response::body)\n                                .zipWith(Single.just(model.ref), FullTree::new));\n    }\n\n    private class RefreshTreeModel {\n        private GitReference ref;\n        private GitCommit commit;\n\n        public RefreshTreeModel(GitCommit commit, GitReference ref) {\n            this.commit = commit;\n            this.ref = ref;\n        }\n\n        public GitReference getRef() {\n            return ref;\n        }\n\n        public void setRef(GitReference ref) {\n            this.ref = ref;\n        }\n\n        public GitCommit getCommit() {\n            return commit;\n        }\n\n        public void setCommit(GitCommit commit) {\n            this.commit = commit;\n        }\n\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/core/commit/CommitMatch.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.core.commit\n\nimport com.meisolsson.githubsdk.model.Repository\n\n/**\n * Match for a commit in a repository\n *\n * @property repository Repository of commit\n * @property commit SHA-1 of commit\n */\ndata class CommitMatch(val repository: Repository, val commit: String)\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/core/commit/CommitStore.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.core.commit;\n\nimport android.content.Context;\n\nimport com.github.pockethub.android.core.ItemStore;\nimport com.github.pockethub.android.util.InfoUtils;\nimport com.meisolsson.githubsdk.core.ServiceGenerator;\nimport com.meisolsson.githubsdk.model.Commit;\nimport com.meisolsson.githubsdk.model.Repository;\nimport com.meisolsson.githubsdk.service.repositories.RepositoryCommitService;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\n\nimport io.reactivex.Single;\n\n\n/**\n * Store of commits\n */\n@Singleton\npublic class CommitStore extends ItemStore {\n\n    private final Map<String, ItemReferences<Commit>> commits = new HashMap<>();\n\n    @Inject\n    protected RepositoryCommitService service;\n\n    /**\n     * Create commit store.\n     */\n    @Inject\n    public CommitStore() {\n    }\n\n    /**\n     * Get commit\n     *\n     * @param repo\n     * @param id\n     * @return commit or null if not in store\n     */\n    public Commit getCommit(final Repository repo, final String id) {\n        final ItemReferences<Commit> repoCommits = commits.get(InfoUtils.createRepoId(repo));\n        return repoCommits != null ? repoCommits.get(id) : null;\n    }\n\n    /**\n     * Add commit to store\n     *\n     * @param repo\n     * @param commit\n     * @return commit\n     */\n    public Commit addCommit(Repository repo, Commit commit) {\n        Commit current = getCommit(repo, commit.sha());\n        if (current != null && current.equals(commit)) {\n            return current;\n        }\n\n        String repoId = InfoUtils.createRepoId(repo);\n        ItemReferences<Commit> repoCommits = commits.get(repoId);\n        if (repoCommits == null) {\n            repoCommits = new ItemReferences<>();\n            commits.put(repoId, repoCommits);\n        }\n        repoCommits.put(commit.sha(), commit);\n        return commit;\n    }\n\n    /**\n     * Refresh commit.\n     *\n     * @param repo The repo which the commit is in\n     * @param id The id of the commit\n     * @return refreshed commit\n     */\n    public Single<Commit> refreshCommit(final Repository repo, final String id) {\n        return service\n                .getCommit(repo.owner().login(), repo.name(), id)\n                .map(response -> addCommit(repo, response.body()));\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/core/commit/CommitUriMatcher.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.core.commit;\n\nimport android.net.Uri;\n\nimport com.github.pockethub.android.core.repo.RepositoryUtils;\nimport com.github.pockethub.android.util.InfoUtils;\nimport com.meisolsson.githubsdk.model.Repository;\n\nimport java.util.List;\n\n/**\n * Parses a {@link CommitMatch} from a {@link Uri}\n */\npublic class CommitUriMatcher {\n\n    /**\n     * Attempt to parse a {@link CommitMatch} from the given {@link Uri}\n     *\n     * @param uri\n     * @return {@link CommitMatch} or null if unparseable\n     */\n    public static CommitMatch getCommit(Uri uri) {\n        List<String> segments = uri.getPathSegments();\n        if (segments.size() < 4) {\n            return null;\n        }\n        if (!\"commit\".equals(segments.get(2))) {\n            return null;\n        }\n\n        String repoOwner = segments.get(0);\n        if (!RepositoryUtils.isValidOwner(repoOwner)) {\n            return null;\n        }\n\n        String repoName = segments.get(1);\n        if (!RepositoryUtils.isValidRepo(repoName)) {\n            return null;\n        }\n\n        String commit = segments.get(3);\n        if (!CommitUtils.isValidCommit(commit)) {\n            return null;\n        }\n\n        Repository repository = InfoUtils.createRepoFromData(repoOwner, repoName);\n        return new CommitMatch(repository, commit);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/core/commit/CommitUtils.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.core.commit\n\nimport android.text.SpannedString\nimport android.text.TextUtils\nimport android.widget.ImageView\nimport androidx.core.text.buildSpannedString\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.meisolsson.githubsdk.model.Commit\nimport com.meisolsson.githubsdk.model.GitHubFile\nimport com.meisolsson.githubsdk.model.git.GitCommit\nimport java.text.NumberFormat\nimport java.util.Date\n\n/**\n * Utilities for working with commits\n */\nobject CommitUtils {\n\n    /**\n     * Length of used for abbreviations\n     */\n    private const val LENGTH = 10\n\n    private val FORMAT = NumberFormat.getIntegerInstance()\n\n    /**\n     * Abbreviate commit sha to default length if longer\n     *\n     * @param commit\n     * @return abbreviated sha\n     */\n    @JvmStatic\n    fun abbreviate(commit: Commit?): String? =\n            if (commit != null) abbreviate(commit.sha()) else null\n\n    /**\n     * Abbreviate commit sha to default length if longer\n     *\n     * @param commit\n     * @return abbreviated sha\n     */\n    @JvmStatic\n    fun abbreviate(commit: GitCommit?): String? =\n            if (commit != null) abbreviate(commit.sha()) else null\n\n    /**\n     * Abbreviate sha to default length if longer\n     *\n     * @param sha\n     * @return abbreviated sha\n     */\n    @JvmStatic\n    fun abbreviate(sha: String?): String? =\n            if (!TextUtils.isEmpty(sha) && sha!!.length > LENGTH) sha.substring(0, LENGTH) else sha\n\n    /**\n     * Is the given commit SHA-1 valid?\n     *\n     * @param sha\n     * @return true if valid, false otherwise\n     */\n    @JvmStatic\n    fun isValidCommit(sha: String): Boolean =\n            !TextUtils.isEmpty(sha) && sha.matches(\"[a-fA-F0-9]+\".toRegex())\n\n    /**\n     * Get author of commit\n     *\n     *\n     * This checks both the [Commit] and the underlying\n     * [Commit] to retrieve a name\n     *\n     * @param commit\n     * @return author name or null if missing\n     */\n    @JvmStatic\n    fun getAuthor(commit: Commit): String? {\n        val author = commit.author()\n        if (author != null) {\n            return author.login()\n        }\n\n        val rawCommit = commit.commit() ?: return null\n\n        return rawCommit.author()?.name()\n    }\n\n    /**\n     * Get committer of commit\n     *\n     *\n     * This checks both the [Commit] and the underlying\n     * [Commit] to retrieve a name\n     *\n     * @param commit\n     * @return committer name or null if missing\n     */\n    @JvmStatic\n    fun getCommitter(commit: Commit): String? {\n        val committer = commit.committer()\n        if (committer != null) {\n            return committer.login()\n        }\n\n        val rawCommit = commit.commit() ?: return null\n\n        return rawCommit.committer()?.name()\n    }\n\n    /**\n     * Get author date of commit\n     *\n     * @param commit\n     * @return author name or null if missing\n     */\n    @JvmStatic\n    fun getAuthorDate(commit: Commit): Date? {\n        val rawCommit = commit.commit() ?: return null\n\n        val commitAuthor = rawCommit.author()\n        return commitAuthor?.date()\n    }\n\n    /**\n     * Get committer date of commit\n     *\n     * @param commit\n     * @return author name or null if missing\n     */\n    @JvmStatic\n    fun getCommitterDate(commit: Commit): Date? {\n        val rawCommit = commit.commit() ?: return null\n\n        val commitCommitter = rawCommit.committer()\n        return if (commitCommitter?.date() != null) commitCommitter.date() else null\n    }\n\n    /**\n     * Bind commit author avatar to image view\n     *\n     * @param commit\n     * @param avatars\n     * @param view\n     * @return view\n     */\n    @JvmStatic\n    fun bindAuthor(commit: Commit,\n                   avatars: AvatarLoader, view: ImageView): ImageView {\n        val author = commit.author()\n        if (author != null) {\n            avatars.bind(view, author)\n        }\n\n        return view\n    }\n\n    /**\n     * Bind commit committer avatar to image view\n     *\n     * @param commit\n     * @param avatars\n     * @param view\n     * @return view\n     */\n    @JvmStatic\n    fun bindCommitter(commit: Commit,\n                      avatars: AvatarLoader, view: ImageView): ImageView {\n        val committer = commit.committer()\n        if (committer != null) {\n            avatars.bind(view, committer)\n        }\n\n        return view\n    }\n\n    /**\n     * Get comment count\n     *\n     * @param commit\n     * @return count\n     */\n    @JvmStatic\n    fun getCommentCount(commit: Commit): String {\n        val rawCommit = commit.commit()\n        return if (rawCommit != null) FORMAT.format(rawCommit.commentCount()) else \"0\"\n    }\n\n    /**\n     * Format stats into [SpannedString]\n     *\n     * @param files\n     * @return styled text\n     */\n    @JvmStatic\n    fun formatStats(files: Collection<GitHubFile>?): SpannedString {\n        return buildSpannedString {\n            val added = files.orEmpty().sumBy { it.additions()!! }\n            val deleted = files.orEmpty().sumBy { it.deletions()!! }\n            val changed = files.orEmpty().count()\n\n            if (changed != 1) {\n                append(\"${FORMAT.format(changed.toLong())} changed files\")\n            } else {\n                append(\"1 changed file\")\n            }\n            append(\" with \")\n\n            if (added != 1) {\n                append(\"${FORMAT.format(added.toLong())} additions\")\n            } else {\n                append(\"1 addition \")\n            }\n            append(\" and \")\n\n            if (deleted != 1) {\n                append(\"${FORMAT.format(deleted.toLong())} deletions\")\n            } else {\n                append(\"1 deletion\")\n            }\n        }\n    }\n\n    /**\n     * Get file name for commit file\n     *\n     * @param file\n     * @return last segment of commit file path\n     */\n    @JvmStatic\n    fun getName(file: GitHubFile?): String? = if (file != null) getName(file.filename()) else null\n\n    /**\n     * Get file name for path\n     *\n     * @param path\n     * @return last segment of path\n     */\n    @JvmStatic\n    fun getName(path: String?): String? {\n        if (TextUtils.isEmpty(path)) {\n            return path\n        }\n\n        val lastSlash = path!!.lastIndexOf('/')\n        return if (lastSlash != -1 && lastSlash + 1 < path.length) {\n            path.substring(lastSlash + 1)\n        } else {\n            path\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/core/commit/FullCommit.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.core.commit;\n\nimport android.text.TextUtils;\n\nimport com.meisolsson.githubsdk.model.Commit;\nimport com.meisolsson.githubsdk.model.GitHubFile;\nimport com.meisolsson.githubsdk.model.git.GitComment;\n\nimport java.io.Serializable;\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.Collections;\nimport java.util.Iterator;\nimport java.util.List;\n\n/**\n * Commit model with comments\n */\npublic class FullCommit extends ArrayList<GitComment> implements\n        Serializable {\n\n    private static final long serialVersionUID = 2470370479577730822L;\n\n    private final Commit commit;\n\n    private final List<FullCommitFile> files;\n\n    /**\n     * Create commit with no comments\n     *\n     * @param commit\n     */\n    public FullCommit(final Commit commit) {\n        this.commit = commit;\n        List<GitHubFile> rawFiles = commit.files();\n        if (rawFiles != null && !rawFiles.isEmpty()) {\n            files = new ArrayList<>(rawFiles.size());\n            for (GitHubFile file : rawFiles) {\n                files.add(new FullCommitFile(file));\n            }\n        } else {\n            files = Collections.emptyList();\n        }\n    }\n\n    /**\n     * Create commit with comments\n     *\n     * @param commit\n     * @param comments\n     */\n    public FullCommit(final Commit commit,\n            final Collection<GitComment> comments) {\n        this.commit = commit;\n\n        List<GitHubFile> rawFiles = commit.files();\n        boolean hasComments = comments != null && !comments.isEmpty();\n        boolean hasFiles = rawFiles != null && !rawFiles.isEmpty();\n        if (hasFiles) {\n            files = new ArrayList<>(rawFiles.size());\n            if (hasComments) {\n                for (GitHubFile file : rawFiles) {\n                    Iterator<GitComment> iterator = comments.iterator();\n                    FullCommitFile full = new FullCommitFile(file);\n                    while (iterator.hasNext()) {\n                        GitComment comment = iterator.next();\n                        if (file.filename().equals(comment.path())) {\n                            full.add(comment);\n                            iterator.remove();\n                        }\n                    }\n                    files.add(full);\n                }\n                hasComments = !comments.isEmpty();\n            } else {\n                for (GitHubFile file : rawFiles) {\n                    files.add(new FullCommitFile(file));\n                }\n            }\n        } else {\n            files = Collections.emptyList();\n        }\n\n        if (hasComments) {\n            addAll(comments);\n        }\n    }\n\n    @Override\n    public boolean add(final GitComment comment) {\n        String path = comment.path();\n        if (TextUtils.isEmpty(path)) {\n            return super.add(comment);\n        } else {\n            boolean added = false;\n            for (FullCommitFile file : files) {\n                if (path.equals(file.getFile().filename())) {\n                    file.add(comment);\n                    added = true;\n                    break;\n                }\n            }\n            if (!added) {\n                added = super.add(comment);\n            }\n            return added;\n        }\n    }\n\n    /**\n     * @return files\n     */\n    public List<FullCommitFile> getFiles() {\n        return files;\n    }\n\n    /**\n     * @return commit\n     */\n    public Commit getCommit() {\n        return commit;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/core/commit/FullCommitFile.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.core.commit;\n\nimport android.util.SparseArray;\n\nimport com.meisolsson.githubsdk.model.GitHubFile;\nimport com.meisolsson.githubsdk.model.git.GitComment;\n\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.List;\n\n/**\n * Commit file with comments\n */\npublic class FullCommitFile {\n\n    private final SparseArray<List<GitComment>> comments = new SparseArray<>(4);\n\n    private final GitHubFile file;\n\n    /**\n     * Create file\n     *\n     * @param file\n     */\n    public FullCommitFile(final GitHubFile file) {\n        this.file = file;\n    }\n\n    /**\n     * Get comments for line\n     *\n     * @param line\n     * @return comments\n     */\n    public List<GitComment> get(final int line) {\n        List<GitComment> lineComments = comments.get(line);\n        return lineComments != null ? lineComments : Collections.emptyList();\n    }\n\n    /**\n     * Add comment to file\n     *\n     * @param comment\n     * @return this file\n     */\n    public FullCommitFile add(final GitComment comment) {\n        int line = (int) comment.position();\n        if (line >= 0) {\n            List<GitComment> lineComments = comments.get(line);\n            if (lineComments == null) {\n                lineComments = new ArrayList<>(4);\n                comments.put(line, lineComments);\n            }\n            lineComments.add(comment);\n        }\n        return this;\n    }\n\n    /**\n     * @return file\n     */\n    public GitHubFile getFile() {\n        return file;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/core/commit/RefreshCommitTask.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.core.commit;\n\nimport android.app.Activity;\nimport android.content.Context;\n\nimport com.github.pockethub.android.util.HttpImageGetter;\nimport com.github.pockethub.android.util.RxPageUtil;\nimport com.google.auto.factory.AutoFactory;\nimport com.google.auto.factory.Provided;\nimport com.meisolsson.githubsdk.core.ServiceGenerator;\nimport com.meisolsson.githubsdk.model.Repository;\nimport com.meisolsson.githubsdk.service.repositories.RepositoryCommentService;\nimport com.meisolsson.githubsdk.service.repositories.RepositoryCommitService;\n\nimport javax.inject.Inject;\n\nimport dagger.Provides;\nimport io.reactivex.Observable;\nimport io.reactivex.Single;\n\n/**\n * Task to load a commit by SHA-1 id\n */\n@AutoFactory\npublic class RefreshCommitTask {\n\n    private final Context context;\n\n    private final CommitStore store;\n\n    private final Repository repository;\n\n    private final String id;\n\n    private final HttpImageGetter imageGetter;\n\n    private final RepositoryCommentService service;\n\n    /**\n     * @param repository\n     * @param id\n     * @param imageGetter\n     */\n    public RefreshCommitTask(@Provided CommitStore store, @Provided HttpImageGetter imageGetter,\n                             @Provided RepositoryCommentService service,\n                             Activity activity, Repository repository, String id) {\n        this.service = service;\n        this.store = store;\n        this.repository = repository;\n        this.id = id;\n        this.imageGetter = imageGetter;\n        this.context = activity;\n    }\n\n    /**\n     * Fetches a commit with it's comments.\n     *\n     * @return Single for a FullCommit\n     */\n    public Single<FullCommit> refresh() {\n        return store.refreshCommit(repository, id)\n                .flatMap(commit -> RxPageUtil.getAllPages((page) ->\n                        service.getCommitComments(repository.owner().login(),\n                                repository.name(), commit.sha(), page), 1)\n                        .flatMap(page -> Observable.fromIterable(page.items()))\n                        .map(comment -> {\n                            imageGetter.encode(comment, comment.bodyHtml());\n                            return comment;\n                        })\n                        .toList()\n                        .map(comments -> new FullCommit(commit, comments)));\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/core/gist/FullGist.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.core.gist\n\nimport com.meisolsson.githubsdk.model.Gist\nimport com.meisolsson.githubsdk.model.GitHubComment\n\n/**\n * Gist model with comments and starred status\n */\ndata class FullGist(val gist: Gist, val starred: Boolean, val comments: List<GitHubComment>)\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/core/gist/GistEventMatcher.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.core.gist;\n\nimport com.meisolsson.githubsdk.model.Gist;\nimport com.meisolsson.githubsdk.model.GitHubEvent;\nimport com.meisolsson.githubsdk.model.GitHubEventType;\nimport com.meisolsson.githubsdk.model.payload.GistPayload;\n\n\n/**\n * Helper to find a {@link Gist} to open for an event\n */\npublic class GistEventMatcher {\n\n    /**\n     * Get gist from event\n     *\n     * @param event\n     * @return gist or null if event doesn't apply\n     */\n    public static Gist getGist(final GitHubEvent event) {\n        if (event == null || event.payload() == null) {\n            return null;\n        }\n\n        GitHubEventType type = event.type();\n        if (GitHubEventType.GistEvent.equals(type)) {\n            return ((GistPayload) event.payload()).gist();\n        } else {\n            return null;\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/core/gist/GistStore.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.core.gist;\n\nimport android.content.Context;\n\nimport com.github.pockethub.android.core.ItemStore;\nimport com.meisolsson.githubsdk.core.ServiceGenerator;\nimport com.meisolsson.githubsdk.model.Gist;\nimport com.meisolsson.githubsdk.model.GistFile;\nimport com.meisolsson.githubsdk.model.request.gist.CreateGist;\nimport com.meisolsson.githubsdk.service.gists.GistService;\n\nimport java.io.IOException;\nimport java.util.Map;\nimport java.util.TreeMap;\n\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\n\nimport io.reactivex.Single;\n\nimport static java.lang.String.CASE_INSENSITIVE_ORDER;\n\n/**\n * Store of Gists\n */\n@Singleton\npublic class GistStore extends ItemStore {\n\n    private final ItemReferences<Gist> gists = new ItemReferences<>();\n\n    @Inject\n    protected GistService gistService;\n\n    /**\n     * Create gist store.\n     */\n    @Inject\n    public GistStore() {\n    }\n\n    /**\n     * Get gist\n     *\n     * @param id\n     * @return gist or null if not in store\n     */\n    public Gist getGist(String id) {\n        return gists.get(id);\n    }\n\n    /**\n     * Sort files in {@link Gist}\n     *\n     * @param gist\n     * @return sorted files\n     */\n    protected Map<String, GistFile> sortFiles(final Gist gist) {\n        Map<String, GistFile> files = gist.files();\n        if (files == null || files.size() < 2) {\n            return files;\n        }\n\n        Map<String, GistFile> sorted = new TreeMap<>(CASE_INSENSITIVE_ORDER);\n        sorted.putAll(files);\n        return sorted;\n    }\n\n    /**\n     * Add gist to store\n     *\n     * @param gist\n     * @return gist\n     */\n    public Gist addGist(Gist gist) {\n        Gist current = getGist(gist.id());\n        if (current != null && current.equals(gist)) {\n            return current;\n        }\n\n        gist = gist.toBuilder()\n                .files(sortFiles(gist))\n                .build();\n        gists.put(gist.id(), gist);\n        return gist;\n    }\n\n    /**\n     * Refresh gist.\n     *\n     * @param id The id of the Gist to update\n     * @return refreshed gist\n     */\n    public Single<Gist> refreshGist(String id) {\n        return gistService.getGist(id)\n                .map(response -> addGist(response.body()));\n    }\n\n    /**\n     * Edit gist.\n     *\n     * @param gist The Gist to edit\n     * @return edited gist\n     */\n    public Single<Gist> editGist(Gist gist) {\n        CreateGist edit = CreateGist.builder()\n                .files(gist.files())\n                .description(gist.description())\n                .isPublic(gist.isPublic())\n                .build();\n\n        return gistService.editGist(edit)\n                .map(response -> addGist(response.body()));\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/core/gist/GistUriMatcher.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.core.gist;\n\nimport android.net.Uri;\nimport android.text.TextUtils;\n\n\nimport com.meisolsson.githubsdk.model.Gist;\n\nimport java.util.List;\nimport java.util.regex.Pattern;\n\n/**\n * Parses a {@link Gist} from a {@link Uri}\n */\npublic class GistUriMatcher {\n\n    private static final Pattern PATTERN = Pattern.compile(\"[a-f0-9]{20}\");\n\n    /**\n     * Parse a {@link Gist} from a non-null {@link Uri}\n     *\n     * @param uri\n     * @return {@link Gist} or null if none found in given {@link Uri}\n     */\n    public static Gist getGist(final Uri uri) {\n        List<String> segments = uri.getPathSegments();\n        if (segments.size() != 1) {\n            return null;\n        }\n\n        String gistId = segments.get(0);\n        if (TextUtils.isEmpty(gistId)) {\n            return null;\n        }\n\n        Gist gist = Gist.builder()\n                .id(gistId)\n                .build();\n\n        if (TextUtils.isDigitsOnly(gistId)) {\n            return gist;\n        }\n\n        if (PATTERN.matcher(gistId).matches()) {\n            return gist;\n        }\n\n        return null;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/core/gist/RefreshGistTask.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.core.gist;\n\nimport android.app.Activity;\nimport android.content.Context;\n\nimport com.github.pockethub.android.util.HttpImageGetter;\nimport com.google.auto.factory.AutoFactory;\nimport com.google.auto.factory.Provided;\nimport com.meisolsson.githubsdk.core.ServiceGenerator;\nimport com.meisolsson.githubsdk.model.Gist;\nimport com.meisolsson.githubsdk.model.GitHubComment;\nimport com.meisolsson.githubsdk.service.gists.GistCommentService;\nimport com.meisolsson.githubsdk.service.gists.GistService;\nimport javax.inject.Inject;\n\nimport java.io.IOException;\nimport java.util.Collections;\nimport java.util.List;\n\nimport io.reactivex.Observable;\nimport io.reactivex.Single;\nimport io.reactivex.SingleEmitter;\nimport io.reactivex.SingleOnSubscribe;\nimport retrofit2.Response;\n\n/**\n * Task to load and store a {@link Gist}.\n */\n@AutoFactory\npublic class RefreshGistTask {\n\n    private final Context context;\n\n    private final GistService service;\n\n    private final GistStore store;\n\n    private final String id;\n\n    private final HttpImageGetter imageGetter;\n\n    /**\n     * Create task to refresh the given {@link Gist}.\n     *\n     * @param gistId\n     * @param imageGetter\n     */\n    public RefreshGistTask(@Provided GistStore store, @Provided HttpImageGetter imageGetter,\n                           Activity activity, String gistId) {\n        this.store = store;\n        this.id = gistId;\n        this.imageGetter = imageGetter;\n        this.context = activity;\n        this.service = ServiceGenerator.createService(context, GistService.class);\n    }\n\n    public Single<FullGist> refresh() {\n        Single<Gist> gistSingle = store.refreshGist(id);\n        Single<List<GitHubComment>> commentSingle = getGistComments();\n        Single<Boolean> starredSingle = service.checkIfGistIsStarred(id)\n                .map(response -> response.code() == 204);\n\n        return Single.zip(gistSingle, starredSingle, commentSingle, FullGist::new);\n    }\n\n    Single<List<GitHubComment>> getGistComments() {\n        return ServiceGenerator.createService(context, GistCommentService.class)\n                .getGistComments(id, 0)\n                .flatMapObservable(response -> Observable.fromIterable(response.body().items()))\n                .map(comment -> {\n                    imageGetter.encode(comment, comment.bodyHtml());\n                    return comment;\n                })\n                .toList();\n\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/core/issue/FullIssue.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.core.issue\n\nimport com.meisolsson.githubsdk.model.GitHubComment\nimport com.meisolsson.githubsdk.model.Issue\nimport com.meisolsson.githubsdk.model.IssueEvent\n\n/**\n * Issue model with comments\n */\ndata class FullIssue(val issue: Issue, val comments: Collection<GitHubComment>, val events: Collection<IssueEvent>)\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/core/issue/IssueEventMatcher.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.core.issue;\n\nimport com.meisolsson.githubsdk.model.GitHubEvent;\nimport com.meisolsson.githubsdk.model.Issue;\nimport com.meisolsson.githubsdk.model.payload.IssueCommentPayload;\nimport com.meisolsson.githubsdk.model.payload.IssuesPayload;\nimport com.meisolsson.githubsdk.model.payload.PullRequestPayload;\n\nimport static com.github.pockethub.android.core.issue.IssueUtils.toIssue;\n\n/**\n * Helper to find an issue to open for an event\n */\npublic class IssueEventMatcher {\n\n    /**\n     * Get issue from event\n     *\n     * @param event\n     * @return issue or null if event doesn't apply\n     */\n    public static Issue getIssue(GitHubEvent event) {\n        if (event == null || event.payload() == null) {\n            return null;\n        }\n\n        switch (event.type()) {\n            case IssuesEvent:\n                return ((IssuesPayload) event.payload()).issue();\n            case IssueCommentEvent:\n                return ((IssueCommentPayload) event.payload()).issue();\n            case PullRequestEvent:\n                return toIssue(((PullRequestPayload) event.payload()).pullRequest());\n            default:\n                return null;\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/core/issue/IssueFilter.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.core.issue;\n\nimport android.os.Parcel;\nimport android.os.Parcelable;\nimport com.meisolsson.githubsdk.model.Label;\nimport com.meisolsson.githubsdk.model.Milestone;\nimport com.meisolsson.githubsdk.model.Repository;\nimport com.meisolsson.githubsdk.model.User;\n\nimport java.util.*;\n\nimport static java.lang.String.CASE_INSENSITIVE_ORDER;\n\n/**\n * Issue filter containing at least one valid query\n */\npublic class IssueFilter implements Parcelable, Cloneable, Comparator<Label> {\n\n    /**\n     * Filter field key\n     */\n    public static final String FIELD_FILTER = \"filter\"; \n\n    /**\n     * Filter by issue assignee\n     */\n    public static final String FILTER_ASSIGNEE = \"assignee\"; \n\n    /**\n     * Filter by issue's milestone\n     */\n    public static final String FILTER_MILESTONE = \"milestone\"; \n\n    /**\n     * Filter by user mentioned in issue\n     */\n    public static final String FILTER_MENTIONED = \"mentioned\"; \n\n    /**\n     * Filter by subscribed issues for user\n     */\n    public static final String FILTER_SUBSCRIBED = \"subscribed\"; \n\n    /**\n     * Filter by created issues by user\n     */\n    public static final String FILTER_CREATED = \"created\"; \n\n    /**\n     * Filter by assigned issues for user\n     */\n    public static final String FILTER_ASSIGNED = \"assigned\"; \n\n    /**\n     * Filter by issue's labels\n     */\n    public static final String FILTER_LABELS = \"labels\"; \n\n    /**\n     * Filter by issue's state\n     */\n    public static final String FILTER_STATE = \"state\"; \n\n    /**\n     * Issue open state filter value\n     */\n    public static final String STATE_OPEN = \"open\"; \n\n    /**\n     * Issue closed state filter value\n     */\n    public static final String STATE_CLOSED = \"closed\"; \n\n    /**\n     * Issue body field name\n     */\n    public static final String FIELD_BODY = \"body\"; \n\n    /**\n     * Issue title field name\n     */\n    public static final String FIELD_TITLE = \"title\"; \n\n    /**\n     * Since date field\n     */\n    public static final String FIELD_SINCE = \"since\"; \n\n    /**\n     * Sort direction of output\n     */\n    public static final String FIELD_DIRECTION = \"direction\"; \n\n    /**\n     * Ascending direction sort order\n     */\n    public static final String DIRECTION_ASCENDING = \"asc\"; \n\n    /**\n     * Descending direction sort order\n     */\n    public static final String DIRECTION_DESCENDING = \"desc\"; \n\n    /**\n     * Sort field key\n     */\n    public static final String FIELD_SORT = \"sort\"; \n\n    /**\n     * Sort by created at\n     */\n    public static final String SORT_CREATED = \"created\"; \n\n    /**\n     * Sort by updated at\n     */\n    public static final String SORT_UPDATED = \"updated\"; \n\n    /**\n     * Sort by commented on at\n     */\n    public static final String SORT_COMMENTS = \"comments\";\n\n    private final Repository repository;\n\n    private final String id;\n\n    private List<Label> labels = new ArrayList<>();\n\n    private Milestone milestone;\n\n    private User assignee;\n\n    private boolean open;\n\n    private String direction;\n\n    private String sortType;\n\n    /**\n     * Create filter\n     *\n     * @param repository\n     */\n    public IssueFilter(final Repository repository, String id) {\n        this.id = id;\n        this.repository = repository;\n        open = true;\n        direction = DIRECTION_DESCENDING;\n        sortType = SORT_CREATED;\n    }\n\n    protected IssueFilter(Parcel in) {\n        id = in.readString();\n        repository = in.readParcelable(Repository.class.getClassLoader());\n        labels = new ArrayList<>();\n        in.readList(labels, Label.class.getClassLoader());\n        milestone = in.readParcelable(Milestone.class.getClassLoader());\n        assignee = in.readParcelable(User.class.getClassLoader());\n        open = in.readByte() != 0;\n        direction = in.readString();\n        sortType = in.readString();\n    }\n\n    public static final Creator<IssueFilter> CREATOR = new Creator<IssueFilter>() {\n        @Override\n        public IssueFilter createFromParcel(Parcel in) {\n            return new IssueFilter(in);\n        }\n\n        @Override\n        public IssueFilter[] newArray(int size) {\n            return new IssueFilter[size];\n        }\n    };\n\n    /**\n     * Set only open issues to be returned\n     *\n     * @param open\n     *            true for open issues, false for closed issues\n     * @return this filter\n     */\n    public IssueFilter setOpen(final boolean open) {\n        this.open = open;\n        return this;\n    }\n\n    /**\n     * Add label to filter\n     *\n     * @param label\n     * @return this filter\n     */\n    public IssueFilter addLabel(Label label) {\n        if (label == null) {\n            return this;\n        }\n        if (labels == null) {\n            labels = new ArrayList<>();\n        }\n        labels.add(label);\n        return this;\n    }\n\n    /**\n     * @param labels\n     * @return this filter\n     */\n    public IssueFilter setLabels(Collection<Label> labels) {\n        if (labels != null && !labels.isEmpty()) {\n            if (this.labels == null) {\n                this.labels = new ArrayList<>();\n            } else {\n                this.labels.clear();\n            }\n            this.labels.addAll(labels);\n        } else {\n            this.labels = null;\n        }\n        return this;\n    }\n\n    /**\n     * @return labels\n     */\n    public List<Label> getLabels() {\n        return labels;\n    }\n\n    /**\n     * @return repository\n     */\n    public Repository getRepository() {\n        return repository;\n    }\n\n    /**\n     * @param milestone\n     * @return this filter\n     */\n    public IssueFilter setMilestone(Milestone milestone) {\n        this.milestone = milestone;\n        return this;\n    }\n\n    /**\n     * @return milestone\n     */\n    public Milestone getMilestone() {\n        return milestone;\n    }\n\n    /**\n     * @param assignee\n     * @return this filter\n     */\n    public IssueFilter setAssignee(User assignee) {\n        this.assignee = assignee;\n        return this;\n    }\n\n    /**\n     * @param direction Can be either {@value DIRECTION_ASCENDING} or {@value DIRECTION_ASCENDING}.\n     * @return this filter\n     */\n    public IssueFilter setDirection(String direction) {\n        this.direction = direction;\n        return this;\n    }\n\n    /**\n     * @param sortType Can be either {@value SORT_COMMENTS}, {@value SORT_CREATED}\n     *                 or {@value SORT_UPDATED}.\n     * @return this filter\n     */\n    public IssueFilter setSortType(String sortType) {\n        this.sortType = sortType;\n        return this;\n    }\n\n    public String getSortType() {\n        return sortType;\n    }\n\n    public String getDirection() {\n        return direction;\n    }\n\n    /**\n     * Are only open issues returned?\n     *\n     * @return true if open only, false if closed only\n     */\n    public boolean isOpen() {\n        return open;\n    }\n\n    /**\n     * @return assignee\n     */\n    public User getAssignee() {\n        return assignee;\n    }\n\n    /**\n     * Create a map of all the request parameters represented by this filter\n     *\n     * @return non-null map of filter request parameters\n     */\n    public Map<String, Object> toFilterMap() {\n        final Map<String, Object> filter = new HashMap<>();\n\n        filter.put(FIELD_SORT, sortType);\n        filter.put(FIELD_DIRECTION, direction);\n\n        if (assignee != null) {\n            filter.put(FILTER_ASSIGNEE, assignee.login());\n        }\n\n        if (milestone != null) {\n            filter.put(FILTER_MILESTONE,\n                    Integer.toString(milestone.number()));\n        }\n\n        if (labels != null && !labels.isEmpty()) {\n            StringBuilder labelsQuery = new StringBuilder();\n            for (Label label : labels) {\n                labelsQuery.append(label.name()).append(',');\n            }\n            filter.put(FILTER_LABELS, labelsQuery.toString());\n        }\n\n        if (open) {\n            filter.put(FILTER_STATE, STATE_OPEN);\n        } else {\n            filter.put(FILTER_STATE, STATE_CLOSED);\n        }\n        return filter;\n    }\n\n    /**\n     * Get display {@link CharSequence} representing this filter\n     *\n     * @return display\n     */\n    public CharSequence toDisplay() {\n        List<String> segments = new ArrayList<>();\n        if (open) {\n            segments.add(\"Open issues\");\n        } else {\n            segments.add(\"Closed issues\");\n        }\n\n        if (assignee != null) {\n            segments.add(\"Assignee: \" + assignee.login());\n        }\n\n        if (milestone != null) {\n            segments.add(\"Milestone: \" + milestone.title());\n        }\n\n        if (labels != null && !labels.isEmpty()) {\n            StringBuilder builder = new StringBuilder(\"Labels: \");\n            for (Label label : labels) {\n                builder.append(label.name()).append(',').append(' ');\n            }\n            builder.deleteCharAt(builder.length() - 1);\n            builder.deleteCharAt(builder.length() - 1);\n            segments.add(builder.toString());\n        }\n\n        if (segments.isEmpty()) {\n            return \"\";\n        }\n\n        StringBuilder all = new StringBuilder();\n        for (String segment : segments) {\n            all.append(segment).append(',').append(' ');\n        }\n        all.deleteCharAt(all.length() - 1);\n        all.deleteCharAt(all.length() - 1);\n        return all;\n    }\n\n    @Override\n    public int hashCode() {\n        return Arrays.hashCode(new Object[] { open,\n                assignee != null ? assignee.id() : null,\n                milestone != null ? milestone.number() : null,\n                assignee != null ? assignee.id() : null,\n                repository != null ? repository.id() : null,\n                labels, direction, sortType });\n    }\n\n    private boolean isEqual(Object a, Object b) {\n        if (a == null && b == null) {\n            return true;\n        }\n        return a != null && a.equals(b);\n    }\n\n    private boolean isEqual(Milestone a, Milestone b) {\n        if (a == null && b == null) {\n            return true;\n        }\n        return a != null && b != null && a.number() == b.number();\n    }\n\n    private boolean isEqual(User a, User b) {\n        if (a == null && b == null) {\n            return true;\n        }\n        return a != null && b != null && a.id() == b.id();\n    }\n\n    private boolean isEqual(Repository a, Repository b) {\n        return a != null && b != null && a.id() == b.id();\n    }\n\n    @Override\n    public boolean equals(Object o) {\n        if (o == this) {\n            return true;\n        }\n        if (!(o instanceof IssueFilter)) {\n            return false;\n        }\n\n        IssueFilter other = (IssueFilter) o;\n        return open == other.open && isEqual(milestone, other.milestone)\n                && isEqual(assignee, other.assignee)\n                && isEqual(repository, repository)\n                && isEqual(labels, other.labels)\n                && isEqual(sortType, other.sortType)\n                && isEqual(direction, other.direction);\n    }\n\n    @Override\n    public IssueFilter clone() {\n        try {\n            return (IssueFilter) super.clone();\n        } catch (CloneNotSupportedException e) {\n            // This should never happen since this class implements Cloneable\n            throw new IllegalArgumentException(e);\n        }\n    }\n\n    @Override\n    public int compare(Label lhs, Label rhs) {\n        return CASE_INSENSITIVE_ORDER.compare(lhs.name(), rhs.name());\n    }\n\n    @Override\n    public int describeContents() {\n        return 0;\n    }\n\n    @Override\n    public void writeToParcel(Parcel dest, int flags) {\n        dest.writeString(id);\n        dest.writeParcelable(repository, flags);\n        dest.writeList(labels);\n        dest.writeParcelable(milestone, flags);\n        dest.writeParcelable(assignee, flags);\n        dest.writeByte((byte) (open ? 1 : 0));\n        dest.writeString(direction);\n        dest.writeString(sortType);\n    }\n\n    public String getId() {\n        return id;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/core/issue/IssueStore.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.core.issue;\n\nimport android.content.Context;\nimport androidx.annotation.StringRes;\nimport android.widget.Toast;\n\nimport com.github.pockethub.android.R;\nimport com.github.pockethub.android.core.ItemStore;\nimport com.github.pockethub.android.util.InfoUtils;\nimport com.meisolsson.githubsdk.model.Issue;\nimport com.meisolsson.githubsdk.model.IssueState;\nimport com.meisolsson.githubsdk.model.Repository;\nimport com.meisolsson.githubsdk.model.request.issue.IssueRequest;\nimport com.meisolsson.githubsdk.service.issues.IssueService;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\n\nimport io.reactivex.Single;\nimport retrofit2.Response;\n\n/**\n * Store of loaded issues\n */\n@Singleton\npublic class IssueStore extends ItemStore {\n\n    private final Map<String, ItemReferences<Issue>> repos = new HashMap<>();\n\n    @Inject\n    protected Context context;\n\n    @Inject\n    protected IssueService service;\n\n    /**\n     * Create issue store.\n     */\n    @Inject\n    public IssueStore() {\n    }\n\n    /**\n     * Get issue\n     *\n     * @param repository\n     * @param number\n     * @return issue or null if not in store\n     */\n    public Issue getIssue(Repository repository, int number) {\n        ItemReferences<Issue> repoIssues = repos.get(InfoUtils.createRepoId(repository));\n        return repoIssues != null ? repoIssues.get(number) : null;\n    }\n\n    /**\n     * Add issue to store\n     *\n     * @param issue\n     * @return issue\n     */\n    public Issue addIssue(Issue issue) {\n        Repository repo = null;\n        if (issue != null) {\n            repo = issue.repository();\n            if (repo == null) {\n                repo = repoFromUrl(issue.htmlUrl());\n            }\n        }\n        return addIssue(repo, issue);\n    }\n\n    private Repository repoFromUrl(String url) {\n        if (url == null || url.length() == 0) {\n            return null;\n        }\n        String owner = null;\n        String name = null;\n        for (String segment : url.split(\"/\")) //$NON-NLS-1$\n        {\n            if (segment.length() > 0) {\n                if (owner == null) {\n                    owner = segment;\n                } else if (name == null) {\n                    name = segment;\n                } else {\n                    break;\n                }\n            }\n        }\n\n        if (owner != null && owner.length() > 0 && name != null && name.length() > 0) {\n            return InfoUtils.createRepoFromData(owner, name);\n        } else {\n            return null;\n        }\n    }\n\n    /**\n     * Add issue to store\n     *\n     * @param repository\n     * @param issue\n     * @return issue\n     */\n    public Issue addIssue(Repository repository, Issue issue) {\n        Issue current = getIssue(repository, issue.number());\n        if (current != null && current.equals(issue)) {\n            return current;\n        }\n\n        String repoId = InfoUtils.createRepoId(repository);\n        ItemReferences<Issue> repoIssues = repos.get(repoId);\n        if (repoIssues == null) {\n            repoIssues = new ItemReferences<>();\n            repos.put(repoId, repoIssues);\n        }\n\n        repoIssues.put(issue.number(), issue);\n        return issue;\n    }\n\n    /**\n     * Refresh issue.\n     *\n     * @param repository The issues repository\n     * @param issueNumber The issue number\n     * @return A {@link Single} representing the  issues\n     */\n    public Single<Issue> refreshIssue(Repository repository, int issueNumber) {\n        return service.getIssue(repository.owner().login(), repository.name(), issueNumber)\n                .map(response -> addIssueOrThrow(repository, response, R.string.error_issue_load));\n    }\n\n    /**\n     * Edit issue.\n     *\n     * @param repository The issues repository\n     * @param issueNumber The issues number to change\n     * @return A {@link Single} representing the changed issues\n     */\n    public Single<Issue> editIssue(Repository repository, int issueNumber, IssueRequest request) {\n        return service\n                .editIssue(repository.owner().login(), repository.name(), issueNumber, request)\n                .map(response -> addIssueOrThrow(repository, response, R.string.error_edit_issue));\n    }\n\n    /**\n     * Change the issue state.\n     *\n     * @param repository The issues repository\n     * @param issueNumber The issue number to change\n     * @param state What state to change to\n     * @return A {@link Single} representing the changed issue\n     */\n    public Single<Issue> changeState(Repository repository, int issueNumber, IssueState state) {\n        IssueRequest editIssue = IssueRequest.builder()\n                .state(state)\n                .build();\n\n        return service\n                .editIssue(repository.owner().login(), repository.name(), issueNumber, editIssue)\n                .map(response -> addIssueOrThrow(repository, response, R.string.error_issue_state));\n    }\n\n    /**\n     * Adds the issue from the response or throws an error if the request was unsuccessful.\n     *\n     * @param repository The issues repository\n     * @param response The issue response to add\n     * @param error String to print if unsuccessful\n     * @return The added issue\n     */\n    private Issue addIssueOrThrow(Repository repository, Response<Issue> response,\n                                  @StringRes int error) {\n        if (response.isSuccessful()) {\n            return addIssue(repository, response.body());\n        } else {\n            Toast.makeText(context, error, Toast.LENGTH_SHORT).show();\n            return Issue.builder().build();\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/core/issue/IssueUriMatcher.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.core.issue;\n\nimport android.net.Uri;\nimport android.text.TextUtils;\n\nimport com.github.pockethub.android.core.repo.RepositoryUtils;\nimport com.github.pockethub.android.util.InfoUtils;\nimport com.meisolsson.githubsdk.model.Issue;\nimport com.meisolsson.githubsdk.model.Repository;\n\nimport java.util.List;\n\n/**\n * Parses a {@link Issue} from a {@link Uri}\n */\npublic class IssueUriMatcher {\n\n    /**\n     * Parse a {@link Issue} from a non-null {@link Uri}\n     *\n     * @param uri\n     * @return {@link Issue} or null if none found in given\n     *         {@link Uri}\n     */\n    public static Issue getIssue(Uri uri) {\n        List<String> segments = uri.getPathSegments();\n        if (segments.size() < 4) {\n            return null;\n        }\n        if (!\"issues\".equals(segments.get(2)) && !\"pull\".equals(segments.get(2))) {\n            return null;\n        }\n\n        String repoOwner = segments.get(0);\n        if (!RepositoryUtils.isValidOwner(repoOwner)) {\n            return null;\n        }\n\n        String repoName = segments.get(1);\n        if (!RepositoryUtils.isValidRepo(repoName)) {\n            return null;\n        }\n\n        String number = segments.get(3);\n        if (TextUtils.isEmpty(number)) {\n            return null;\n        }\n\n        int issueNumber;\n        try {\n            issueNumber = Integer.parseInt(number);\n        } catch (NumberFormatException nfe) {\n            return null;\n        }\n        if (issueNumber < 1) {\n            return null;\n        }\n\n        Repository repo = InfoUtils.createRepoFromData(repoOwner, repoName);\n        return Issue.builder()\n                .repository(repo)\n                .number(issueNumber)\n                .build();\n    }\n\n    public static Issue getApiIssue(String url) {\n        url = url.replace(\"https://api.github.com/repos\", \"https://github.com/\");\n        url = url.replaceFirst(\"/pulls/(\\\\d+)$\", \"/pull/$1\");\n\n        Uri uri = Uri.parse(url);\n        return getIssue(uri);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/core/issue/IssueUtils.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.core.issue;\n\nimport android.text.TextUtils;\n\nimport com.meisolsson.githubsdk.model.Issue;\nimport com.meisolsson.githubsdk.model.PullRequest;\n\n/**\n * Utilities for working with {@link Issue} models\n */\npublic class IssueUtils {\n\n    /**\n     * Is the given issue a pull request?\n     *\n     * @param issue\n     * @return true if pull request, false otherwise\n     */\n    public static boolean isPullRequest(final Issue issue) {\n        return issue != null && issue.pullRequest() != null\n                && !TextUtils.isEmpty(issue.pullRequest().htmlUrl());\n    }\n\n    /**\n     * Convert {@link PullRequest} model {@link Issue} model\n     *\n     * @param pullRequest\n     * @return issue\n     */\n    public static Issue toIssue(final PullRequest pullRequest) {\n        if (pullRequest == null) {\n            return null;\n        }\n\n        return Issue.builder()\n                .assignee(pullRequest.assignee())\n                .body(pullRequest.body())\n                .bodyHtml(pullRequest.bodyHtml())\n                .closedAt(pullRequest.closedAt())\n                .comments(pullRequest.comments())\n                .createdAt(pullRequest.createdAt())\n                .htmlUrl(pullRequest.htmlUrl())\n                .number(pullRequest.number())\n                .milestone(pullRequest.milestone())\n                .id(pullRequest.id())\n                .pullRequest(pullRequest)\n                .state(pullRequest.state())\n                .title(pullRequest.title())\n                .updatedAt(pullRequest.updatedAt())\n                .url(pullRequest.url())\n                .user(pullRequest.user())\n                .build();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/core/issue/RefreshIssueTask.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.core.issue;\n\nimport android.content.Context;\n\nimport com.github.pockethub.android.util.HttpImageGetter;\nimport com.github.pockethub.android.util.RxPageUtil;\nimport com.google.auto.factory.AutoFactory;\nimport com.google.auto.factory.Provided;\nimport com.meisolsson.githubsdk.core.ServiceGenerator;\nimport com.meisolsson.githubsdk.model.GitHubComment;\nimport com.meisolsson.githubsdk.model.Issue;\nimport com.meisolsson.githubsdk.model.IssueEvent;\nimport com.meisolsson.githubsdk.model.Page;\nimport com.meisolsson.githubsdk.model.PullRequest;\nimport com.meisolsson.githubsdk.model.Repository;\nimport com.meisolsson.githubsdk.service.issues.IssueCommentService;\nimport com.meisolsson.githubsdk.service.issues.IssueEventService;\nimport javax.inject.Inject;\nimport com.meisolsson.githubsdk.service.pull_request.PullRequestService;\n\nimport java.util.Collections;\nimport java.util.List;\n\nimport io.reactivex.Observable;\nimport io.reactivex.Single;\nimport retrofit2.Response;\n\n/**\n * Task to load and store an {@link Issue}\n */\n@AutoFactory\npublic class RefreshIssueTask {\n\n    private static final String TAG = \"RefreshIssueTask\";\n\n    private final Context context;\n\n    private final IssueStore store;\n\n    private final Repository repo;\n\n    private final int issueNumber;\n\n    private final HttpImageGetter bodyImageGetter;\n\n    private final HttpImageGetter commentImageGetter;\n\n\n    /**\n     * Create task to refresh given issue.\n     *\n     * @param repo The repository to refresh issue from\n     * @param issueNumber The issue's number\n     * @param bodyImageGetter {@link HttpImageGetter} to fetch images for the bodies\n     */\n    public RefreshIssueTask(@Provided Context context,\n                            Repository repo, int issueNumber,\n                            @Provided HttpImageGetter bodyImageGetter,\n                            @Provided HttpImageGetter commentImageGetter,\n                            @Provided IssueStore store) {\n        this.repo = repo;\n        this.issueNumber = issueNumber;\n        this.bodyImageGetter = bodyImageGetter;\n        this.context = context;\n        this.commentImageGetter = commentImageGetter;\n        this.store = store;\n    }\n\n    /**\n     * Fetches an issue and it's comments, event and pull request if applicable.\n     *\n     * @return {@link Single} for a {@link FullIssue}\n     */\n    public Single<FullIssue> refresh() {\n        return store.refreshIssue(repo, issueNumber)\n                .flatMap(issue -> {\n                    if (issue.pullRequest() != null) {\n                        return getPullRequest(repo.owner().login(), repo.name(), issueNumber)\n                                .map(pullRequest -> issue.toBuilder()\n                                        .pullRequest(pullRequest)\n                                        .build());\n                    }\n\n                    return Single.just(issue);\n                })\n                .flatMap(issue -> getAllComments(repo.owner().login(), repo.name(), issue)\n                        .zipWith(Single.just(issue),\n                                (comments, issue1) -> new FullIssue(issue1, comments, Collections.emptyList())))\n                .zipWith(getAllEvents(repo.owner().login(), repo.name(), issueNumber),\n                        (fullIssue, issueEvents) -> new FullIssue(fullIssue.getIssue(),\n                                fullIssue.getComments(), issueEvents))\n                .map(fullIssue -> {\n                    Issue issue = fullIssue.getIssue();\n                    bodyImageGetter.encode(issue.id(), issue.bodyHtml());\n                    for (GitHubComment comment : fullIssue.getComments()) {\n                        commentImageGetter.encode(comment.id(), comment.bodyHtml());\n                    }\n                    return fullIssue;\n                });\n    }\n\n    /**\n     * Fetches all comments for a given issue.\n     *\n     * @param login\n     * @param name\n     * @param issue\n     * @return {@link Single}\n     */\n    private Single<List<GitHubComment>> getAllComments(String login, String name, Issue issue) {\n        if (issue.comments() <= 0) {\n            return Single.just(Collections.emptyList());\n        }\n\n        IssueCommentService service = ServiceGenerator.createService(context,\n                IssueCommentService.class);\n        return RxPageUtil.getAllPages(page ->\n                service.getIssueComments(login, name, issue.number(), page), 1)\n                .flatMap(page -> Observable.fromIterable(page.items()))\n                .toList();\n    }\n\n    private Single<List<IssueEvent>> getAllEvents(String login, String name, int issueNumber) {\n        IssueEventService service = ServiceGenerator\n                .createService(context, IssueEventService.class);\n\n        return RxPageUtil.getAllPages(page ->\n                service.getIssueEvents(login, name, issueNumber, page), 1)\n                .flatMap(page -> Observable.fromIterable(page.items()))\n                .toList();\n    }\n\n    private Single<PullRequest> getPullRequest(String login, String name,\n                                                         int issueNumber) {\n        return ServiceGenerator.createService(context, PullRequestService.class)\n                .getPullRequest(login, name, issueNumber)\n                .map(Response::body);\n    }\n\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/core/ref/RefUtils.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.core.ref;\n\nimport android.text.TextUtils;\n\nimport com.meisolsson.githubsdk.model.git.GitReference;\n\n\n/**\n * Utilities for working with {@link GitReference}s\n */\npublic class RefUtils {\n\n    private static final String PREFIX_REFS = \"refs/\";\n\n    private static final String PREFIX_PULL = PREFIX_REFS + \"pull/\";\n\n    private static final String PREFIX_TAG = PREFIX_REFS + \"tags/\";\n\n    private static final String PREFIX_HEADS = PREFIX_REFS + \"heads/\";\n\n    /**\n     * Is reference a branch?\n     *\n     * @param ref\n     * @return true if branch, false otherwise\n     */\n    public static boolean isBranch(final GitReference ref) {\n        if (ref != null) {\n            String name = ref.ref();\n            return !TextUtils.isEmpty(name) && name.startsWith(PREFIX_HEADS);\n        } else {\n            return false;\n        }\n    }\n\n    /**\n     * Is reference a tag?\n     *\n     * @param ref\n     * @return true if tag, false otherwise\n     */\n    public static boolean isTag(final GitReference ref) {\n        return ref != null && isTag(ref.ref());\n    }\n\n    /**\n     * Is reference a tag?\n     *\n     * @param name\n     * @return true if tag, false otherwise\n     */\n    public static boolean isTag(final String name) {\n        return !TextUtils.isEmpty(name) && name.startsWith(PREFIX_TAG);\n    }\n\n    /**\n     * Get path of ref with leading 'refs/' segment removed if present\n     *\n     * @param ref\n     * @return full path\n     */\n    public static String getPath(final GitReference ref) {\n        if (ref == null) {\n            return null;\n        }\n        String name = ref.ref();\n        if (!TextUtils.isEmpty(name) && name.startsWith(PREFIX_REFS)) {\n            return name.substring(PREFIX_REFS.length());\n        } else {\n            return name;\n        }\n    }\n\n    /**\n     * Get short name for ref\n     *\n     * @param ref\n     * @return short name\n     */\n    public static String getName(final GitReference ref) {\n        if (ref != null) {\n            return getName(ref.ref());\n        } else {\n            return null;\n        }\n    }\n\n    /**\n     * Get short name for ref\n     *\n     * @param name\n     * @return short name\n     */\n    public static String getName(final String name) {\n        if (TextUtils.isEmpty(name)) {\n            return name;\n        }\n        if (name.startsWith(PREFIX_HEADS)) {\n            return name.substring(PREFIX_HEADS.length());\n        } else if (name.startsWith(PREFIX_TAG)) {\n            return name.substring(PREFIX_TAG.length());\n        } else if (name.startsWith(PREFIX_REFS)) {\n            return name.substring(PREFIX_REFS.length());\n        } else {\n            return name;\n        }\n    }\n\n    /**\n     * Should the given reference be included as valid?\n     * <p>\n     * This filters out pull request refs\n     *\n     * @param ref\n     * @return true if valid, false otherwise\n     */\n    public static boolean isValid(final GitReference ref) {\n        if (ref == null) {\n            return false;\n        }\n\n        String name = ref.ref();\n        return !TextUtils.isEmpty(name) && !name.startsWith(PREFIX_PULL);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/core/repo/RepositoryEventMatcher.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.core.repo;\n\nimport android.text.TextUtils;\n\nimport com.github.pockethub.android.util.ConvertUtils;\nimport com.meisolsson.githubsdk.model.GitHubEvent;\nimport com.meisolsson.githubsdk.model.GitHubEventType;\nimport com.meisolsson.githubsdk.model.Repository;\nimport com.meisolsson.githubsdk.model.payload.ForkPayload;\n\nimport static com.meisolsson.githubsdk.model.GitHubEventType.CreateEvent;\nimport static com.meisolsson.githubsdk.model.GitHubEventType.ForkEvent;\nimport static com.meisolsson.githubsdk.model.GitHubEventType.PublicEvent;\nimport static com.meisolsson.githubsdk.model.GitHubEventType.WatchEvent;\n\n/**\n * Helper to find a {@link RepositoryEventMatcher} to open for an event\n */\npublic class RepositoryEventMatcher {\n\n    /**\n     * Get {@link Repository} from event\n     *\n     * @param event\n     * @return gist or null if event doesn't apply\n     */\n    public static Repository getRepository(final GitHubEvent event) {\n        if (event == null || event.payload() == null) {\n            return null;\n        }\n\n        GitHubEventType type = event.type();\n        if (ForkEvent.equals(type)) {\n            Repository repository = ((ForkPayload)event.payload()).forkee();\n            // Verify repository has valid name and owner\n            if (repository != null && !TextUtils.isEmpty(repository.name())\n                    && repository.owner() != null\n                    && !TextUtils.isEmpty(repository.owner().login())) {\n                return repository;\n            }\n        }\n\n        if (CreateEvent.equals(type) || WatchEvent.equals(type)\n                || PublicEvent.equals(type)) {\n            return ConvertUtils.eventRepoToRepo(event.repo());\n        }\n\n        return null;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/core/repo/RepositoryUriMatcher.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.core.repo;\n\nimport android.net.Uri;\n\nimport com.github.pockethub.android.util.InfoUtils;\nimport com.meisolsson.githubsdk.model.Repository;\n\nimport java.util.List;\n\n/**\n * Parses a {@link Repository} from a {@link Uri}\n */\npublic class RepositoryUriMatcher {\n\n    /**\n     * Attempt to parse a {@link Repository} from the given {@link Uri}\n     *\n     * @param uri\n     * @return {@link Repository} or null if unparseable\n     */\n    public static Repository getRepository(Uri uri) {\n        List<String> segments = uri.getPathSegments();\n        if (segments.size() < 2) {\n            return null;\n        }\n\n        String repoOwner = segments.get(0);\n        if (!RepositoryUtils.isValidOwner(repoOwner)) {\n            return null;\n        }\n\n        String repoName = segments.get(1);\n        if (!RepositoryUtils.isValidRepo(repoName)) {\n            return null;\n        }\n\n        return InfoUtils.createRepoFromData(repoOwner, repoName);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/core/repo/RepositoryUtils.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.core.repo\n\nimport com.meisolsson.githubsdk.model.Repository\n\n/**\n * Utilities for working with [Repository] objects\n */\nobject RepositoryUtils {\n\n    /**\n     * Does the repository have details denoting it was loaded from an API call?\n     *\n     *\n     * This uses a simple heuristic of either being private, being a fork, or\n     * having a non-zero amount of forks or watchers, or has issues enable;\n     * meaning it came back from an API call providing those details and more.\n     *\n     * @return true if complete, false otherwise\n     */\n    @JvmStatic\n    fun isComplete(repository: Repository) =\n        repository.isPrivate == true || repository.isFork == true || repository.hasIssues() == true\n            || repository.forksCount() != null && repository.forksCount()!! > 0\n            || repository.watchersCount() != null && repository.watchersCount()!! > 0\n\n    /**\n     * Is the given owner name valid?\n     *\n     * @param name\n     * @return true if valid, false otherwise\n     */\n    @JvmStatic\n    fun isValidOwner(name: String?) = name !in listOf(\n            \"about\", \"account\", \"admin\", \"api\", \"blog\", \"camo\", \"contact\", \"dashboard\", \"downloads\",\n            \"edu\", \"explore\", \"features\", \"home\", \"inbox\", \"languages\", \"login\", \"logout\", \"new\",\n            \"notifications\", \"organizations\", \"orgs\", \"repositories\", \"search\", \"security\",\n            \"settings\", \"stars\", \"styleguide\", \"timeline\", \"training\", \"users\", \"watching\")\n\n    /**\n     * Is the given repo name valid?\n     *\n     * @param name\n     * @return true if valid, false otherwise\n     */\n    @JvmStatic\n    fun isValidRepo(name: String?) = name !in listOf(\"followers\", \"following\")\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/core/user/UserComparator.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.core.user;\n\nimport android.accounts.Account;\n\nimport com.meisolsson.githubsdk.model.User;\nimport javax.inject.Inject;\n\nimport java.util.Comparator;\n\nimport static java.lang.String.CASE_INSENSITIVE_ORDER;\n\n/**\n * Sorts users and orgs in alphabetical order with special handling to put\n * currently authenticated user first.\n */\npublic class UserComparator implements Comparator<User> {\n\n    private final String login;\n\n    /**\n     * Create comparator for given account\n     *\n     * @param account\n     */\n    @Inject\n    public UserComparator(final Account account) {\n        login = account.name;\n    }\n\n    @Override\n    public int compare(final User lhs, final User rhs) {\n        final String lhsLogin = lhs.login();\n        final String rhsLogin = rhs.login();\n\n        if (lhsLogin.equals(login)) {\n            return rhsLogin.equals(login) ? 0 : -1;\n        }\n\n        if (rhsLogin.equals(login)) {\n            return lhsLogin.equals(login) ? 0 : 1;\n        }\n\n        return CASE_INSENSITIVE_ORDER.compare(lhsLogin, rhsLogin);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/core/user/UserEventMatcher.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.core.user;\n\nimport com.meisolsson.githubsdk.model.GitHubEvent;\nimport com.meisolsson.githubsdk.model.GitHubEventType;\nimport com.meisolsson.githubsdk.model.User;\nimport com.meisolsson.githubsdk.model.payload.FollowPayload;\n\n/**\n * Matches a {@link User} in an {@link GitHubEvent}\n */\npublic class UserEventMatcher {\n\n    /**\n     * Pair of users in an {@link GitHubEvent}\n     */\n    public static class UserPair {\n\n        /**\n         * Actor in event\n         */\n        public final User from;\n\n        /**\n         * User being acted upon\n         */\n        public final User to;\n\n        private UserPair(final User from, final User to) {\n            this.from = from;\n            this.to = to;\n        }\n    }\n\n    /**\n     * Get {@link UserPair} from event\n     *\n     * @param event\n     * @return user or null if event doesn't apply\n     */\n    public static UserPair getUsers(final GitHubEvent event) {\n        if (event == null || event.payload() == null) {\n            return null;\n        }\n\n        GitHubEventType type = event.type();\n        if (GitHubEventType.FollowEvent.equals(type)) {\n            User from = event.actor();\n            User to = ((FollowPayload) event.payload()).target();\n            if (from != null && to != null) {\n                return new UserPair(from, to);\n            }\n        }\n\n        return null;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/core/user/UserUriMatcher.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.core.user;\n\nimport android.net.Uri;\n\nimport com.github.pockethub.android.core.repo.RepositoryUtils;\nimport com.meisolsson.githubsdk.model.User;\n\nimport java.util.List;\n\n/**\n * Parses a {@link User} from a {@link Uri}\n */\npublic class UserUriMatcher {\n\n    /**\n     * Attempt to parse a {@link User} from the given {@link Uri}\n     *\n     * @param uri\n     * @return {@link User} or null if unparseable\n     */\n    public static User getUser(Uri uri) {\n        List<String> segments = uri.getPathSegments();\n        if (segments.size() < 1) {\n            return null;\n        }\n\n        String login = segments.get(0);\n        if (!RepositoryUtils.isValidOwner(login)) {\n            return null;\n        }\n\n\n        return User.builder()\n                .login(login)\n                .build();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/dagger/ActivityBuilder.java",
    "content": "package com.github.pockethub.android.dagger;\n\nimport com.github.pockethub.android.accounts.LoginActivity;\nimport com.github.pockethub.android.accounts.LoginWebViewActivity;\nimport com.github.pockethub.android.dagger.MainFragmentProvider;\nimport com.github.pockethub.android.ui.MainActivity;\nimport com.github.pockethub.android.ui.commit.CommitCompareViewActivity;\nimport com.github.pockethub.android.ui.commit.CommitFileViewActivity;\nimport com.github.pockethub.android.ui.commit.CommitViewActivity;\nimport com.github.pockethub.android.ui.gist.CreateGistActivity;\nimport com.github.pockethub.android.ui.gist.GistFilesViewActivity;\nimport com.github.pockethub.android.ui.gist.GistsPagerFragment;\nimport com.github.pockethub.android.ui.gist.GistsViewActivity;\nimport com.github.pockethub.android.ui.issue.EditIssueActivity;\nimport com.github.pockethub.android.ui.issue.EditIssuesFilterActivity;\nimport com.github.pockethub.android.ui.issue.FiltersViewActivity;\nimport com.github.pockethub.android.ui.issue.IssueBrowseActivity;\nimport com.github.pockethub.android.ui.issue.IssueSearchActivity;\nimport com.github.pockethub.android.ui.issue.IssuesViewActivity;\nimport com.github.pockethub.android.ui.notification.NotificationActivity;\nimport com.github.pockethub.android.ui.ref.BranchFileViewActivity;\nimport com.github.pockethub.android.ui.repo.RepositoryContributorsActivity;\nimport com.github.pockethub.android.ui.repo.RepositoryViewActivity;\nimport com.github.pockethub.android.ui.search.SearchActivity;\nimport com.github.pockethub.android.ui.user.UriLauncherActivity;\nimport com.github.pockethub.android.ui.user.UserViewActivity;\n\nimport dagger.Module;\nimport dagger.android.ContributesAndroidInjector;\n\n@Module\npublic interface ActivityBuilder {\n\n    @ContributesAndroidInjector(modules = MainFragmentProvider.class)\n    MainActivity mainActivity();\n\n    @ContributesAndroidInjector(modules = RepositoryViewFragmentProvider.class)\n    RepositoryViewActivity repositoryViewActivity();\n\n    @ContributesAndroidInjector(modules = IssuesViewFragmentProvider.class)\n    IssuesViewActivity issuesViewActivity();\n\n    @ContributesAndroidInjector(modules = NotificationFragmentProvider.class)\n    NotificationActivity notificationActivity();\n\n    @ContributesAndroidInjector\n    CreateGistActivity createGistActivity();\n\n    @ContributesAndroidInjector(modules = IssueBrowseFragmentProvider.class)\n    IssueBrowseActivity issueBrowseActivity();\n\n    @ContributesAndroidInjector\n    EditIssuesFilterActivity editIssuesFilterActivity();\n\n    @ContributesAndroidInjector\n    EditIssueActivity editIssueActivity();\n\n    @ContributesAndroidInjector(modules = SearchActivityFragmentProvider.class)\n    SearchActivity searchActivity();\n\n    @ContributesAndroidInjector(modules = FiltersViewFragmentProvider.class)\n    FiltersViewActivity filtersViewActivity();\n\n    @ContributesAndroidInjector(modules = GistsViewFragmentProvider.class)\n    GistsViewActivity gistsViewActivity();\n\n    @ContributesAndroidInjector(modules = GistFilesViewFragmentProvider.class)\n    GistFilesViewActivity gistFilesViewActivity();\n\n    @ContributesAndroidInjector(modules = CreateCommentFragmentProvider.class)\n    com.github.pockethub.android.ui.gist.CreateCommentActivity createGistCommentActivity();\n\n    @ContributesAndroidInjector(modules = CreateCommentFragmentProvider.class)\n    com.github.pockethub.android.ui.issue.CreateCommentActivity createIssueCommentActivity();\n\n    @ContributesAndroidInjector(modules = CreateCommentFragmentProvider.class)\n    com.github.pockethub.android.ui.commit.CreateCommentActivity createCommitCommentActivity();\n\n    @ContributesAndroidInjector(modules = CreateCommentFragmentProvider.class)\n    com.github.pockethub.android.ui.gist.EditCommentActivity editGistCommentActivity();\n\n    @ContributesAndroidInjector(modules = CreateCommentFragmentProvider.class)\n    com.github.pockethub.android.ui.issue.EditCommentActivity editIssueCommentActivity();\n\n    @ContributesAndroidInjector(modules = RepositoryContributorsFragmentProvider.class)\n    RepositoryContributorsActivity repositoryContributorsActivity();\n\n    @ContributesAndroidInjector(modules = UserViewFragmentProvider.class)\n    UserViewActivity userViewActivity();\n\n    @ContributesAndroidInjector\n    LoginActivity loginActivity();\n\n    @ContributesAndroidInjector\n    UriLauncherActivity uriLauncherActivity();\n\n    @ContributesAndroidInjector(modules = IssueSearchFragmentProvider.class)\n    IssueSearchActivity issueSearchActivity();\n\n    @ContributesAndroidInjector(modules = CommitCompareViewFragmentProvider.class)\n    CommitCompareViewActivity commitCompareViewActivity();\n\n    @ContributesAndroidInjector(modules = CommitViewFragmentProvider.class)\n    CommitViewActivity commitViewActivity();\n\n    @ContributesAndroidInjector\n    CommitFileViewActivity commitFileViewActivity();\n\n    @ContributesAndroidInjector\n    BranchFileViewActivity branchFileViewActivity();\n\n    @ContributesAndroidInjector\n    LoginWebViewActivity loginWebViewActivity();\n}"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/dagger/ActivityScope.java",
    "content": "package com.github.pockethub.android.dagger;\n\nimport java.lang.annotation.Retention;\nimport java.lang.annotation.RetentionPolicy;\n\nimport javax.inject.Scope;\n\n@Scope\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface ActivityScope {\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/dagger/CommitCompareViewFragmentProvider.java",
    "content": "package com.github.pockethub.android.dagger;\n\nimport com.github.pockethub.android.ui.commit.CommitCompareListFragment;\n\nimport dagger.Module;\nimport dagger.android.ContributesAndroidInjector;\n\n@Module\ninterface CommitCompareViewFragmentProvider {\n\n    @ContributesAndroidInjector\n    CommitCompareListFragment commitCompareListFragment();\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/dagger/CommitViewFragmentProvider.java",
    "content": "package com.github.pockethub.android.dagger;\n\nimport com.github.pockethub.android.ui.commit.CommitDiffListFragment;\n\nimport dagger.Module;\nimport dagger.android.ContributesAndroidInjector;\n\n@Module\ninterface CommitViewFragmentProvider {\n\n    @ContributesAndroidInjector\n    CommitDiffListFragment commitDiffListFragment();\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/dagger/CreateCommentFragmentProvider.java",
    "content": "package com.github.pockethub.android.dagger;\n\nimport com.github.pockethub.android.ui.comment.RawCommentFragment;\nimport com.github.pockethub.android.ui.comment.RenderedCommentFragment;\n\nimport dagger.Module;\nimport dagger.android.ContributesAndroidInjector;\n\n@Module\ninterface CreateCommentFragmentProvider {\n\n    @ContributesAndroidInjector\n    RawCommentFragment rawCommentFragment();\n\n    @ContributesAndroidInjector\n    RenderedCommentFragment renderedCommentFragment();\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/dagger/DialogFragmentBuilder.java",
    "content": "package com.github.pockethub.android.dagger;\n\nimport com.github.pockethub.android.ui.ConfirmDialogFragment;\nimport com.github.pockethub.android.ui.issue.AssigneeDialogFragment;\nimport com.github.pockethub.android.ui.issue.LabelsDialogFragment;\nimport com.github.pockethub.android.ui.issue.MilestoneDialogFragment;\nimport com.github.pockethub.android.ui.ref.RefDialogFragment;\n\nimport dagger.Module;\nimport dagger.android.ContributesAndroidInjector;\n\n@Module\npublic interface DialogFragmentBuilder {\n\n    @ContributesAndroidInjector\n    LabelsDialogFragment labelsDialogFragment();\n\n    @ContributesAndroidInjector\n    AssigneeDialogFragment assigneeDialogFragment();\n\n    @ContributesAndroidInjector\n    MilestoneDialogFragment milestoneDialogFragment();\n\n    @ContributesAndroidInjector\n    RefDialogFragment refDialogFragment();\n\n    @ContributesAndroidInjector\n    ConfirmDialogFragment confirmDialogFragment();\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/dagger/FiltersViewFragmentProvider.java",
    "content": "package com.github.pockethub.android.dagger;\n\nimport com.github.pockethub.android.ui.issue.FilterListFragment;\n\nimport dagger.Module;\nimport dagger.android.ContributesAndroidInjector;\n\n@Module\ninterface FiltersViewFragmentProvider {\n\n    @ContributesAndroidInjector\n    FilterListFragment filterListFragment();\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/dagger/GistFilesViewFragmentProvider.java",
    "content": "package com.github.pockethub.android.dagger;\n\nimport com.github.pockethub.android.ui.gist.GistFileFragment;\n\nimport dagger.Module;\nimport dagger.android.ContributesAndroidInjector;\n\n@Module\ninterface GistFilesViewFragmentProvider {\n\n    @ContributesAndroidInjector\n    GistFileFragment gistFileFragment();\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/dagger/GistsPagerFragmentProvider.java",
    "content": "package com.github.pockethub.android.dagger;\n\nimport com.github.pockethub.android.ui.gist.MyGistsFragment;\nimport com.github.pockethub.android.ui.gist.PublicGistsFragment;\nimport com.github.pockethub.android.ui.gist.StarredGistsFragment;\n\nimport dagger.Module;\nimport dagger.android.ContributesAndroidInjector;\n\n@Module\ninterface GistsPagerFragmentProvider {\n\n    @ContributesAndroidInjector\n    MyGistsFragment myGistsFragment();\n\n    @ContributesAndroidInjector\n    PublicGistsFragment publicGistsFragment();\n\n    @ContributesAndroidInjector\n    StarredGistsFragment starredGistsFragment();\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/dagger/GistsViewFragmentProvider.java",
    "content": "package com.github.pockethub.android.dagger;\n\nimport com.github.pockethub.android.ui.gist.GistFragment;\n\nimport dagger.Module;\nimport dagger.android.ContributesAndroidInjector;\n\n@Module\ninterface GistsViewFragmentProvider {\n\n    @ContributesAndroidInjector\n    GistFragment gistFragment();\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/dagger/HomePagerFragmentProvider.java",
    "content": "package com.github.pockethub.android.dagger;\n\nimport com.github.pockethub.android.ui.repo.RepositoryListFragment;\nimport com.github.pockethub.android.ui.user.MembersFragment;\nimport com.github.pockethub.android.ui.user.MyFollowersFragment;\nimport com.github.pockethub.android.ui.user.MyFollowingFragment;\nimport com.github.pockethub.android.ui.user.OrganizationNewsFragment;\nimport com.github.pockethub.android.ui.user.UserReceivedNewsFragment;\n\nimport dagger.Module;\nimport dagger.android.ContributesAndroidInjector;\n\n@Module\ninterface HomePagerFragmentProvider {\n\n    @ContributesAndroidInjector\n    UserReceivedNewsFragment userReceivedNewsFragment();\n\n    @ContributesAndroidInjector\n    OrganizationNewsFragment organizationNewsFragment();\n\n    @ContributesAndroidInjector\n    RepositoryListFragment repositoryListFragment();\n\n    @ContributesAndroidInjector\n    MyFollowersFragment myFollowersFragment();\n\n    @ContributesAndroidInjector\n    MyFollowingFragment myFollowingFragment();\n\n    @ContributesAndroidInjector\n    MembersFragment membersFragment();\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/dagger/IssueBrowseFragmentProvider.java",
    "content": "package com.github.pockethub.android.dagger;\n\nimport com.github.pockethub.android.ui.issue.IssuesFragment;\n\nimport dagger.Module;\nimport dagger.android.ContributesAndroidInjector;\n\n@Module\ninterface IssueBrowseFragmentProvider {\n\n    @ContributesAndroidInjector\n    IssuesFragment issuesFragment();\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/dagger/IssueDashboardPagerFragmentProvider.java",
    "content": "package com.github.pockethub.android.dagger;\n\nimport com.github.pockethub.android.ui.issue.DashboardIssueFragment;\n\nimport dagger.Module;\nimport dagger.android.ContributesAndroidInjector;\n\n@Module\ninterface IssueDashboardPagerFragmentProvider {\n\n    @ContributesAndroidInjector\n    DashboardIssueFragment dashboardIssueFragment();\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/dagger/IssueSearchFragmentProvider.java",
    "content": "package com.github.pockethub.android.dagger;\n\nimport com.github.pockethub.android.ui.issue.SearchIssueListFragment;\n\nimport dagger.Module;\nimport dagger.android.ContributesAndroidInjector;\n\n@Module\ninterface IssueSearchFragmentProvider {\n\n    @ContributesAndroidInjector\n    SearchIssueListFragment searchIssueListFragment();\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/dagger/IssuesViewFragmentProvider.java",
    "content": "package com.github.pockethub.android.dagger;\n\nimport com.github.pockethub.android.ui.issue.IssueFragment;\n\nimport dagger.Module;\nimport dagger.android.ContributesAndroidInjector;\n\n@Module\ninterface IssuesViewFragmentProvider {\n\n    @ContributesAndroidInjector\n    IssueFragment issueFragment();\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/dagger/MainFragmentProvider.java",
    "content": "package com.github.pockethub.android.dagger;\n\nimport com.github.pockethub.android.ui.gist.GistsPagerFragment;\nimport com.github.pockethub.android.ui.issue.FilterListFragment;\nimport com.github.pockethub.android.ui.issue.IssueDashboardPagerFragment;\nimport com.github.pockethub.android.ui.repo.RepositoryListFragment;\nimport com.github.pockethub.android.ui.user.HomePagerFragment;\nimport com.github.pockethub.android.ui.user.MyFollowersFragment;\nimport com.github.pockethub.android.ui.user.MyFollowingFragment;\nimport com.github.pockethub.android.ui.user.OrganizationNewsFragment;\nimport com.github.pockethub.android.ui.user.UserReceivedNewsFragment;\n\nimport dagger.Module;\nimport dagger.android.ContributesAndroidInjector;\n\n@Module\npublic interface MainFragmentProvider {\n\n    @ContributesAndroidInjector(modules = HomePagerFragmentProvider.class)\n    HomePagerFragment homePagerFragment();\n\n    @ContributesAndroidInjector(modules = GistsPagerFragmentProvider.class)\n    GistsPagerFragment gistsPagerFragment();\n\n    @ContributesAndroidInjector(modules = IssueDashboardPagerFragmentProvider.class)\n    IssueDashboardPagerFragment issueDashboardPagerFragment();\n\n    @ContributesAndroidInjector\n    FilterListFragment filterListFragment();\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/dagger/NotificationFragmentProvider.java",
    "content": "package com.github.pockethub.android.dagger;\n\nimport com.github.pockethub.android.ui.notification.NotificationListFragment;\n\nimport dagger.Module;\nimport dagger.android.ContributesAndroidInjector;\n\n@Module\ninterface NotificationFragmentProvider {\n\n    @ContributesAndroidInjector\n    NotificationListFragment notificationListFragment();\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/dagger/RepositoryContributorsFragmentProvider.java",
    "content": "package com.github.pockethub.android.dagger;\n\nimport com.github.pockethub.android.ui.repo.RepositoryContributorsFragment;\n\nimport dagger.Module;\nimport dagger.android.ContributesAndroidInjector;\n\n@Module\ninterface RepositoryContributorsFragmentProvider {\n\n    @ContributesAndroidInjector\n    RepositoryContributorsFragment repositoryContributorsFragment();\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/dagger/RepositoryViewFragmentProvider.java",
    "content": "package com.github.pockethub.android.dagger;\n\nimport com.github.pockethub.android.ui.code.RepositoryCodeFragment;\nimport com.github.pockethub.android.ui.commit.CommitListFragment;\nimport com.github.pockethub.android.ui.issue.IssuesFragment;\nimport com.github.pockethub.android.ui.repo.RepositoryNewsFragment;\nimport com.github.pockethub.android.ui.repo.RepositoryReadmeFragment;\n\nimport dagger.Module;\nimport dagger.android.ContributesAndroidInjector;\n\n@Module\ninterface RepositoryViewFragmentProvider {\n\n    @ContributesAndroidInjector\n    RepositoryReadmeFragment repositoryReadmeFragment();\n\n    @ContributesAndroidInjector\n    RepositoryNewsFragment repositoryNewsFragment();\n\n    @ContributesAndroidInjector\n    RepositoryCodeFragment repositoryCodeFragment();\n\n    @ContributesAndroidInjector\n    CommitListFragment commitListFragment();\n\n    @ContributesAndroidInjector\n    IssuesFragment issuesFragment();\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/dagger/SearchActivityFragmentProvider.java",
    "content": "package com.github.pockethub.android.dagger;\n\nimport com.github.pockethub.android.ui.search.SearchRepositoryListFragment;\nimport com.github.pockethub.android.ui.search.SearchUserListFragment;\n\nimport dagger.Module;\nimport dagger.android.ContributesAndroidInjector;\n\n@Module\ninterface SearchActivityFragmentProvider {\n\n    @ContributesAndroidInjector\n    SearchRepositoryListFragment searchRepositoryListFragment();\n\n    @ContributesAndroidInjector\n    SearchUserListFragment searchUserListFragment();\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/dagger/ServiceBuilder.java",
    "content": "package com.github.pockethub.android.dagger;\n\nimport com.github.pockethub.android.sync.SyncAdapterService;\n\nimport dagger.Module;\nimport dagger.android.ContributesAndroidInjector;\n\n@Module\npublic interface ServiceBuilder {\n\n    @ContributesAndroidInjector\n    SyncAdapterService provideSyncAdapterService();\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/dagger/UserViewFragmentProvider.java",
    "content": "package com.github.pockethub.android.dagger;\n\nimport com.github.pockethub.android.ui.repo.UserRepositoryListFragment;\nimport com.github.pockethub.android.ui.user.UserCreatedNewsFragment;\nimport com.github.pockethub.android.ui.user.UserFollowersFragment;\nimport com.github.pockethub.android.ui.user.UserFollowingFragment;\n\nimport dagger.Module;\nimport dagger.android.ContributesAndroidInjector;\n\n@Module\ninterface UserViewFragmentProvider {\n\n    @ContributesAndroidInjector\n    UserCreatedNewsFragment userCreatedNewsFragment();\n\n    @ContributesAndroidInjector\n    UserRepositoryListFragment userRepositoryListFragment();\n\n    @ContributesAndroidInjector\n    UserFollowersFragment userFollowersFragment();\n\n    @ContributesAndroidInjector\n    UserFollowingFragment userFollowingFragment();\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/markwon/AlignHandler.java",
    "content": "package com.github.pockethub.android.markwon;\n\nimport android.text.Layout;\nimport android.text.style.AlignmentSpan;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimport java.util.Arrays;\nimport java.util.Collection;\nimport io.noties.markwon.MarkwonConfiguration;\nimport io.noties.markwon.RenderProps;\nimport io.noties.markwon.html.HtmlTag;\nimport io.noties.markwon.html.tag.SimpleTagHandler;\n\npublic class AlignHandler extends SimpleTagHandler {\n\n    @Nullable\n    @Override\n    public Object getSpans(\n            @NonNull MarkwonConfiguration configuration,\n            @NonNull RenderProps renderProps,\n            @NonNull HtmlTag tag) {\n\n        final Layout.Alignment alignment;\n        if (tag.attributes().containsKey(\"align\")) {\n            String align = tag.attributes().get(\"align\");\n            switch (align == null ? \"no-alignment\" : align) {\n                case \"center\":\n                    alignment = Layout.Alignment.ALIGN_CENTER;\n                    break;\n                case \"right\":\n                    alignment = Layout.Alignment.ALIGN_OPPOSITE;\n                    break;\n                case \"left\":\n                default:\n                    alignment = Layout.Alignment.ALIGN_NORMAL;\n                    break;\n            }\n        } else {\n            alignment = Layout.Alignment.ALIGN_NORMAL;\n        }\n\n        return new AlignmentSpan.Standard(alignment);\n    }\n\n    @NonNull\n    @Override\n    public Collection<String> supportedTags() {\n        return Arrays.asList(\"p\", \"a\");\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/markwon/AsyncDrawableSchedulerPlugin.java",
    "content": "package com.github.pockethub.android.markwon;\n\nimport android.text.Spanned;\nimport android.view.View;\nimport android.widget.TextView;\n\nimport androidx.annotation.NonNull;\n\nimport io.noties.markwon.AbstractMarkwonPlugin;\n\npublic class AsyncDrawableSchedulerPlugin extends AbstractMarkwonPlugin {\n    @Override\n    public void beforeSetText(@NonNull TextView textView, @NonNull Spanned markdown) {\n        textView.removeOnLayoutChangeListener(this::onLayoutChange);\n    }\n\n    @Override\n    public void afterSetText(@NonNull TextView textView) {\n        textView.addOnLayoutChangeListener(this::onLayoutChange);\n    }\n\n    private void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {\n        if (v instanceof TextView) {\n            io.noties.markwon.image.AsyncDrawableScheduler.schedule((TextView) v);\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/markwon/FontResolver.java",
    "content": "package com.github.pockethub.android.markwon;\n\nimport android.content.res.AssetManager;\nimport android.graphics.Typeface;\n\nimport com.caverock.androidsvg.SimpleAssetResolver;\n\npublic class FontResolver extends SimpleAssetResolver {\n\n    public FontResolver(AssetManager assetManager) {\n        super(assetManager);\n    }\n\n    @Override\n    public Typeface resolveFont(String fontFamily, int fontWeight, String fontStyle) {\n        Typeface typeface = super.resolveFont(fontFamily, fontWeight, fontStyle);\n\n        int style = Typeface.NORMAL;\n        switch (fontStyle) {\n            case \"normal\":\n                style = Typeface.NORMAL;\n                break;\n            case \"italic\":\n            case \"oblique\":\n                style = Typeface.ITALIC;\n                break;\n        }\n\n        if (fontWeight >= 600) {\n            style += Typeface.BOLD;\n        }\n\n        if (typeface == null) {\n            try {\n                return Typeface.create(fontFamily, style);\n            } catch (Exception e) {\n                return null;\n            }\n        }\n\n        return typeface;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/markwon/GifAwareGlideStore.java",
    "content": "package com.github.pockethub.android.markwon;\n\nimport android.content.Context;\nimport android.graphics.drawable.Animatable;\nimport android.graphics.drawable.Drawable;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimport com.bumptech.glide.Glide;\nimport com.bumptech.glide.RequestBuilder;\nimport com.bumptech.glide.load.DataSource;\nimport com.bumptech.glide.load.engine.GlideException;\nimport com.bumptech.glide.request.RequestListener;\nimport com.bumptech.glide.request.target.Target;\n\nimport io.noties.markwon.image.AsyncDrawable;\nimport io.noties.markwon.image.glide.GlideImagesPlugin;\n\nclass GifAwareGlideStore implements GlideImagesPlugin.GlideStore {\n    private final Context context;\n\n    public GifAwareGlideStore(Context context) {\n        this.context = context;\n    }\n\n    @NonNull\n    @Override\n    public RequestBuilder<Drawable> load(@NonNull AsyncDrawable drawable) {\n        return Glide.with(context)\n                .load(drawable.getDestination())\n                .addListener(new RequestListener<Drawable>() {\n                    @Override\n                    public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {\n                        return false;\n                    }\n\n                    @Override\n                    public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {\n                        if (resource instanceof Animatable) {\n                            ((Animatable) resource).start();\n                        }\n                        return false;\n                    }\n                });\n    }\n\n    @Override\n    public void cancel(@NonNull Target<?> target) {\n        Glide.with(context).clear(target);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/markwon/MarkwonUtils.java",
    "content": "package com.github.pockethub.android.markwon;\n\nimport android.content.Context;\n\nimport androidx.annotation.NonNull;\n\nimport org.commonmark.node.AbstractVisitor;\nimport org.commonmark.node.FencedCodeBlock;\nimport org.commonmark.node.HtmlBlock;\nimport org.commonmark.node.Node;\nimport org.commonmark.node.Visitor;\nimport org.commonmark.parser.Parser;\nimport org.commonmark.parser.PostProcessor;\n\nimport io.noties.markwon.AbstractMarkwonPlugin;\nimport io.noties.markwon.Markwon;\nimport io.noties.markwon.MarkwonVisitor;\nimport io.noties.markwon.ext.strikethrough.StrikethroughPlugin;\nimport io.noties.markwon.ext.tables.TablePlugin;\nimport io.noties.markwon.ext.tasklist.TaskListPlugin;\nimport io.noties.markwon.html.HtmlPlugin;\nimport io.noties.markwon.image.glide.GlideImagesPlugin;\nimport io.noties.markwon.recycler.table.TableEntryPlugin;\nimport io.noties.markwon.syntax.Prism4jThemeDefault;\nimport io.noties.markwon.syntax.SyntaxHighlightPlugin;\nimport io.noties.prism4j.Prism4j;\nimport io.noties.prism4j.annotations.PrismBundle;\n\n@PrismBundle(\n        includeAll = true\n)\npublic class MarkwonUtils {\n\n    public static Markwon createMarkwon (Context context, String baseUrl) {\n        final Prism4j prism4j = new Prism4j(new GrammarLocatorDef());\n\n        return Markwon.builder(context)\n                .usePlugin(StrikethroughPlugin.create())\n                .usePlugin(TaskListPlugin.create(context))\n                .usePlugin(HtmlPlugin.create())\n                .usePlugin(new AbstractMarkwonPlugin() {\n\n                    @Override\n                    public void configureVisitor(@NonNull MarkwonVisitor.Builder builder) {\n                        builder.on(FencedCodeBlock.class, (visitor, fencedCodeBlock) -> {\n                            // We actually won't be applying code spans here, as our custom view will\n                            // draw background and apply mono typeface\n                            //\n                            // NB the `trim` operation on literal (as code will have a new line at the end)\n                            final CharSequence code = visitor.configuration()\n                                    .syntaxHighlight()\n                                    .highlight(fencedCodeBlock.getInfo(), fencedCodeBlock.getLiteral().trim());\n                            visitor.builder().append(code);\n                        });\n                    }\n\n                    @Override\n                    public void configureParser(@NonNull Parser.Builder builder) {\n                        super.configureParser(builder);\n                        builder.postProcessor(new PostProcessor() {\n                            @Override\n                            public Node process(Node node) {\n                                Visitor t = new AbstractVisitor() {\n                                    @Override\n                                    public void visit(HtmlBlock htmlBlock) {\n                                        String literal = htmlBlock.getLiteral();\n                                        if (literal.startsWith(\"<!--\")) {\n                                            htmlBlock.unlink();\n                                        } else {\n                                            super.visit(htmlBlock);\n                                        }\n                                    }\n                                };\n                                node.accept(t);\n                                return node;\n                            }\n                        });\n                    }\n                })\n                .usePlugin(GlideImagesPlugin.create(new GifAwareGlideStore(context)))\n                .usePlugin(new SpanLinkPlugin(baseUrl))\n                .usePlugin(new AbstractMarkwonPlugin() {\n                    @Override\n                    public void configure(@NonNull Registry registry) {\n                        registry.require(HtmlPlugin.class, htmlPlugin -> htmlPlugin.addHandler(new AlignHandler()));\n                    }\n                })\n                .usePlugin(TableEntryPlugin.create(TablePlugin.create(context)))\n                .usePlugin(SyntaxHighlightPlugin.create(prism4j, Prism4jThemeDefault.create()))\n                .usePlugin(new AsyncDrawableSchedulerPlugin())\n                .build();\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/markwon/SpanLinkPlugin.java",
    "content": "package com.github.pockethub.android.markwon;\n\nimport android.text.style.URLSpan;\n\nimport androidx.annotation.NonNull;\n\nimport org.commonmark.node.Image;\nimport org.commonmark.node.Link;\n\nimport io.noties.markwon.AbstractMarkwonPlugin;\nimport io.noties.markwon.MarkwonSpansFactory;\nimport io.noties.markwon.SpanFactory;\nimport io.noties.markwon.core.CoreProps;\nimport io.noties.markwon.image.ImageProps;\nimport io.noties.markwon.urlprocessor.UrlProcessor;\nimport io.noties.markwon.urlprocessor.UrlProcessorRelativeToAbsolute;\n\npublic class SpanLinkPlugin extends AbstractMarkwonPlugin {\n\n    private UrlProcessor imageUrlProcessor;\n    private UrlProcessor linkUrlProcessor;\n\n    public SpanLinkPlugin(String baseUrl) {\n        this.imageUrlProcessor = new UrlProcessorRelativeToAbsolute(String.format(baseUrl, \"raw\"));\n        this.linkUrlProcessor = new UrlProcessorRelativeToAbsolute(String.format(baseUrl, \"blob\"));\n    }\n\n\n    @Override\n    public void configureSpansFactory(@NonNull MarkwonSpansFactory.Builder builder) {\n        final SpanFactory imageOrigin = builder.getFactory(Image.class);\n        if (imageOrigin != null) {\n            builder.setFactory(Image.class, (configuration, props) -> {\n                String dest = ImageProps.DESTINATION.require(props);\n                ImageProps.DESTINATION.set(props, imageUrlProcessor.process(dest));\n                return new Object[]{\n                        imageOrigin.getSpans(configuration, props),\n                        new URLSpan(linkUrlProcessor.process(dest))\n                };\n            });\n        }\n\n        final SpanFactory linkOrigin = builder.getFactory(Link.class);\n        if (linkOrigin != null) {\n            builder.setFactory(Link.class, (configuration, props) -> {\n                String dest = CoreProps.LINK_DESTINATION.require(props);\n                CoreProps.LINK_DESTINATION.set(props, linkUrlProcessor.process(dest));\n                return new Object[]{ linkOrigin.getSpans(configuration, props) };\n            });\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/markwon/SvgDecoder.java",
    "content": "package com.github.pockethub.android.markwon;\n\nimport androidx.annotation.NonNull;\nimport com.bumptech.glide.load.Options;\nimport com.bumptech.glide.load.ResourceDecoder;\nimport com.bumptech.glide.load.engine.Resource;\nimport com.bumptech.glide.load.resource.SimpleResource;\nimport com.caverock.androidsvg.SVG;\nimport com.caverock.androidsvg.SVGParseException;\nimport java.io.IOException;\nimport java.io.InputStream;\n\n/** Decodes an SVG internal representation from an {@link InputStream}. */\npublic class SvgDecoder implements ResourceDecoder<InputStream, SVG> {\n\n    @Override\n    public boolean handles(@NonNull InputStream source, @NonNull Options options) {\n        // TODO: Can we tell?\n        return true;\n    }\n\n    public Resource<SVG> decode(\n            @NonNull InputStream source, int width, int height, @NonNull Options options)\n            throws IOException {\n        try {\n            SVG svg = SVG.getFromInputStream(source);\n            if (width > 0) {\n                svg.setDocumentWidth(width);\n            }\n\n            if (height > 0) {\n                svg.setDocumentHeight(height);\n            }\n            return new SimpleResource<>(svg);\n        } catch (SVGParseException ex) {\n            throw new IOException(\"Cannot load SVG from stream\", ex);\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/markwon/SvgDrawableTranscoder.java",
    "content": "package com.github.pockethub.android.markwon;\n\nimport android.graphics.Picture;\nimport android.graphics.drawable.Drawable;\nimport android.graphics.drawable.PictureDrawable;\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimport com.bumptech.glide.load.Options;\nimport com.bumptech.glide.load.engine.Resource;\nimport com.bumptech.glide.load.resource.SimpleResource;\nimport com.bumptech.glide.load.resource.transcode.ResourceTranscoder;\nimport com.caverock.androidsvg.SVG;\n/**\n * Convert the {@link SVG}'s internal representation to an Android-compatible one ({@link Picture}).\n */\npublic class SvgDrawableTranscoder implements ResourceTranscoder<SVG, Drawable> {\n    @Nullable\n    @Override\n    public Resource<Drawable> transcode(@NonNull Resource<SVG> toTranscode, @NonNull Options options) {\n        SVG svg = toTranscode.get();\n        float ratio = svg.getDocumentAspectRatio();\n        int width = svg.getDocumentWidth() > 0 ? (int) svg.getDocumentWidth() : 1024;\n        int height = (int) (svg.getDocumentHeight() > 0 ? svg.getDocumentHeight() : (width / ratio));\n        Picture picture = svg.renderToPicture(width, height);\n        PictureDrawable drawable = new PictureDrawable(picture);\n        return new SimpleResource<>(drawable);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/markwon/SvgModule.java",
    "content": "package com.github.pockethub.android.markwon;\n\nimport android.content.Context;\nimport android.graphics.drawable.Drawable;\n\nimport androidx.annotation.NonNull;\nimport com.bumptech.glide.Glide;\nimport com.bumptech.glide.Registry;\nimport com.bumptech.glide.annotation.GlideModule;\nimport com.bumptech.glide.module.AppGlideModule;\nimport com.caverock.androidsvg.SVG;\nimport java.io.InputStream;\n\n/** Module for the SVG sample app. */\n@GlideModule\npublic class SvgModule extends AppGlideModule {\n    @Override\n    public void registerComponents(@NonNull Context context, @NonNull Glide glide, @NonNull Registry registry) {\n        registry.register(SVG.class, Drawable.class, new SvgDrawableTranscoder())\n                .append(InputStream.class, SVG.class, new SvgDecoder());\n    }\n\n    // Disable manifest parsing to avoid adding similar modules twice.\n    @Override\n    public boolean isManifestParsingEnabled() {\n        return false;\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/persistence/AccountDataManager.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.persistence;\n\nimport android.content.Context;\nimport android.database.Cursor;\nimport android.database.sqlite.SQLiteOpenHelper;\nimport android.database.sqlite.SQLiteQueryBuilder;\nimport android.util.Log;\n\nimport com.github.pockethub.android.GetFilterLabels;\nimport com.github.pockethub.android.GetFilters;\nimport com.github.pockethub.android.RequestReader;\nimport com.github.pockethub.android.RequestWriter;\nimport com.github.pockethub.android.Users;\nimport com.github.pockethub.android.core.issue.IssueFilter;\nimport com.meisolsson.githubsdk.model.Label;\nimport com.meisolsson.githubsdk.model.Milestone;\nimport com.meisolsson.githubsdk.model.Permissions;\nimport com.meisolsson.githubsdk.model.Repository;\nimport com.meisolsson.githubsdk.model.User;\nimport io.reactivex.Single;\n\nimport javax.inject.Inject;\nimport javax.inject.Named;\nimport java.io.File;\nimport java.io.IOException;\nimport java.text.MessageFormat;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.concurrent.Executor;\nimport java.util.concurrent.Executors;\n\n/**\n * Manager cache for an account\n */\npublic class AccountDataManager {\n\n    private static final String TAG = \"AccountDataManager\";\n\n    private static final Executor EXECUTOR = Executors.newFixedThreadPool(10);\n\n    /**\n     * Format version to bump if serialization format changes and cache should\n     * be ignored\n     */\n    private static final int FORMAT_VERSION = 4;\n\n    @Inject\n    protected Context context;\n\n    @Inject\n    protected DatabaseCache dbCache;\n\n    @Inject\n    protected OrganizationRepositoriesFactory allRepos;\n\n    @Inject\n    protected Organizations userAndOrgsResource;\n\n    @Inject\n    @Named(\"cacheDir\")\n    protected File root;\n\n    @Inject\n    public AccountDataManager() {}\n\n    /**\n     * @return context\n     */\n    public Context getContext() {\n        return context;\n    }\n\n    /**\n     * Read data from file\n     *\n     * @param file\n     * @return data\n     */\n    @SuppressWarnings(\"unchecked\")\n    private <V> V read(final File file) {\n        long start = System.currentTimeMillis();\n        long length = file.length();\n        Object data = new RequestReader(file, FORMAT_VERSION).read();\n        if (data != null) {\n            Log.d(TAG, MessageFormat.format(\n                    \"Cache hit to {0}, {1} ms to load {2} bytes\",\n                    file.getName(), (System.currentTimeMillis() - start),\n                    length));\n        }\n        return (V) data;\n    }\n\n    /**\n     * Write data to file\n     *\n     * @param file\n     * @param data\n     * @return this manager\n     */\n    private AccountDataManager write(File file, Object data) {\n        new RequestWriter(file, FORMAT_VERSION).write(data);\n        return this;\n    }\n\n    /**\n     * Query tables for columns\n     *\n     * @param helper\n     * @param tables\n     * @param columns\n     * @return cursor\n     */\n    protected Cursor query(SQLiteOpenHelper helper, String tables,\n            String[] columns) {\n        return query(helper, tables, columns, null, null);\n    }\n\n    /**\n     * Query tables for columns\n     *\n     * @param helper\n     * @param tables\n     * @param columns\n     * @param selection\n     * @param selectionArgs\n     * @return cursor\n     */\n    protected Cursor query(SQLiteOpenHelper helper, String tables,\n            String[] columns, String selection, String[] selectionArgs) {\n        SQLiteQueryBuilder builder = new SQLiteQueryBuilder();\n        builder.setTables(tables);\n        return builder.query(helper.getReadableDatabase(), columns, selection,\n                selectionArgs, null, null, null);\n    }\n\n    /**\n     * Get organizations\n     * <p/>\n     * This method may perform file and/or network I/O and should never be\n     * called on the UI-thread\n     *\n     * @param forceReload\n     * @return list of user and Orgs\n     * @throws IOException\n     */\n    public List<User> getOrgs(boolean forceReload) throws IOException {\n        return forceReload ? dbCache.requestAndStore(userAndOrgsResource)\n                : dbCache.loadOrRequest(userAndOrgsResource);\n    }\n\n    /**\n     * Get repositories for given {@link User}\n     * <p/>\n     * This method may perform network I/O and should never be called on the\n     * UI-thread\n     *\n     * @param user\n     * @param forceReload\n     *            if true, cached data will not be returned\n     * @return list of repositories\n     * @throws IOException\n     */\n    public List<Repository> getRepos(final User user, boolean forceReload)\n            throws IOException {\n        OrganizationRepositories resource = allRepos.create(user);\n        return forceReload ? dbCache.requestAndStore(resource) : dbCache\n                .loadOrRequest(resource);\n    }\n\n    /**\n     * Get bookmarked issue filters\n     * <p/>\n     * This method may perform network I/O and should never be called on the\n     * UI-thread\n     *\n     * @return non-null but possibly empty collection of issue filters\n     */\n    public List<IssueFilter> getIssueFilters() {\n        List<GetFilters> filters = dbCache.database.getIssue_filterQueries()\n                .getFilters()\n                .executeAsList();\n\n        List<IssueFilter> issueFilters = new ArrayList<>();\n\n        for (GetFilters f : filters) {\n            Users owner = dbCache.database.getOrganizationsQueries().selectUser(f.getOwnerId()).executeAsOne();\n\n            Repository.Builder builder = Repository.builder()\n                    .id(f.getRepoId())\n                    .name(f.getName())\n                    .owner(\n                            User.builder()\n                                    .id(owner.getId())\n                                    .login(owner.getLogin())\n                                    .name(owner.getName())\n                                    .avatarUrl(owner.getAvatarurl())\n                                    .build()\n                    )\n                    .isPrivate(f.getPrivate())\n                    .isFork(f.getFork())\n                    .description(f.getDescription())\n                    .forksCount(f.getForks())\n                    .watchersCount(f.getWatchers())\n                    .language(f.getLanguage())\n                    .hasIssues(f.getHasIssues())\n                    .mirrorUrl(f.getMirrorUrl())\n                    .permissions(\n                            Permissions.builder()\n                                    .admin(f.getPermissions_admin())\n                                    .pull(f.getPermissions_pull())\n                                    .push(f.getPermissions_push())\n                                    .build()\n                    );\n\n            if (f.getOrgId() != null) {\n                Users org = dbCache.database.getOrganizationsQueries().selectUser(f.getOrgId()).executeAsOne();\n                builder.organization(\n                        User.builder()\n                                .id(org.getId())\n                                .login(org.getLogin())\n                                .name(org.getName())\n                                .avatarUrl(org.getAvatarurl())\n                                .build()\n                );\n            }\n\n            Repository repo = builder.build();\n            IssueFilter filter = new IssueFilter(repo, f.getId());\n            if (f.getLogin() != null) {\n                filter.setAssignee(\n                        User.builder()\n                                .id(f.getId__())\n                                .name(f.getName_())\n                                .login(f.getLogin())\n                                .avatarUrl(f.getAvatarurl())\n                                .build()\n                );\n            }\n\n            if (f.getMilestone_id() != null) {\n                filter.setMilestone(Milestone.builder().id(f.getMilestone_id()).build());\n            }\n\n            filter.setDirection(f.getDirection());\n            filter.setOpen(f.getOpen());\n            filter.setSortType(f.getSort_type());\n\n            List<GetFilterLabels> filterLabels = dbCache.database.getIssue_filterQueries()\n                    .getFilterLabels(filter.getId())\n                    .executeAsList();\n\n            for (GetFilterLabels filterLabel : filterLabels) {\n                filter.addLabel(\n                        Label.builder()\n                                .name(filterLabel.getName())\n                                .color(filterLabel.getColor())\n                                .build()\n                );\n            }\n\n            issueFilters.add(filter);\n        }\n\n        return issueFilters;\n    }\n\n    /**\n     * Add issue filter to store\n     * <p/>\n     * This method may perform file I/O and should never be called on the\n     * UI-thread\n     *\n     * @param filter\n     */\n    public Single<IssueFilter> addIssueFilter(final IssueFilter filter) {\n        Repository repo = filter.getRepository();\n        dbCache.getDatabase().getRepositoriesQueries().replaceRepo(\n                repo.id(),\n                repo.name(),\n                repo.organization() != null ? repo.organization().id() : null,\n                repo.owner().id(),\n                repo.isPrivate(),\n                repo.isFork(),\n                repo.description(),\n                repo.forksCount(),\n                repo.watchersCount(),\n                repo.language(),\n                repo.hasIssues(),\n                repo.mirrorUrl(),\n                repo.permissions().admin(),\n                repo.permissions().pull(),\n                repo.permissions().push()\n        );\n\n        for (Label label : filter.getLabels()) {\n            dbCache.database.getIssue_filterQueries().insertOrReplaceLabel(\n                    repo.id(),\n                    label.name(),\n                    label.color()\n            );\n            dbCache.database.getIssue_filterQueries().insertOrReplaceIssueFilterLabel(\n                    filter.getId(),\n                    repo.id(),\n                    label.name()\n            );\n        }\n\n        if (filter.getMilestone() != null) {\n            dbCache.database.getIssue_filterQueries().insertOrReplaceMilestone(\n                    repo.id(),\n                    filter.getMilestone().title(),\n                    filter.getMilestone().state(),\n                    filter.getMilestone().id(),\n                    filter.getMilestone().number().longValue()\n            );\n        }\n\n        if (filter.getAssignee() != null) {\n            dbCache.database.getOrganizationsQueries().replaceUser(\n                    filter.getAssignee().id(),\n                    filter.getAssignee().login(),\n                    filter.getAssignee().name(),\n                    filter.getAssignee().avatarUrl()\n            );\n        }\n\n        dbCache.database.getIssue_filterQueries().insertOrReplaceIssueFilter(\n                filter.getId(),\n                repo.id(),\n                filter.getMilestone() != null ? filter.getMilestone().id() : null,\n                filter.getAssignee() != null ? filter.getAssignee().id() : null,\n                filter.isOpen(),\n                filter.getDirection(),\n                filter.getSortType()\n        );\n        return Single.just(filter);\n    }\n\n    /**\n     * Add issue filter from store\n     * <p/>\n     * This method may perform file I/O and should never be called on the\n     * UI-thread\n     *\n     * @param filter\n     */\n    public Single<IssueFilter> removeIssueFilter(IssueFilter filter) {\n        dbCache.database.getIssue_filterQueries().removeIssueFilter(filter.getId());\n        for (Label label : filter.getLabels()) {\n            dbCache.database.getIssue_filterQueries().removeIssueFilterLabel(\n                    filter.getId(),\n                    filter.getRepository().id(),\n                    label.name()\n            );\n        }\n\n        return Single.just(filter);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/persistence/DatabaseCache.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.persistence\n\nimport android.util.Log\nimport com.github.pockethub.android.Database\nimport java.io.IOException\nimport javax.inject.Inject\n\n/**\n * Given a PersistableResource, this class will take support loading/storing\n * it's data or requesting fresh data, as appropriate.\n */\nopen class DatabaseCache @Inject constructor() {\n\n    @Inject\n    protected lateinit var database: Database\n\n    /**\n     * Load or request given resources\n     *\n     * @param persistableResource\n     * @return resource\n     * @throws IOException\n     */\n    @Throws(IOException::class)\n    fun <E> loadOrRequest(persistableResource: PersistableResource<E>): List<E> {\n        val items = loadFromDB(persistableResource)\n        if (items != null && items.isNotEmpty()) {\n            Log.d(TAG, \"CACHE HIT: Found ${items.size} items for $persistableResource\")\n            return items\n        }\n        return requestAndStore(persistableResource)\n    }\n\n    /**\n     * Request and store given resources\n     *\n     * @param persistableResource\n     * @return resources\n     * @throws IOException\n     */\n    fun <E> requestAndStore(persistableResource: PersistableResource<E>): List<E> {\n        val items = persistableResource.request()\n        database.transaction {\n            persistableResource.store(database, items)\n        }\n        return items\n    }\n\n    private fun <E> loadFromDB(persistableResource: PersistableResource<E>): List<E>? {\n        return persistableResource.loadItems(database)\n    }\n\n    companion object {\n\n        private val TAG = \"DatabaseCache\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/persistence/OrganizationRepositories.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.persistence\n\nimport android.accounts.Account\nimport android.content.Context\nimport com.github.pockethub.android.Database\nimport com.meisolsson.githubsdk.core.ServiceGenerator\nimport com.meisolsson.githubsdk.model.Page\nimport com.meisolsson.githubsdk.model.Permissions\nimport com.meisolsson.githubsdk.model.Repository\nimport com.meisolsson.githubsdk.model.User\nimport com.meisolsson.githubsdk.service.activity.WatchingService\nimport com.meisolsson.githubsdk.service.repositories.RepositoryService\nimport io.reactivex.Single\nimport retrofit2.Response\nimport java.io.IOException\nimport java.io.InterruptedIOException\nimport java.lang.RuntimeException\nimport java.util.ArrayList\nimport java.util.TreeSet\nimport javax.inject.Provider\n\n/**\n * Cache of repositories under a given organization\n */\n\n/**\n * Create repositories cache for a given organization\n *\n * @param org\n * @param context\n * @param accountProvider\n */\nclass OrganizationRepositories(\n    private val org: User,\n    private val context: Context,\n    private val accountProvider: Provider<Account>\n) : PersistableResource<Repository> {\n\n    override fun loadItems(database: Database): List<Repository> {\n        return database.repositoriesQueries.selectUserRepositories(\n            org.id()\n        ) { repoId, name, id, login, name_, avatarurl, private, fork, description, forks, watchers, language, hasIssues, mirrorUrl, permissions_admin, permissions_pull, permissions_push ->\n            val owner = User.builder()\n                .login(login)\n                .id(id)\n                .name(name_)\n                .avatarUrl(avatarurl)\n                .build()\n\n            val permissions = Permissions.builder()\n                .admin(permissions_admin)\n                .push(permissions_push)\n                .pull(permissions_pull)\n                .build()\n\n            Repository.builder()\n                .owner(owner)\n                .name(name)\n                .id(repoId)\n                .isPrivate(private)\n                .isFork(fork)\n                .description(description)\n                .forksCount(forks)\n                .watchersCount(watchers)\n                .language(language)\n                .hasIssues(hasIssues)\n                .mirrorUrl(mirrorUrl)\n                .permissions(permissions)\n                .build()\n        }.executeAsList()\n    }\n    private val isAuthenticatedUser: Boolean\n        get() = org.login() == accountProvider.get().name\n\n    override fun store(database: Database, repos: List<Repository>) {\n        database.repositoriesQueries.clearUserRepositories(org.id())\n\n        for (repo in repos) {\n            val owner = repo.owner()\n            database.repositoriesQueries.replaceRepo(\n                repo.id(),\n                repo.name(),\n                org.id(),\n                owner!!.id(),\n                repo.isPrivate,\n                repo.isFork,\n                repo.description(),\n                repo.forksCount(),\n                repo.watchersCount(),\n                repo.language(),\n                repo.hasIssues(),\n                repo.mirrorUrl(),\n                repo.permissions()!!.admin(),\n                repo.permissions()!!.pull(),\n                repo.permissions()!!.push()\n            )\n\n            database.organizationsQueries.replaceUser(\n                owner.id(),\n                owner.login(),\n                owner.name(),\n                owner.avatarUrl()\n            )\n        }\n    }\n\n    @Throws(IOException::class)\n    override fun request(): List<Repository> {\n        if (isAuthenticatedUser) {\n            val all = TreeSet<Repository> { repo1, repo2 ->\n                val id1 = repo1.id()!!\n                val id2 = repo2.id()!!\n                if (id1 > id2) {\n                    return@TreeSet 1\n                }\n                if (id1 < id2) {\n                    return@TreeSet -1\n                }\n                0\n            }\n\n            all.addAll(getAllItems { page ->\n                ServiceGenerator.createService(context, RepositoryService::class.java)\n                    .getUserRepositories(page.toLong())\n            })\n\n            all.addAll(getAllItems { page ->\n                ServiceGenerator.createService(context, WatchingService::class.java)\n                    .getWatchedRepositories(page.toLong())\n            })\n            return ArrayList(all)\n        } else {\n            return getAllItems { page ->\n                ServiceGenerator.createService(context, RepositoryService::class.java)\n                    .getOrganizationRepositories(org.login(), page.toLong())\n            }\n        }\n    }\n\n    private fun getAllItems(request: (Int) -> Single<Response<Page<Repository>>>): List<Repository> {\n        val repos = ArrayList<Repository>()\n        var current = 1\n        var last = -1\n\n        try {\n            while (current != last) {\n                val page = request(current).blockingGet().body()\n                repos.addAll(page!!.items())\n                last = if (page.last() != null) page.last()!! else -1\n                current = if (page.next() != null) page.next()!! else -1\n            }\n        } catch (e: RuntimeException) {\n            if (e.cause is InterruptedIOException) {\n                return repos\n            } else {\n                throw e\n            }\n        }\n\n        return repos\n    }\n\n    override fun toString(): String {\n        return javaClass.simpleName + '['.toString() + org.login() + ']'.toString()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/persistence/OrganizationRepositoriesFactory.java",
    "content": "package com.github.pockethub.android.persistence;\n\nimport android.accounts.Account;\nimport android.content.Context;\nimport com.meisolsson.githubsdk.model.User;\n\nimport javax.inject.Inject;\nimport javax.inject.Provider;\n\npublic class OrganizationRepositoriesFactory {\n\n    @Inject\n    protected Context context;\n\n    @Inject\n    protected Provider<Account> accountProvider;\n\n    @Inject\n    public OrganizationRepositoriesFactory() {\n\n    }\n\n    public OrganizationRepositories create(User org) {\n        return new OrganizationRepositories(org, context, accountProvider);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/persistence/Organizations.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.persistence\n\nimport android.content.Context\nimport com.github.pockethub.android.Database\nimport com.meisolsson.githubsdk.core.ServiceGenerator\nimport com.meisolsson.githubsdk.model.User\nimport com.meisolsson.githubsdk.service.organizations.OrganizationService\nimport com.meisolsson.githubsdk.service.users.UserService\nimport java.io.IOException\nimport java.util.ArrayList\nimport javax.inject.Inject\n\n/**\n * Cache of organization under an account\n */\nclass Organizations\n/**\n * Create organizations cache with services to load from\n *\n * @param context\n */\n@Inject\nconstructor(private val context: Context) : PersistableResource<User> {\n\n    private val allOrgs: MutableList<User>\n        get() {\n            val repos = ArrayList<User>()\n            var current = 1\n            var last = -1\n\n            while (current != last) {\n                val page = ServiceGenerator.createService(context, OrganizationService::class.java)\n                    .getMyOrganizations(current.toLong())\n                    .blockingGet()\n                    .body()\n\n                repos.addAll(page!!.items())\n                last = if (page.last() != null) page.last()!! else -1\n                current = if (page.next() != null) page.next()!! else -1\n            }\n\n            return repos\n        }\n\n    override fun loadItems(database: Database): List<User> {\n        return database.organizationsQueries\n            .selectUserAndOrgs { id, login, name, avatarUrl -> User.builder().id(id).login(login).name(name).avatarUrl(avatarUrl).build() }\n            .executeAsList()\n    }\n\n\n    override fun store(db: Database, orgs: List<User>) {\n        db.organizationsQueries.clearOrgs()\n\n        for (user in orgs) {\n            db.organizationsQueries.insertOrg(user.id())\n\n            db.organizationsQueries.replaceUser(\n                user.id(),\n                user.login(),\n                user.name(),\n                user.avatarUrl()\n            )\n        }\n    }\n\n    @Throws(IOException::class)\n    override fun request(): List<User> {\n        val user = ServiceGenerator.createService(context, UserService::class.java).user\n            .blockingGet()\n            .body()\n\n        return allOrgs + user!!\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/persistence/PersistableResource.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.persistence;\n\nimport com.github.pockethub.android.Database;\n\nimport java.io.IOException;\nimport java.util.List;\n\n/**\n * Describes how to store, load or request-an-update-for a particular set of\n * data.\n *\n * @param <E>\n *            type of item\n */\npublic interface PersistableResource<E> {\n\n    /**\n     * Load items from the database\n     *\n     * @param database\n     * @return Item from the database\n     */\n    List<E> loadItems(Database database);\n\n    /**\n     * Store supplied items in DB, removing or updating prior entries\n     *\n     * @param database\n     * @param items\n     */\n    void store(Database database, List<E> items);\n\n    /**\n     * Request the data directly from the GitHub API, rather than attempting to\n     * load it from the DB cache.\n     *\n     * @return list of items\n     * @throws IOException\n     */\n    List<E> request() throws IOException;\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/rx/AutoDisposeUtils.java",
    "content": "package com.github.pockethub.android.rx;\n\nimport androidx.lifecycle.Lifecycle;\nimport androidx.lifecycle.LifecycleOwner;\n\nimport com.uber.autodispose.AutoDispose;\nimport com.uber.autodispose.AutoDisposeConverter;\nimport com.uber.autodispose.android.lifecycle.AndroidLifecycleScopeProvider;\n\npublic class AutoDisposeUtils {\n\n    public static <T> AutoDisposeConverter<T> bindToLifecycle(LifecycleOwner lifecycleOwner) {\n        return bindToLifecycle(lifecycleOwner.getLifecycle());\n    }\n\n    public static <T> AutoDisposeConverter<T> bindToLifecycle(Lifecycle lifecycle) {\n        return AutoDispose.autoDisposable(AndroidLifecycleScopeProvider.from(lifecycle));\n    }\n\n    public static <T> AutoDisposeConverter<T> bindToLifecycle(LifecycleOwner lifecycleOwner,\n                                                          Lifecycle.Event untilEvent) {\n        return bindToLifecycle(lifecycleOwner.getLifecycle(), untilEvent);\n    }\n\n    public static <T> AutoDisposeConverter<T> bindToLifecycle(Lifecycle lifecycle,\n                                                          Lifecycle.Event event) {\n\n        return AutoDispose.autoDisposable(AndroidLifecycleScopeProvider.from(lifecycle, event));\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/rx/RxProgress.java",
    "content": "package com.github.pockethub.android.rx;\n\nimport android.content.Context;\nimport androidx.annotation.StringRes;\n\nimport com.afollestad.materialdialogs.MaterialDialog;\n\nimport io.reactivex.SingleTransformer;\n\npublic final class RxProgress {\n\n    private RxProgress() {\n        throw new AssertionError(\"No instances.\");\n    }\n\n    public static <U> SingleTransformer<U, U> bindToLifecycle(Context context, @StringRes int stringRes) {\n        return bindToLifecycle(context, context.getString(stringRes));\n    }\n\n    public static <U> SingleTransformer<U, U> bindToLifecycle(Context context, CharSequence message) {\n        return upstream -> {\n            final MaterialDialog progressDialog = new MaterialDialog.Builder(context)\n                    .content(message)\n                    .progress(true, 0)\n                    .build();\n\n            return upstream\n                    .doOnSubscribe(disposable -> progressDialog.show())\n                    .doOnSuccess(u -> progressDialog.dismiss())\n                    .doOnError(throwable -> progressDialog.dismiss());\n        };\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/sync/ContentProviderAdapter.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.sync;\n\nimport android.content.ContentProvider;\nimport android.content.ContentValues;\nimport android.database.Cursor;\nimport android.net.Uri;\n\n/**\n * Content provider adapter that does nothing\n */\npublic class ContentProviderAdapter extends ContentProvider {\n\n    @Override\n    public int delete(Uri uri, String selection, String[] selectionArgs) {\n        return 0;\n    }\n\n    @Override\n    public String getType(Uri uri) {\n        return null;\n    }\n\n    @Override\n    public Uri insert(Uri uri, ContentValues values) {\n        return null;\n    }\n\n    @Override\n    public boolean onCreate() {\n        return true;\n    }\n\n    @Override\n    public Cursor query(Uri uri, String[] projection, String selection,\n            String[] selectionArgs, String sortOrder) {\n        return null;\n    }\n\n    @Override\n    public int update(Uri uri, ContentValues values, String selection,\n            String[] selectionArgs) {\n        return 0;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/sync/SyncAdapter.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.sync;\n\nimport android.accounts.Account;\nimport android.content.AbstractThreadedSyncAdapter;\nimport android.content.ContentProviderClient;\nimport android.content.Context;\nimport android.content.SyncResult;\nimport android.os.Bundle;\n\nimport javax.inject.Inject;\nimport javax.inject.Singleton;\n\n/**\n * Sync adapter\n */\n@Singleton\npublic class SyncAdapter extends AbstractThreadedSyncAdapter {\n\n    @Inject\n    protected SyncCampaignFactory campaignFactory;\n\n    private SyncCampaign campaign = null;\n\n    /**\n     * Create sync adapter for context\n     *\n     * @param context\n     */\n    @Inject\n    public SyncAdapter(final Context context) {\n        super(context, true);\n    }\n\n    @Override\n    public void onPerformSync(final Account account, final Bundle extras,\n            final String authority, final ContentProviderClient provider,\n            final SyncResult syncResult) {\n        cancelCampaign();\n        campaign = campaignFactory.create(syncResult);\n        campaign.run();\n    }\n\n    @Override\n    public void onSyncCanceled() {\n        cancelCampaign();\n    }\n\n    private void cancelCampaign() {\n        if (campaign != null) {\n            campaign.cancel();\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/sync/SyncAdapterService.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.sync;\n\nimport android.content.Intent;\nimport android.os.IBinder;\n\nimport javax.inject.Inject;\nimport javax.inject.Provider;\n\nimport dagger.android.DaggerService;\n\n/**\n * Sync adapter service\n */\npublic class SyncAdapterService extends DaggerService {\n\n    @Inject\n    protected Provider<SyncAdapter> syncAdapterProvider;\n\n    @Override\n    public IBinder onBind(Intent intent) {\n        return syncAdapterProvider.get().getSyncAdapterBinder();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/sync/SyncCampaign.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.sync;\n\nimport android.content.SyncResult;\nimport android.database.SQLException;\nimport android.util.Log;\nimport com.github.pockethub.android.persistence.DatabaseCache;\nimport com.github.pockethub.android.persistence.OrganizationRepositoriesFactory;\nimport com.github.pockethub.android.persistence.Organizations;\nimport com.google.auto.factory.AutoFactory;\nimport com.google.auto.factory.Provided;\nimport com.meisolsson.githubsdk.model.User;\n\nimport java.util.List;\n\n/**\n * A cancelable sync operation to synchronize data for a given account\n */\n@AutoFactory\npublic class SyncCampaign implements Runnable {\n\n    private static final String TAG = \"SyncCampaign\";\n\n    protected DatabaseCache cache;\n\n    protected OrganizationRepositoriesFactory repos;\n\n    protected Organizations persistedOrgs;\n\n    private final SyncResult syncResult;\n\n    private boolean cancelled = false;\n\n    /**\n     * Create campaign for result\n     *\n     * @param syncResult\n     */\n    public SyncCampaign(@Provided DatabaseCache cache,\n                        @Provided OrganizationRepositoriesFactory repos,\n                        @Provided Organizations persistedOrgs,\n                        SyncResult syncResult) {\n        this.cache = cache;\n        this.repos = repos;\n        this.persistedOrgs = persistedOrgs;\n        this.syncResult = syncResult;\n    }\n\n    @Override\n    public void run() {\n        List<User> orgs;\n        try {\n            orgs = cache.requestAndStore(persistedOrgs);\n            syncResult.stats.numUpdates++;\n        } catch (SQLException e) {\n            syncResult.stats.numIoExceptions++;\n            Log.d(TAG, \"Exception requesting users and orgs\", e);\n            return;\n        }\n\n        Log.d(TAG, \"Syncing \" + orgs.size() + \" users and orgs\");\n        for (User org : orgs) {\n            if (cancelled) {\n                return;\n            }\n\n            Log.d(TAG, \"Syncing repos for \" + org.login());\n            try {\n                cache.requestAndStore(repos.create(org));\n                syncResult.stats.numUpdates++;\n            } catch (SQLException e) {\n                syncResult.stats.numIoExceptions++;\n                Log.d(TAG, \"Exception requesting repositories\", e);\n            }\n        }\n\n        Log.d(TAG, \"Sync campaign finished\");\n    }\n\n    /**\n     * Cancel campaign\n     */\n    public void cancel() {\n        cancelled = true;\n        Log.d(TAG, \"Cancelled\");\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/ConfirmDialogFragment.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui;\n\nimport android.app.Dialog;\nimport android.content.DialogInterface;\nimport android.content.DialogInterface.OnClickListener;\nimport android.os.Bundle;\nimport androidx.annotation.NonNull;\nimport androidx.fragment.app.FragmentActivity;\n\nimport com.afollestad.materialdialogs.MaterialDialog;\nimport com.github.pockethub.android.ui.base.DialogFragmentHelper;\n\nimport static android.app.Activity.RESULT_CANCELED;\nimport static android.app.Activity.RESULT_OK;\nimport static android.content.DialogInterface.BUTTON_NEGATIVE;\nimport static android.content.DialogInterface.BUTTON_POSITIVE;\n\n/**\n * Helper to display a confirmation dialog\n */\npublic class ConfirmDialogFragment extends DialogFragmentHelper implements\n        OnClickListener {\n\n    private static final String TAG = \"confirm_dialog\";\n\n    /**\n     * Confirm message and deliver callback to given activity\n     *\n     * @param activity\n     * @param requestCode\n     * @param title\n     * @param message\n     */\n    public static void show(final FragmentActivity activity,\n            final int requestCode, final String title, final String message) {\n        show(activity, requestCode, title, message, null);\n    }\n\n    /**\n     * Confirm message and deliver callback to given activity\n     *\n     * @param activity\n     * @param requestCode\n     * @param title\n     * @param message\n     * @param bundle\n     */\n    public static void show(final FragmentActivity activity,\n            final int requestCode, final String title, final String message,\n            final Bundle bundle) {\n        Bundle arguments = createArguments(title, message, requestCode);\n        if (bundle != null) {\n            arguments.putAll(bundle);\n        }\n        show(activity, new ConfirmDialogFragment(), arguments, TAG);\n    }\n\n    @Override\n    @NonNull\n    public Dialog onCreateDialog(final Bundle savedInstanceState) {\n        return new MaterialDialog.Builder(getActivity())\n                .title(getTitle())\n                .content(getMessage())\n                .positiveText(android.R.string.ok)\n                .negativeText(android.R.string.no)\n                .onPositive((dialog, which) -> onClick(dialog, BUTTON_POSITIVE))\n                .onNegative((dialog, which) -> onClick(dialog, BUTTON_NEGATIVE))\n                .cancelable(true)\n                .cancelListener(this)\n                .build();\n    }\n\n    @Override\n    public void onClick(DialogInterface dialog, int which) {\n        dialog.dismiss();\n        switch (which) {\n        case BUTTON_POSITIVE:\n            onResult(RESULT_OK);\n            break;\n        case BUTTON_NEGATIVE:\n            onResult(RESULT_CANCELED);\n            break;\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/DialogResultListener.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui;\n\nimport android.app.Activity;\nimport android.os.Bundle;\n\n/**\n * Listener that dialogs results are delivered too\n */\npublic interface DialogResultListener {\n\n    /**\n     * Callback for a dialog finishing and delivering a result\n     *\n     * @param requestCode\n     * @param resultCode\n     *            result such as {@link Activity#RESULT_CANCELED} or\n     *            {@link Activity#RESULT_OK}\n     * @param arguments\n     */\n    void onDialogResult(int requestCode, int resultCode, Bundle arguments);\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/FragmentProvider.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui;\n\nimport androidx.fragment.app.Fragment;\n\n/**\n * Provides a fragment\n */\npublic interface FragmentProvider {\n\n    /**\n     * Get selected fragment\n     *\n     * @return fragment\n     */\n    Fragment getSelected();\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/MainActivity.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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\npackage com.github.pockethub.android.ui\n\nimport android.accounts.AccountManager\nimport android.app.SearchManager\nimport android.content.Context\nimport android.content.Intent\nimport android.content.res.Configuration\nimport android.os.Build\nimport android.os.Bundle\nimport android.preference.PreferenceManager\nimport android.util.Log\nimport android.view.Menu\nimport android.view.MenuItem\nimport android.view.View\nimport android.webkit.CookieManager\nimport android.widget.ImageView\nimport android.widget.TextView\nimport androidx.annotation.NonNull\nimport androidx.annotation.VisibleForTesting\nimport androidx.appcompat.app.ActionBarDrawerToggle\nimport androidx.appcompat.widget.SearchView\nimport androidx.core.content.edit\nimport androidx.core.view.GravityCompat\nimport androidx.fragment.app.Fragment\nimport com.github.pockethub.android.Database\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.accounts.AccountUtils\nimport com.github.pockethub.android.accounts.AccountsHelper\nimport com.github.pockethub.android.accounts.LoginActivity\nimport com.github.pockethub.android.core.user.UserComparator\nimport com.github.pockethub.android.persistence.AccountDataManager\nimport com.github.pockethub.android.rx.AutoDisposeUtils\nimport com.github.pockethub.android.ui.base.BaseActivity\nimport com.github.pockethub.android.ui.gist.GistsPagerFragment\nimport com.github.pockethub.android.ui.issue.FilterListFragment\nimport com.github.pockethub.android.ui.issue.IssueDashboardPagerFragment\nimport com.github.pockethub.android.ui.notification.NotificationActivity\nimport com.github.pockethub.android.ui.user.HomePagerFragment\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.github.pockethub.android.util.ToastUtils\nimport com.google.android.material.navigation.NavigationView\nimport com.meisolsson.githubsdk.core.TokenStore\nimport com.meisolsson.githubsdk.model.User\nimport io.reactivex.Single\nimport io.reactivex.android.schedulers.AndroidSchedulers\nimport io.reactivex.schedulers.Schedulers\nimport kotlinx.android.synthetic.main.activity_main.*\nimport java.util.Collections\nimport javax.inject.Inject\nimport javax.inject.Provider\nimport javax.inject.Singleton\n\n// TODO: Have another think about MVI\n// TODO: Figure out good way to inject github-sdk services dynamically with Dagger. If possible\nclass MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedListener {\n\n    @Inject\n    lateinit var accountDataManager: AccountDataManager\n\n    @Inject\n    lateinit var database: Database\n\n    @Inject\n    lateinit var userComparatorProvider: Provider<UserComparator>\n\n    @Inject\n    @Singleton\n    lateinit var avatars: AvatarLoader\n\n    private var orgs: List<User> = emptyList()\n\n    private var org: User? = null\n\n    private var userLearnedDrawer: Boolean = false\n    private lateinit var actionBarDrawerToggle: ActionBarDrawerToggle\n\n    @VisibleForTesting\n    var currentFragment: Fragment? = null\n\n    private var menuItemOrganizationMap: MutableMap<MenuItem, User> = HashMap()\n\n    private val accountManager: AccountManager\n        get() = AccountManager.get(this)\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_main)\n\n        val sp = PreferenceManager.getDefaultSharedPreferences(this)\n        userLearnedDrawer = sp.getBoolean(PREF_USER_LEARNED_DRAWER, false)\n\n        supportActionBar?.setDisplayHomeAsUpEnabled(true)\n\n        actionBarDrawerToggle = object : ActionBarDrawerToggle(\n            this,\n            drawer_layout,\n            toolbar,\n            R.string.navigation_drawer_open,\n            R.string.navigation_drawer_close\n        ) {\n            override fun onDrawerOpened(drawerView: View) {\n                super.onDrawerOpened(drawerView)\n\n                if (!userLearnedDrawer) {\n                    sp.edit {\n                        putBoolean(PREF_USER_LEARNED_DRAWER, true)\n                    }\n                    userLearnedDrawer = true\n                    Log.d(TAG, \"User learned drawer\")\n                }\n            }\n        }\n\n        drawer_layout.addDrawerListener(actionBarDrawerToggle)\n        navigation_view.setNavigationItemSelectedListener(this)\n\n        reloadOrgs()\n\n        val tokenStore = TokenStore.getInstance(this)\n\n        if (tokenStore.token == null) {\n            val accounts = accountManager.getAccountsByType(getString(R.string.account_type))\n            if (accounts.isNotEmpty()) {\n                val account = accounts[0]\n                AccountsHelper.getUserToken(this, account)\n                tokenStore.saveToken(AccountsHelper.getUserToken(this, account))\n            }\n        }\n    }\n\n    override fun onDestroy() {\n        super.onDestroy()\n        drawer_layout.removeDrawerListener(actionBarDrawerToggle)\n    }\n\n    override fun onConfigurationChanged(newConfig: Configuration) {\n        super.onConfigurationChanged(newConfig)\n        actionBarDrawerToggle.onConfigurationChanged(newConfig)\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        return if (actionBarDrawerToggle.onOptionsItemSelected(item)) {\n            true\n        } else super.onOptionsItemSelected(item)\n    }\n\n    override fun onPostCreate(savedInstanceState: Bundle?) {\n        super.onPostCreate(savedInstanceState)\n        actionBarDrawerToggle.syncState()\n    }\n\n    private fun reloadOrgs() {\n        Single.fromCallable { AccountUtils.getAccount(accountManager, this) }\n            .map { account -> accountDataManager.getOrgs(true) }\n            .map { orgs ->\n                Collections.sort(orgs, userComparatorProvider.get())\n                orgs\n            }\n            .subscribeOn(Schedulers.io())\n            .observeOn(AndroidSchedulers.mainThread())\n            .`as`(AutoDisposeUtils.bindToLifecycle(this))\n            .subscribe({ this.onOrgsLoaded(it) },\n                { e ->\n                    Log.e(TAG, \"Exception loading organizations\", e)\n                    ToastUtils.show(this, R.string.error_orgs_load)\n                })\n    }\n\n    @VisibleForTesting\n    fun onOrgsLoaded(orgs: List<User>) {\n        if (orgs.isEmpty()) {\n            return\n        }\n\n        org = orgs[0]\n        this.orgs = orgs\n\n        val accounts = accountManager.getAccountsByType(getString(R.string.account_type))\n        val account = accounts[0]\n        LoginActivity.configureSyncFor(account)\n        if (org!!.login() != AccountUtils.getLogin(this)) {\n            AccountUtils.renameAccount(org!!.login(), account, accountManager, this)\n        }\n\n        setUpNavigationView()\n\n        val window = window ?: return\n        val view = window.decorView ?: return\n\n        view.post {\n            switchFragment(HomePagerFragment(), org)\n            if (!userLearnedDrawer) {\n                drawer_layout.openDrawer(GravityCompat.START)\n            }\n        }\n    }\n\n    override fun onCreateOptionsMenu(optionMenu: Menu): Boolean {\n        menuInflater.inflate(R.menu.activity_main, optionMenu)\n\n        val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager\n        val searchItem = optionMenu.findItem(R.id.m_search)\n        val searchView = searchItem.actionView as SearchView\n        searchView.setSearchableInfo(searchManager.getSearchableInfo(componentName))\n\n        return super.onCreateOptionsMenu(optionMenu)\n    }\n\n    override fun onResume() {\n        super.onResume()\n\n        // Restart loader if default account doesn't match currently loaded\n        // account\n        val currentOrgs = orgs\n        if (currentOrgs.isNotEmpty()\n            && !AccountUtils.isUser(this, currentOrgs[0])) {\n            reloadOrgs()\n        }\n    }\n\n    private fun setUpHeaderView() {\n        val userImage: ImageView\n        val userRealName: TextView\n        val userName: TextView\n\n        val headerView = navigation_view.getHeaderView(0)\n        userImage = headerView.findViewById(R.id.user_picture)\n        val notificationIcon = headerView.findViewById<ImageView>(R.id.iv_notification)\n        userRealName = headerView.findViewById(R.id.user_real_name)\n        userName = headerView.findViewById(R.id.user_name)\n\n        notificationIcon.setOnClickListener { v ->\n            startActivity(Intent(this@MainActivity, NotificationActivity::class.java))\n        }\n\n        avatars.bind(userImage, org)\n        userName.text = org!!.login()\n\n        val name = org!!.name()\n        if (name != null) {\n            userRealName.text = org!!.name()\n        } else {\n            userRealName.visibility = View.GONE\n        }\n    }\n\n    private fun setUpNavigationView() {\n        setUpHeaderView()\n        setUpNavigationMenu()\n    }\n\n    private fun setUpNavigationMenu() {\n        val organizationContainer = navigation_view.menu.findItem(R.id.navigation_organizations)\n        if (organizationContainer.hasSubMenu()) {\n            val organizationsMenu = organizationContainer.subMenu\n            for (i in 1 until orgs.size) {\n                val organization = orgs[i]\n                if (organizationsMenu.findItem(organization.id()!!.toInt()) == null) {\n                    val title = organization.name() ?: organization.login()\n                    val organizationMenuItem = organizationsMenu.add(\n                        Menu.NONE,\n                        organization.id()!!.toInt(),\n                        Menu.NONE,\n                        title\n                    )\n\n                    organizationMenuItem.setIcon(R.drawable.ic_github_organization_black_24dp)\n                    //Because of tinting the real image would became a grey block\n                    //avatars.bind(organizationMenuItem, organization);\n                    menuItemOrganizationMap[organizationMenuItem] = organization\n                }\n            }\n        } else {\n            throw IllegalStateException(\"Menu item $organizationContainer should have a submenu\")\n        }\n    }\n\n    override fun onNavigationItemSelected(@NonNull menuItem: MenuItem): Boolean {\n        val itemId = menuItem.itemId\n\n        when {\n            itemId == R.id.navigation_home -> {\n                switchFragment(HomePagerFragment(), org)\n                supportActionBar!!.setTitle(R.string.app_name)\n                return true\n            }\n            itemId == R.id.navigation_gists -> {\n                switchFragment(GistsPagerFragment(), null)\n                supportActionBar!!.title = menuItem.title\n                return true\n            }\n            itemId == R.id.navigation_issue_dashboard -> {\n                switchFragment(IssueDashboardPagerFragment(), null)\n                supportActionBar!!.title = menuItem.title\n                return true\n            }\n            itemId == R.id.navigation_bookmarks -> {\n                switchFragment(FilterListFragment(), null)\n                supportActionBar!!.title = menuItem.title\n                return true\n            }\n            itemId == R.id.navigation_log_out -> {\n                logout()\n                return false\n            }\n            menuItemOrganizationMap.containsKey(menuItem) -> {\n                switchFragment(HomePagerFragment(), menuItemOrganizationMap[menuItem])\n                navigation_view.menu.findItem(R.id.navigation_home).isChecked = true\n                return false\n            }\n            else -> throw IllegalStateException(\"MenuItem $menuItem not known\")\n        }\n    }\n\n    private fun logout() {\n        // Remove cookies so that the login is clean\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {\n            CookieManager.getInstance().removeAllCookies(null)\n        } else {\n            CookieManager.getInstance().removeAllCookie()\n        }\n\n        // Clear all of the cached data\n        database.repositoriesQueries.clearRepositories()\n        database.organizationsQueries.clearOrgs()\n        database.organizationsQueries.clearUsers()\n\n        // Remove the account\n        val accountManager = accountManager\n        val accountType = getString(R.string.account_type)\n        val allGitHubAccounts = accountManager.getAccountsByType(accountType)\n\n        for (account in allGitHubAccounts) {\n            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {\n                accountManager.removeAccountExplicitly(account)\n                startLoginActivity()\n            } else {\n                accountManager.removeAccount(account, { bundle -> startLoginActivity() }, null)\n            }\n        }\n    }\n\n    private fun startLoginActivity() {\n        val `in` = Intent(this, LoginActivity::class.java)\n        `in`.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)\n        startActivity(`in`)\n        finish()\n    }\n\n    private fun switchFragment(fragment: Fragment, organization: User?) {\n        if (organization != null) {\n            val args = Bundle()\n            args.putParcelable(\"org\", organization)\n            fragment.arguments = args\n        }\n        val manager = supportFragmentManager\n        manager.beginTransaction().replace(R.id.container, fragment).commit()\n        drawer_layout.closeDrawer(GravityCompat.START)\n\n        currentFragment = fragment\n    }\n\n    companion object {\n\n        private val TAG = \"MainActivity\"\n        private val PREF_USER_LEARNED_DRAWER = \"navigation_drawer_learned\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/NewsFragment.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui\n\nimport android.content.Intent\nimport android.content.Intent.ACTION_VIEW\nimport android.content.Intent.CATEGORY_BROWSABLE\nimport android.net.Uri\nimport android.os.Bundle\nimport android.text.TextUtils\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.core.gist.GistEventMatcher\nimport com.github.pockethub.android.core.issue.IssueEventMatcher\nimport com.github.pockethub.android.core.repo.RepositoryEventMatcher\nimport com.github.pockethub.android.core.user.UserEventMatcher\nimport com.github.pockethub.android.core.user.UserEventMatcher.UserPair\nimport com.github.pockethub.android.ui.base.BaseFragment\nimport com.github.pockethub.android.ui.commit.CommitCompareViewActivity\nimport com.github.pockethub.android.ui.commit.CommitViewActivity\nimport com.github.pockethub.android.ui.gist.GistsViewActivity\nimport com.github.pockethub.android.ui.helpers.ItemListHandler\nimport com.github.pockethub.android.ui.helpers.PagedListFetcher\nimport com.github.pockethub.android.ui.helpers.PagedScrollListener\nimport com.github.pockethub.android.ui.issue.IssuesViewActivity\nimport com.github.pockethub.android.ui.item.news.NewsItem\nimport com.github.pockethub.android.ui.repo.RepositoryViewActivity\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.github.pockethub.android.util.ConvertUtils\nimport com.github.pockethub.android.util.InfoUtils\nimport com.github.pockethub.android.util.ToastUtils\nimport com.meisolsson.githubsdk.model.GitHubEvent\nimport com.meisolsson.githubsdk.model.GitHubEventType.CommitCommentEvent\nimport com.meisolsson.githubsdk.model.GitHubEventType.DownloadEvent\nimport com.meisolsson.githubsdk.model.GitHubEventType.PushEvent\nimport com.meisolsson.githubsdk.model.Issue\nimport com.meisolsson.githubsdk.model.Page\nimport com.meisolsson.githubsdk.model.Repository\nimport com.meisolsson.githubsdk.model.User\nimport com.meisolsson.githubsdk.model.payload.CommitCommentPayload\nimport com.meisolsson.githubsdk.model.payload.PushPayload\nimport com.meisolsson.githubsdk.model.payload.ReleasePayload\nimport com.xwray.groupie.Item\nimport com.xwray.groupie.OnItemClickListener\nimport io.reactivex.Single\nimport kotlinx.android.synthetic.main.fragment_item_list.view.*\nimport retrofit2.Response\nimport javax.inject.Inject\n\n/**\n * Base news fragment class with utilities for subclasses to built on\n */\nabstract class NewsFragment : BaseFragment() {\n\n    @Inject\n    protected lateinit var avatars: AvatarLoader\n\n    protected lateinit var pagedListFetcher: PagedListFetcher<GitHubEvent>\n\n    private lateinit var itemListHandler: ItemListHandler\n\n    protected val errorMessage: Int\n        get() = R.string.error_news_load\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? {\n        return inflater.inflate(R.layout.fragment_item_list, container, false)\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        itemListHandler = ItemListHandler(\n            view.list,\n            view.empty,\n            lifecycle,\n            activity,\n            OnItemClickListener(this::onItemClick)\n        )\n\n        pagedListFetcher = PagedListFetcher(\n            view.swipe_item,\n            lifecycle,\n            itemListHandler,\n            { t -> ToastUtils.show(activity, errorMessage) },\n            this::loadData,\n            this::createItem\n        )\n\n        view.list.addOnScrollListener(\n            PagedScrollListener(itemListHandler.mainSection, pagedListFetcher)\n        )\n        itemListHandler.setEmptyText(R.string.no_news)\n    }\n\n    protected abstract fun loadData(page: Int): Single<Response<Page<GitHubEvent>>>\n\n    fun onItemClick(item: Item<*>, view: View) {\n        if (item !is NewsItem) {\n            return\n        }\n\n        val event = item.gitHubEvent\n\n        if (DownloadEvent == event.type()) {\n            openDownload(event)\n            return\n        }\n\n        if (PushEvent == event.type()) {\n            openPush(event)\n            return\n        }\n\n        if (CommitCommentEvent == event.type()) {\n            openCommitComment(event)\n            return\n        }\n\n        val issue = IssueEventMatcher.getIssue(event)\n        if (issue != null) {\n            val repo = ConvertUtils.eventRepoToRepo(event.repo()!!)\n            viewIssue(issue, repo)\n            return\n        }\n\n        val gist = GistEventMatcher.getGist(event)\n        if (gist != null) {\n            startActivity(GistsViewActivity.createIntent(gist))\n            return\n        }\n\n        val repo = RepositoryEventMatcher.getRepository(event)\n        if (repo != null) {\n            viewRepository(repo)\n        }\n\n        val users = UserEventMatcher.getUsers(event)\n        if (users != null) {\n            viewUser(users)\n        }\n    }\n\n    // https://developer.github.com/v3/repos/downloads/#downloads-api-is-deprecated\n    private fun openDownload(event: GitHubEvent) {\n        val release = (event.payload() as ReleasePayload).release() ?: return\n\n        val url = release.htmlUrl()\n        if (TextUtils.isEmpty(url)) {\n            return\n        }\n\n        val intent = Intent(ACTION_VIEW, Uri.parse(url))\n        intent.addCategory(CATEGORY_BROWSABLE)\n        startActivity(intent)\n    }\n\n    private fun openCommitComment(event: GitHubEvent) {\n        var repo: Repository? = ConvertUtils.eventRepoToRepo(event.repo()!!) ?: return\n\n        if (repo!!.name()!!.contains(\"/\")) {\n            val repoId = repo.name()!!\n                .split(\"/\".toRegex())\n                .dropLastWhile { it.isEmpty() }\n                .toTypedArray()\n            repo = InfoUtils.createRepoFromData(repoId[0], repoId[1])\n        }\n\n\n\n        val payload = event.payload() as CommitCommentPayload? ?: return\n        val comment = payload.comment() ?: return\n\n        val sha = comment.commitId()\n        if (!TextUtils.isEmpty(sha)) {\n            startActivity(CommitViewActivity.createIntent(repo!!, sha!!))\n        }\n    }\n\n    private fun openPush(event: GitHubEvent) {\n        val repo = ConvertUtils.eventRepoToRepo(event.repo()!!) ?: return\n\n        val payload = event.payload() as PushPayload? ?: return\n        val commits = payload.commits()\n        if (commits.isEmpty()) {\n            return\n        }\n\n        if (commits.size > 1) {\n            val base = payload.before()\n            val head = payload.head()\n            if (!TextUtils.isEmpty(base) && !TextUtils.isEmpty(head)) {\n                startActivity(CommitCompareViewActivity.createIntent(repo, base, head))\n            }\n        } else {\n            val commit = commits[0]\n            val sha = commit?.sha()\n            if (!TextUtils.isEmpty(sha)) {\n                startActivity(CommitViewActivity.createIntent(repo, sha!!))\n            }\n        }\n    }\n\n    /**\n     * Start an activity to view the given repository\n     *\n     * @param repository\n     */\n    protected open fun viewRepository(repository: Repository?) {\n        startActivity(RepositoryViewActivity.createIntent(repository!!))\n    }\n\n    /**\n     * Start an activity to view the given [UserPair]\n     *\n     *\n     * This method does nothing by default, subclasses should override\n     *\n     * @param users\n     */\n    protected open fun viewUser(users: UserPair) {}\n\n    /**\n     * Start an activity to view the given [User]\n     *\n     * @param user\n     * @return true if new activity started, false otherwise\n     */\n    protected open fun viewUser(user: User?): Boolean {\n        return false\n    }\n\n    /**\n     * Start an activity to view the given [Issue]\n     *\n     * @param issue\n     * @param repository\n     */\n    protected open fun viewIssue(issue: Issue, repository: Repository?) {\n        if (repository != null) {\n            startActivity(IssuesViewActivity.createIntent(issue, repository))\n        } else {\n            startActivity(IssuesViewActivity.createIntent(issue))\n        }\n    }\n\n    protected fun createItem(item: GitHubEvent): Item<*> {\n        return NewsItem.createNewsItem(avatars, item)!!\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/SingleChoiceDialogFragment.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui;\n\nimport android.os.Bundle;\nimport android.os.Parcelable;\nimport androidx.annotation.NonNull;\nimport android.view.View;\n\nimport com.github.pockethub.android.ui.base.BaseActivity;\nimport com.github.pockethub.android.ui.base.DialogFragmentHelper;\nimport com.xwray.groupie.Item;\nimport com.xwray.groupie.OnItemClickListener;\n\nimport java.util.ArrayList;\n\n/**\n * Helper to display a single choice dialog\n */\npublic class SingleChoiceDialogFragment extends DialogFragmentHelper\n        implements OnItemClickListener {\n\n    /**\n     * Arguments key for the selected item\n     */\n    public static final String ARG_SELECTED = \"selected\";\n\n    /**\n     * Choices arguments\n     */\n    protected static final String ARG_CHOICES = \"choices\";\n\n    /**\n     * Selected choice argument\n     */\n    protected static final String ARG_SELECTED_CHOICE = \"selectedChoice\";\n\n    /**\n     * Tag\n     */\n    protected static final String TAG = \"single_choice_dialog\";\n\n    /**\n     * Confirm message and deliver callback to given activity\n     *\n     * @param activity\n     * @param requestCode\n     * @param title\n     * @param message\n     * @param choices\n     * @param selectedChoice\n     * @param helper\n     */\n    protected static void show(final BaseActivity activity,\n            final int requestCode, final String title, final String message,\n            ArrayList<? extends Parcelable> choices, final int selectedChoice,\n            final DialogFragmentHelper helper) {\n        Bundle arguments = createArguments(title, message, requestCode);\n        arguments.putParcelableArrayList(ARG_CHOICES, choices);\n        arguments.putInt(ARG_SELECTED_CHOICE, selectedChoice);\n        show(activity, helper, arguments, TAG);\n    }\n\n    @Override\n    public void onItemClick(@NonNull Item item, @NonNull View view) {\n        dismiss();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/TextWatcherAdapter.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui;\n\nimport android.text.Editable;\nimport android.text.TextWatcher;\n\n/**\n * Adapter for {@link TextWatcher} interface\n */\npublic class TextWatcherAdapter implements TextWatcher {\n\n    @Override\n    public void afterTextChanged(Editable s) {\n    }\n\n    @Override\n    public void beforeTextChanged(CharSequence s, int start, int count,\n            int after) {\n    }\n\n    @Override\n    public void onTextChanged(CharSequence s, int start, int before, int count) {\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/ViewPager.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui;\n\nimport android.content.Context;\nimport android.util.AttributeSet;\nimport android.view.View;\n\n/**\n * {@link ViewPager} extension with support for horizontally scrolling an\n * embedded {@link WebView}\n */\npublic class ViewPager extends androidx.viewpager.widget.ViewPager {\n\n    /**\n     * @param context\n     */\n    public ViewPager(final Context context) {\n        super(context);\n    }\n\n    /**\n     * @param context\n     * @param attrs\n     */\n    public ViewPager(final Context context, final AttributeSet attrs) {\n        super(context, attrs);\n    }\n\n    /**\n     * Set current item and return whether the item changed\n     * <p>\n     * This method does not call {@link #setCurrentItem(int)} unless the item\n     * parameter differs from the current item\n     *\n     * @param item\n     * @return true if set, false if same\n     */\n    public boolean setItem(final int item) {\n        final boolean changed = item != getCurrentItem();\n        if (changed) {\n            setCurrentItem(item, false);\n        }\n        return changed;\n    }\n\n    /**\n     * Set current item, invoke the listener if changes, and return whether the\n     * item changed\n     * <p>\n     * This method does not call {@link #setCurrentItem(int)} unless the item\n     * parameter differs from the current item\n     *\n     * @param item\n     * @param listener\n     * @return true if set, false if same\n     */\n    public boolean setItem(final int item, final OnPageChangeListener listener) {\n        final boolean changed = setItem(item);\n        if (changed && listener != null) {\n            listener.onPageSelected(item);\n        }\n        return changed;\n    }\n\n    /**\n     * Schedule a call to {@link #setItem(int)} to occur on the UI-thread\n     *\n     * @param item\n     * @param listener\n     */\n    public void scheduleSetItem(final int item,\n                                final OnPageChangeListener listener) {\n        post(() -> setItem(item, listener));\n    }\n\n    /**\n     * Schedule a call to {@link #setItem(int)} to occur on the UI-thread\n     *\n     * @param item\n     */\n    public void scheduleSetItem(final int item) {\n        post(() -> setItem(item));\n    }\n\n    @Override\n    protected boolean canScroll(final View v, final boolean checkV,\n                                final int dx, final int x, final int y) {\n        return super.canScroll(v, checkV, dx, x, y);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/WebView.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui;\n\nimport android.content.Context;\nimport android.util.AttributeSet;\nimport android.view.MotionEvent;\n\n/**\n * Web view extension with scrolling fixes\n */\npublic class WebView extends android.webkit.WebView {\n\n    private boolean intercept;\n\n    /**\n     * @param context\n     * @param attrs\n     * @param defStyle\n     * @param privateBrowsing\n     */\n    public WebView(final Context context, final AttributeSet attrs,\n                   final int defStyle, final boolean privateBrowsing) {\n        super(context, attrs, defStyle, privateBrowsing);\n    }\n\n    /**\n     * @param context\n     * @param attrs\n     * @param defStyle\n     */\n    public WebView(final Context context, final AttributeSet attrs,\n                   final int defStyle) {\n        super(context, attrs, defStyle);\n    }\n\n    /**\n     * @param context\n     * @param attrs\n     */\n    public WebView(final Context context, final AttributeSet attrs) {\n        super(context, attrs);\n    }\n\n    /**\n     * @param context\n     */\n    public WebView(final Context context) {\n        super(context);\n    }\n\n    @Override\n    public boolean onInterceptTouchEvent(MotionEvent p_event)\n    {\n        return true;\n    }\n\n    @Override\n    public boolean onTouchEvent(MotionEvent p_event) {\n        if (intercept && getParent() != null) {\n            getParent().requestDisallowInterceptTouchEvent(true);\n        }\n\n        return super.onTouchEvent(p_event);\n    }\n\n    private boolean canScrollCodeHorizontally(final int direction) {\n        final int range = computeHorizontalScrollRange()\n                - computeHorizontalScrollExtent();\n        if (range == 0) {\n            return false;\n        }\n\n        if (direction < 0) {\n            return computeHorizontalScrollOffset() > 0;\n        } else {\n            return computeHorizontalScrollOffset() < range - 1;\n        }\n    }\n\n    public void startIntercept() {\n        intercept = true;\n    }\n\n    public void stopIntercept() {\n        intercept = false;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/base/AccountAuthenticatorAppCompatActivity.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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\npackage com.github.pockethub.android.ui.base;\n\nimport android.accounts.AccountAuthenticatorResponse;\nimport android.accounts.AccountManager;\nimport android.os.Bundle;\n\n/**\n * Base class for implementing an Activity that is used to help implement an\n * AbstractAccountAuthenticator. If the AbstractAccountAuthenticator needs to use an activity\n * to handle the request then it can have the activity extend ActionBarAccountAuthenticatorActivity.\n * The AbstractAccountAuthenticator passes in the response to the intent using the following:\n * <pre>\n *      intent.putExtra({@link AccountManager#KEY_ACCOUNT_AUTHENTICATOR_RESPONSE}, response);\n * </pre>\n * The activity then sets the result that is to be handed to the response via\n * {@link #setAccountAuthenticatorResult(Bundle)}.\n * This result will be sent as the result of the request when the activity finishes. If this\n * is never set or if it is set to null then error {@link AccountManager#ERROR_CODE_CANCELED}\n * will be called on the response.\n *\n * Based on {@link android.accounts.AccountAuthenticatorActivity}.\n */\npublic abstract class AccountAuthenticatorAppCompatActivity extends BaseActivity {\n\n    private AccountAuthenticatorResponse accountAuthenticatorResponse = null;\n    private Bundle resultBundle = null;\n    /**\n     * Set the result that is to be sent as the result of the request that caused this\n     * Activity to be launched. If result is null or this method is never called then\n     * the request will be canceled.\n     * @param result this is returned as the result of the AbstractAccountAuthenticator request\n     */\n    public final void setAccountAuthenticatorResult(Bundle result) {\n        resultBundle = result;\n    }\n\n    /**\n     * Retreives the AccountAuthenticatorResponse from either the intent of the icicle, if the\n     * icicle is non-zero.\n     * @param icicle the save instance data of this Activity, may be null\n     */\n    @Override\n    protected void onCreate(Bundle icicle) {\n        super.onCreate(icicle);\n\n        accountAuthenticatorResponse =\n            getIntent().getParcelableExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE);\n\n        if (accountAuthenticatorResponse != null) {\n            accountAuthenticatorResponse.onRequestContinued();\n        }\n    }\n\n    /**\n     * Sends the result or a Constants.ERROR_CODE_CANCELED error if a result isn't present.\n     */\n    @Override\n    public void finish() {\n        if (accountAuthenticatorResponse != null) {\n            // send the result bundle back if set, otherwise send an error.\n            if (resultBundle != null) {\n                accountAuthenticatorResponse.onResult(resultBundle);\n            } else {\n                accountAuthenticatorResponse.onError(AccountManager.ERROR_CODE_CANCELED,\n                    \"canceled\");\n            }\n            accountAuthenticatorResponse = null;\n        }\n        super.finish();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/base/BaseActivity.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.base\n\nimport com.github.pockethub.android.R\nimport dagger.android.support.DaggerAppCompatActivity\n\nabstract class BaseActivity : DaggerAppCompatActivity() {\n\n    override fun onContentChanged() {\n        super.onContentChanged()\n        setSupportActionBar(findViewById(R.id.toolbar))\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/base/BaseFragment.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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\npackage com.github.pockethub.android.ui.base\n\nimport dagger.android.support.DaggerFragment\n\nabstract class BaseFragment : DaggerFragment()\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/base/DialogFragmentHelper.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.base;\n\nimport android.content.DialogInterface;\nimport android.os.Bundle;\nimport androidx.fragment.app.Fragment;\nimport androidx.fragment.app.FragmentActivity;\nimport androidx.fragment.app.FragmentManager;\nimport androidx.fragment.app.FragmentTransaction;\n\nimport com.afollestad.materialdialogs.MaterialDialog;\nimport com.github.pockethub.android.ui.DialogResultListener;\n\nimport dagger.android.support.DaggerAppCompatDialogFragment;\n\nimport static android.app.Activity.RESULT_CANCELED;\n\n/**\n * Base dialog fragment helper\n */\npublic abstract class DialogFragmentHelper extends DaggerAppCompatDialogFragment {\n\n    /**\n     * Dialog message\n     */\n    private static final String ARG_TITLE = \"title\";\n\n    /**\n     * Dialog message\n     */\n    private static final String ARG_MESSAGE = \"message\";\n\n    /**\n     * Request code\n     */\n    private static final String ARG_REQUEST_CODE = \"requestCode\";\n\n    /**\n     * Show dialog\n     *\n     * @param activity\n     * @param fragment\n     * @param arguments\n     * @param tag\n     */\n    protected static void show(FragmentActivity activity,\n        DialogFragmentHelper fragment, Bundle arguments, String tag) {\n        FragmentManager manager = activity.getSupportFragmentManager();\n        FragmentTransaction transaction = manager.beginTransaction();\n        Fragment current = manager.findFragmentByTag(tag);\n        if (current != null) {\n            transaction.remove(current);\n        }\n        transaction.addToBackStack(null);\n\n        fragment.setArguments(arguments);\n        fragment.show(manager, tag);\n    }\n\n    /**\n     * Create bundle with standard arguments\n     *\n     * @param title\n     * @param message\n     * @param requestCode\n     * @return bundle\n     */\n    protected static Bundle createArguments(final String title,\n        final String message, final int requestCode) {\n        Bundle arguments = new Bundle();\n        arguments.putInt(ARG_REQUEST_CODE, requestCode);\n        arguments.putString(ARG_TITLE, title);\n        arguments.putString(ARG_MESSAGE, message);\n        return arguments;\n    }\n\n    /**\n     * Call back to the activity with the dialog result\n     *\n     * @param resultCode\n     */\n    protected void onResult(final int resultCode) {\n        final DialogResultListener dialogResultListener = (DialogResultListener) getActivity();\n        if (dialogResultListener != null) {\n            final Bundle arguments = getArguments();\n            if (arguments != null) {\n                dialogResultListener.onDialogResult(arguments.getInt(ARG_REQUEST_CODE), resultCode, arguments);\n            }\n        }\n    }\n\n    /**\n     * Get title\n     *\n     * @return title\n     */\n    protected String getTitle() {\n        return getArguments().getString(ARG_TITLE);\n    }\n\n    /**\n     * Get message\n     *\n     * @return message\n     */\n    protected String getMessage() {\n        return getArguments().getString(ARG_MESSAGE);\n    }\n\n    @Override\n    public void onCancel(DialogInterface dialog) {\n        onResult(RESULT_CANCELED);\n    }\n\n    /**\n     * Create default dialog\n     *\n     * @return dialog\n     */\n    protected MaterialDialog.Builder createDialogBuilder() {\n        return new MaterialDialog.Builder(getActivity())\n                .title(getTitle())\n                .content(getMessage())\n                .cancelable(true)\n                .cancelListener(this);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/base/FragmentPagerAdapter.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.base;\n\nimport androidx.fragment.app.Fragment;\nimport androidx.fragment.app.FragmentManager;\nimport androidx.fragment.app.FragmentTransaction;\nimport androidx.appcompat.app.AppCompatActivity;\nimport android.view.ViewGroup;\nimport com.github.pockethub.android.ui.FragmentProvider;\n\nimport java.util.HashSet;\nimport java.util.Set;\n\n/**\n * Pager adapter that provides the current fragment\n */\npublic abstract class FragmentPagerAdapter extends\n        androidx.fragment.app.FragmentPagerAdapter implements FragmentProvider {\n\n    private final AppCompatActivity activity;\n\n    private final FragmentManager fragmentManager;\n\n    private Fragment selected;\n\n    private final Set<String> tags = new HashSet<>();\n\n    private int containerId;\n\n    /**\n     * @param activity\n     */\n    public FragmentPagerAdapter(AppCompatActivity activity) {\n        super(activity.getSupportFragmentManager());\n\n        fragmentManager = activity.getSupportFragmentManager();\n        this.activity = activity;\n    }\n\n    public FragmentPagerAdapter(Fragment fragment) {\n        super(fragment.getChildFragmentManager());\n\n        fragmentManager = fragment.getChildFragmentManager();\n        this.activity = (AppCompatActivity) fragment.getActivity();\n    }\n\n    public boolean isEmpty() {\n        return tags.isEmpty();\n    }\n\n    /**\n     * This methods clears any fragments that may not apply to the newly\n     * selected org.\n     *\n     * @return this adapter\n     */\n    public FragmentPagerAdapter clearAdapter() {\n        if (tags.isEmpty()) {\n            return this;\n        }\n\n        FragmentTransaction transaction = fragmentManager.beginTransaction();\n        for (String tag : tags) {\n            Fragment fragment = fragmentManager.findFragmentByTag(tag);\n            if (fragment != null) {\n                transaction.remove(fragment);\n            }\n        }\n        transaction.commit();\n        tags.clear();\n\n        return this;\n    }\n\n    @Override\n    public Fragment getSelected() {\n        return selected;\n    }\n\n    @Override\n    public Object instantiateItem(ViewGroup container, int position) {\n        Object fragment = super.instantiateItem(container, position);\n        containerId = container.getId();\n        if (fragment instanceof Fragment) {\n            tags.add(((Fragment) fragment).getTag());\n        }\n\n        return fragment;\n    }\n\n    /**\n     * This method is used to get a reference to created fragments in the adapter.\n     *\n     * @param fragmentPosition\n     * position of the fragment in the pager.\n     *\n     * @return corresponding fragment that is created\n     * during {@link #instantiateItem(ViewGroup, int)}\n     *\n     */\n    public Fragment getFragmentByPosition(int fragmentPosition) {\n        String fragmentTag = getFragmentTag(containerId, fragmentPosition);\n        return fragmentManager.findFragmentByTag(fragmentTag);\n    }\n\n    @Override\n    public void setPrimaryItem(final ViewGroup container, final int position,\n        final Object object) {\n        super.setPrimaryItem(container, position, object);\n\n        boolean changed = false;\n        if (object instanceof Fragment) {\n            changed = object != selected;\n            selected = (Fragment) object;\n        } else {\n            changed = object != null;\n            selected = null;\n        }\n\n        if (changed) {\n            activity.invalidateOptionsMenu();\n        }\n    }\n\n    private String getFragmentTag(int viewPagerId, int fragmentPosition) {\n        return \"android:switcher:\" + viewPagerId + \":\" + fragmentPosition;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/base/FragmentStatePagerAdapter.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.base;\n\nimport androidx.fragment.app.Fragment;\nimport androidx.appcompat.app.AppCompatActivity;\nimport android.view.ViewGroup;\nimport com.github.pockethub.android.ui.FragmentProvider;\n\n/**\n * Pager that stores current fragment\n */\npublic abstract class FragmentStatePagerAdapter extends\n        androidx.fragment.app.FragmentStatePagerAdapter implements\n        FragmentProvider {\n\n    private final AppCompatActivity activity;\n\n    private Fragment selected;\n\n    /**\n     * @param activity\n     */\n    public FragmentStatePagerAdapter(final AppCompatActivity activity) {\n        super(activity.getSupportFragmentManager());\n\n        this.activity = activity;\n    }\n\n    /**\n     * @param fragment\n     */\n    public FragmentStatePagerAdapter(final Fragment fragment) {\n        super(fragment.getChildFragmentManager());\n\n        this.activity = (AppCompatActivity) fragment.getActivity();\n    }\n\n    @Override\n    public Fragment getSelected() {\n        return selected;\n    }\n\n    @Override\n    public void setPrimaryItem(final ViewGroup container, final int position,\n        final Object object) {\n        super.setPrimaryItem(container, position, object);\n\n        boolean changed = false;\n        if (object instanceof Fragment) {\n            changed = object != selected;\n            selected = (Fragment) object;\n        } else {\n            changed = object != null;\n            selected = null;\n        }\n\n        if (changed) {\n            activity.invalidateOptionsMenu();\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/code/RepositoryCodeFragment.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.code\n\nimport android.app.Activity.RESULT_OK\nimport android.os.Bundle\nimport android.util.Log\nimport android.view.LayoutInflater\nimport android.view.Menu\nimport android.view.MenuInflater\nimport android.view.MenuItem\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.core.text.bold\nimport androidx.core.text.buildSpannedString\nimport androidx.core.text.color\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport com.github.pockethub.android.Intents.EXTRA_REPOSITORY\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.RequestCodes.REF_UPDATE\nimport com.github.pockethub.android.core.code.FullTree\nimport com.github.pockethub.android.core.code.FullTree.Folder\nimport com.github.pockethub.android.core.code.RefreshTreeTask\nimport com.github.pockethub.android.core.ref.RefUtils\nimport com.github.pockethub.android.rx.AutoDisposeUtils\nimport com.github.pockethub.android.ui.base.BaseActivity\nimport com.github.pockethub.android.ui.DialogResultListener\nimport com.github.pockethub.android.ui.base.BaseFragment\nimport com.github.pockethub.android.ui.item.code.BlobItem\nimport com.github.pockethub.android.ui.item.code.FolderItem\nimport com.github.pockethub.android.ui.item.code.PathHeaderItem\nimport com.github.pockethub.android.ui.ref.BranchFileViewActivity\nimport com.github.pockethub.android.ui.ref.RefDialog\nimport com.github.pockethub.android.ui.ref.RefDialogFragment\nimport com.github.pockethub.android.util.ToastUtils\nimport com.github.pockethub.android.util.android.text.clickable\nimport com.meisolsson.githubsdk.model.Repository\nimport com.meisolsson.githubsdk.model.git.GitReference\nimport com.xwray.groupie.GroupAdapter\nimport com.xwray.groupie.Item\nimport com.xwray.groupie.OnItemClickListener\nimport com.xwray.groupie.Section\nimport com.xwray.groupie.ViewHolder\nimport io.reactivex.android.schedulers.AndroidSchedulers\nimport io.reactivex.schedulers.Schedulers\nimport kotlinx.android.synthetic.main.fragment_repo_code.*\nimport kotlinx.android.synthetic.main.ref_footer.*\nimport java.util.LinkedList\n\n/**\n * Fragment to display a repository's source code tree\n */\nclass RepositoryCodeFragment : BaseFragment(), OnItemClickListener, DialogResultListener {\n\n    private val adapter = GroupAdapter<ViewHolder>()\n\n    private val mainSection = Section()\n\n    private var tree: FullTree? = null\n\n    private var folder: Folder? = null\n\n    private var repository: Repository? = null\n\n    private var dialog: RefDialog? = null\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setHasOptionsMenu(true)\n        adapter.add(mainSection)\n        adapter.setOnItemClickListener(this)\n        repository = activity!!.intent.getParcelableExtra(EXTRA_REPOSITORY)\n    }\n\n    override fun onActivityCreated(savedInstanceState: Bundle?) {\n        super.onActivityCreated(savedInstanceState)\n\n        if (tree == null || folder == null) {\n            refreshTree(null)\n        } else {\n            setFolder(tree, folder!!)\n        }\n    }\n\n    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {\n        super.onCreateOptionsMenu(menu, inflater)\n        inflater.inflate(R.menu.fragment_refresh, menu)\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        return when (item.itemId) {\n            R.id.m_refresh -> {\n                if (tree != null) {\n                    val ref = GitReference.builder()\n                            .ref(tree!!.reference.ref())\n                            .build()\n                    refreshTree(ref)\n                } else {\n                    refreshTree(null)\n                }\n                true\n            }\n            else -> super.onOptionsItemSelected(item)\n        }\n    }\n\n    private fun showLoading(loading: Boolean) {\n        if (loading) {\n            pb_loading.visibility = View.VISIBLE\n            list.visibility = View.GONE\n            rl_branch.visibility = View.GONE\n        } else {\n            pb_loading.visibility = View.GONE\n            list.visibility = View.VISIBLE\n            rl_branch.visibility = View.VISIBLE\n        }\n    }\n\n    private fun refreshTree(reference: GitReference?) {\n        showLoading(true)\n        RefreshTreeTask(activity, repository, reference)\n                .refresh()\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .`as`(AutoDisposeUtils.bindToLifecycle(this))\n                .subscribe({ fullTree ->\n                    if (folder == null || folder!!.isRoot) {\n                        setFolder(fullTree, fullTree.root)\n                    } else {\n                        // Look for current folder in new tree or else reset to root\n                        var current: Folder = folder!!\n                        val stack = LinkedList<Folder>()\n                        while (!current.isRoot) {\n                            stack.addFirst(current)\n                            current = current.parent\n                        }\n                        var refreshed: Folder? = fullTree.root\n                        while (!stack.isEmpty()) {\n                            refreshed = refreshed!!.folders[stack.removeFirst().name]\n                            if (refreshed == null) {\n                                break\n                            }\n                        }\n                        if (refreshed != null) {\n                            setFolder(fullTree, refreshed)\n                        } else {\n                            setFolder(fullTree, fullTree.root)\n                        }\n                    }\n                }, { e ->\n                    Log.d(TAG, \"Exception loading tree\", e)\n\n                    showLoading(false)\n                    ToastUtils.show(activity, R.string.error_code_load)\n                })\n    }\n\n    private fun switchBranches() {\n        if (tree == null) {\n            return\n        }\n\n        if (dialog == null) {\n            dialog = RefDialog(activity as BaseActivity?, REF_UPDATE, repository)\n        }\n        dialog!!.show(tree!!.reference)\n    }\n\n    override fun onDialogResult(requestCode: Int, resultCode: Int, arguments: Bundle) {\n        if (RESULT_OK != resultCode) {\n            return\n        }\n\n        when (requestCode) {\n            REF_UPDATE -> refreshTree(RefDialogFragment.getSelected(arguments))\n        }\n    }\n\n    override fun onCreateView(\n            inflater: LayoutInflater,\n            container: ViewGroup?,\n            savedInstanceState: Bundle?\n    ): View? {\n        return inflater.inflate(R.layout.fragment_repo_code, container, false)\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n\n        list.layoutManager = LinearLayoutManager(activity)\n        list.adapter = adapter\n\n        rl_branch.setOnClickListener { _ -> switchBranches() }\n\n        mainSection.setHeader(PathHeaderItem(\"\"))\n    }\n\n    /**\n     * Back up the currently viewed folder to its parent\n     *\n     * @return true if directory changed, false otherwise\n     */\n    fun onBackPressed(): Boolean {\n        return if (folder != null && !folder!!.isRoot) {\n            setFolder(tree, folder!!.parent)\n            true\n        } else {\n            false\n        }\n    }\n\n    private fun setFolder(tree: FullTree?, folder: Folder) {\n        this.folder = folder\n        this.tree = tree\n\n        showLoading(false)\n\n        tv_branch.text = tree!!.branch\n        if (RefUtils.isTag(tree.reference)) {\n            tv_branch_icon.setText(R.string.icon_tag)\n        } else {\n            tv_branch_icon.setText(R.string.icon_fork)\n        }\n\n        if (folder.entry != null) {\n            val textLightColor = resources.getColor(R.color.text_light)\n            val segments = folder.entry.path()!!.split(\"/\")\n            val text = buildSpannedString {\n                bold {\n                    clickable(onClick = {\n                        setFolder(tree, tree.root)\n                    }) {\n                        append(repository!!.name()!!)\n                    }\n                }\n                append(' ')\n                color(textLightColor) {\n                    append('/')\n                }\n                append(' ')\n                for (i in 0 until segments.size - 1) {\n                    clickable(onClick = {\n                        var clicked: Folder? = folder\n                        for (i1 in i until segments.size - 1) {\n                            clicked = clicked!!.parent\n                            if (clicked == null) {\n                                return@clickable\n                            }\n                        }\n                        setFolder(tree, clicked!!)\n                    }) {\n                        append(segments[i])\n                    }\n                    append(' ')\n                    color(textLightColor) {\n                        append('/')\n                    }\n                    append(' ')\n                }\n                bold {\n                    append(segments[segments.size - 1])\n                }\n                append(' ')\n                color(textLightColor) {\n                    append('/')\n                }\n                append(' ')\n            }\n\n            mainSection.setHeader(PathHeaderItem(text))\n        } else {\n            mainSection.removeHeader()\n        }\n\n\n        val items: List<Item<*>> =\n            folder.folders.values.map { FolderItem(it) } +\n            folder.files.values.map { BlobItem(activity!!, it) }\n\n        mainSection.update(items)\n    }\n\n    override fun onItemClick(item: Item<*>, view: View) {\n        if (tree == null) {\n            return\n        }\n\n        if (item is BlobItem) {\n            val entry = item.file\n            startActivity(BranchFileViewActivity.createIntent(\n                    repository!!,\n                    tree!!.branch,\n                    entry.entry.path()!!,\n                    entry.entry.sha()!!\n            ))\n        } else if (item is FolderItem) {\n            val folder = item.folder\n            setFolder(tree, folder)\n        }\n    }\n\n    companion object {\n\n        private const val TAG = \"RepositoryCodeFragment\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/comment/CommentPreviewPagerAdapter.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.comment;\n\nimport android.content.Context;\nimport androidx.fragment.app.Fragment;\nimport androidx.appcompat.app.AppCompatActivity;\n\nimport com.github.pockethub.android.R;\nimport com.github.pockethub.android.ui.base.FragmentPagerAdapter;\nimport com.meisolsson.githubsdk.model.Repository;\n\n/**\n * Pager of a raw and rendered comment text\n */\npublic class CommentPreviewPagerAdapter extends FragmentPagerAdapter {\n    private final Repository repo;\n    private RawCommentFragment textFragment;\n    private RenderedCommentFragment htmlFragment;\n\n    /**\n     * Text to populate comment window.\n     */\n    private String initComment;\n\n    private Context context;\n\n    /**\n     * @param activity\n     * @param repo\n     */\n    public CommentPreviewPagerAdapter(AppCompatActivity activity, Repository repo) {\n        super(activity);\n        this.context = activity.getApplicationContext();\n        this.repo = repo;\n    }\n\n    @Override\n    public Fragment getItem(final int position) {\n        switch (position) {\n        case 0:\n            textFragment = new RawCommentFragment();\n            textFragment.setText(initComment);\n            return textFragment;\n        case 1:\n            htmlFragment = new RenderedCommentFragment();\n            return htmlFragment;\n        default:\n            return null;\n        }\n    }\n\n    @Override\n    public int getCount() {\n        return 2;\n    }\n\n    /**\n     * Get comment text\n     *\n     * @return text\n     */\n    public String getCommentText() {\n        if (textFragment == null) {\n            textFragment = (RawCommentFragment) getFragmentByPosition(0);\n        }\n\n        return textFragment != null ? textFragment.getText() : null;\n    }\n\n    /**\n     * Set comment text\n     *\n     * @return text\n     */\n    public void setCommentText(String comment) {\n        if (textFragment != null) {\n            textFragment.setText(comment);\n        }\n        initComment = comment;\n    }\n\n    /**\n     * Set current item\n     *\n     * @param position\n     * @return this adapter\n     */\n    public CommentPreviewPagerAdapter setCurrentItem(int position) {\n        if (position == 1 && htmlFragment != null) {\n            htmlFragment.setText(getCommentText(), repo);\n        }\n        return this;\n    }\n\n    @Override\n    public CharSequence getPageTitle(int position) {\n        switch (position) {\n            case 0:\n                return context.getResources().getString(R.string.write);\n            case 1:\n                return context.getResources().getString(R.string.preview);\n            default:\n                return \"\";\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/comment/CreateCommentActivity.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.comment\n\nimport android.content.Intent\nimport android.os.Bundle\nimport android.view.Menu\nimport android.view.MenuItem\nimport com.github.pockethub.android.Intents.EXTRA_COMMENT\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.ui.base.BaseActivity\nimport com.github.pockethub.android.ui.helpers.PagerHandler\nimport com.meisolsson.githubsdk.model.GitHubComment\nimport com.meisolsson.githubsdk.model.git.GitComment\nimport kotlinx.android.synthetic.main.pager_with_tabs.*\n\n/**\n * Base activity for creating comments\n */\nabstract class CreateCommentActivity : BaseActivity() {\n\n    private var pagerHandler: PagerHandler<CommentPreviewPagerAdapter>? = null\n\n    override fun onPostCreate(savedInstanceState: Bundle?) {\n        super.onPostCreate(savedInstanceState)\n        supportActionBar!!.setDisplayHomeAsUpEnabled(true)\n\n        configurePager()\n    }\n\n    private fun configurePager() {\n        val adapter = createAdapter()\n        pagerHandler = PagerHandler(this, vp_pages, adapter)\n        pagerHandler!!.onPagedChanged = this::onPageChanged\n        lifecycle.addObserver(pagerHandler!!)\n        pagerHandler!!.tabs = sliding_tabs_layout\n    }\n\n    private fun onPageChanged(position: Int) {\n        pagerHandler!!.adapter.setCurrentItem(position)\n    }\n\n    override fun onDestroy() {\n        super.onDestroy()\n        lifecycle.removeObserver(pagerHandler!!)\n    }\n\n    /**\n     * Create comment\n     *\n     * @param comment\n     */\n    protected abstract fun createComment(comment: String)\n\n    /**\n     * Finish this activity passing back the created comment\n     *\n     * @param comment\n     */\n    protected fun finish(comment: GitHubComment) {\n        val data = Intent()\n        data.putExtra(EXTRA_COMMENT, comment)\n        setResult(RESULT_OK, data)\n        finish()\n    }\n\n    protected fun finish(comment: GitComment) {\n        val data = Intent()\n        data.putExtra(EXTRA_COMMENT, comment)\n        setResult(RESULT_OK, data)\n        finish()\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        return when (item.itemId) {\n            android.R.id.home -> {\n                finish()\n                true\n            }\n            R.id.m_apply -> {\n                createComment(pagerHandler!!.adapter.commentText)\n                true\n            }\n            else -> super.onOptionsItemSelected(item)\n        }\n    }\n\n    protected open fun createAdapter(): CommentPreviewPagerAdapter {\n        return CommentPreviewPagerAdapter(this, null)\n    }\n\n    override fun onCreateOptionsMenu(menu: Menu): Boolean {\n        menuInflater.inflate(R.menu.activity_comment, menu)\n        return true\n    }\n\n    override fun onPrepareOptionsMenu(menu: Menu?): Boolean {\n        val applyItem = menu?.findItem(R.id.m_apply)\n        applyItem?.isEnabled =\n            pagerHandler?.adapter != null && pagerHandler?.adapter!!.commentText.isNotEmpty()\n        return true\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/comment/DeleteCommentListener.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.comment;\n\nimport com.meisolsson.githubsdk.model.GitHubComment;\n\n/**\n * Interface definition for a callback to be invoked when a comment is deleted\n */\npublic interface DeleteCommentListener {\n\n    /**\n     * Delete a comment\n     *\n     * @param comment\n     */\n    void onDeleteComment(GitHubComment comment);\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/comment/EditCommentListener.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.comment;\n\nimport com.meisolsson.githubsdk.model.GitHubComment;\n\n/**\n * Interface definition for a callback to be invoked when a comment is edited\n */\npublic interface EditCommentListener {\n\n    /**\n     * Edit a comment\n     *\n     * @param comment\n     */\n    void onEditComment(GitHubComment comment);\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/comment/RawCommentFragment.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.comment\n\nimport android.Manifest\nimport android.app.Activity\nimport android.content.Intent\nimport android.content.pm.PackageManager\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.core.content.ContextCompat\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.rx.AutoDisposeUtils\nimport com.github.pockethub.android.rx.RxProgress\nimport com.github.pockethub.android.ui.TextWatcherAdapter\nimport com.github.pockethub.android.ui.base.BaseFragment\nimport com.github.pockethub.android.util.ImageBinPoster\nimport com.github.pockethub.android.util.PermissionsUtils\nimport com.github.pockethub.android.util.ToastUtils\nimport io.reactivex.android.schedulers.AndroidSchedulers\nimport io.reactivex.schedulers.Schedulers\nimport kotlinx.android.synthetic.main.fragment_comment_create.*\n\n/**\n * Fragment to display raw comment text\n */\nclass RawCommentFragment : BaseFragment() {\n\n    /**\n     * Text to populate comment window.\n     */\n    private var initComment: String? = null\n\n    /**\n     * Get comment text\n     *\n     * @return text\n     */\n    /**\n     * Set comment text\n     *\n     * @return text\n     */\n    var text: String?\n        get() {\n            return et_comment.text.toString()\n        }\n        set(comment) = if (et_comment != null) {\n            et_comment!!.setText(comment)\n            et_comment!!.selectAll()\n        } else {\n            initComment = comment\n        }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n\n        fab_add_image!!.setOnClickListener { v ->\n            val fragment = this@RawCommentFragment\n            val permission = Manifest.permission.READ_EXTERNAL_STORAGE\n\n            if (ContextCompat.checkSelfPermission(activity!!, permission) != PackageManager.PERMISSION_GRANTED) {\n                PermissionsUtils.askForPermission(\n                    fragment,\n                    READ_PERMISSION_REQUEST,\n                    permission,\n                    R.string.read_permission_title,\n                    R.string.read_permission_content\n                )\n            } else {\n                startImagePicker()\n            }\n        }\n\n        et_comment.addTextChangedListener(object : TextWatcherAdapter() {\n\n            override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {\n                activity?.invalidateOptionsMenu()\n            }\n        })\n        et_comment.setOnTouchListener { v, event ->\n            et_comment.requestFocusFromTouch()\n            false\n        }\n\n        text = initComment\n    }\n\n    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {\n        super.onRequestPermissionsResult(requestCode, permissions, grantResults)\n        if (requestCode == READ_PERMISSION_REQUEST) {\n            val result = permissions.indices\n                .none { grantResults[it] != PackageManager.PERMISSION_GRANTED }\n\n            if (result) {\n                startImagePicker()\n            }\n        }\n    }\n\n    private fun startImagePicker() {\n        val photoPickerIntent = Intent(Intent.ACTION_GET_CONTENT)\n        photoPickerIntent.type = \"image/*\"\n        startActivityForResult(photoPickerIntent, REQUEST_CODE_SELECT_PHOTO)\n    }\n\n    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {\n        super.onActivityResult(requestCode, resultCode, data)\n\n        if (requestCode == REQUEST_CODE_SELECT_PHOTO && resultCode == Activity.RESULT_OK) {\n            ImageBinPoster.post(activity!!, data!!.data!!)\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .compose(RxProgress.bindToLifecycle(activity, R.string.loading))\n                .`as`(AutoDisposeUtils.bindToLifecycle(this))\n                .subscribe({ response ->\n                    if (response.isSuccessful) {\n                        insertImage(ImageBinPoster.getUrl(response.body()!!.string()))\n                    } else {\n                        showImageError()\n                    }\n                }, { throwable -> showImageError() })\n        }\n    }\n\n    private fun showImageError() {\n        ToastUtils.show(activity, R.string.error_image_upload)\n    }\n\n    private fun insertImage(url: String?) {\n        activity!!.runOnUiThread { et_comment.append(\"![]($url)\") }\n    }\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        return inflater.inflate(R.layout.fragment_comment_create, container, false)\n    }\n\n    companion object {\n\n        private val REQUEST_CODE_SELECT_PHOTO = 0\n        private val READ_PERMISSION_REQUEST = 1\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/comment/RenderedCommentFragment.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.comment\n\nimport android.content.Context\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.view.inputmethod.InputMethodManager\n\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.util.MarkdownLoader\nimport com.github.pockethub.android.ui.base.BaseFragment\nimport com.github.pockethub.android.util.HttpImageGetter\nimport com.github.pockethub.android.util.ToastUtils\nimport com.meisolsson.githubsdk.model.Repository\n\nimport javax.inject.Inject\n\nimport io.reactivex.android.schedulers.AndroidSchedulers\nimport io.reactivex.schedulers.Schedulers\nimport kotlinx.android.synthetic.main.fragment_comment_preview.*\n\n/**\n * Fragment to display rendered comment fragment\n */\nclass RenderedCommentFragment : BaseFragment() {\n\n    @Inject\n    lateinit var imageGetter: HttpImageGetter\n\n    /**\n     * Set text to render\n     *\n     * @param raw\n     * @param repo\n     */\n    fun setText(raw: String, repo: Repository?) {\n        loadMarkdown(raw, repo)\n        hideSoftKeyboard()\n        showLoading(true)\n    }\n\n    private fun hideSoftKeyboard() {\n        val context = context\n        if (context != null) {\n            val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager\n            imm.hideSoftInputFromWindow(tv_comment_body.windowToken, 0)\n        }\n    }\n\n    private fun showLoading(loading: Boolean) {\n        if (loading) {\n            pb_loading.visibility = View.VISIBLE\n            tv_comment_body.visibility = View.GONE\n        } else {\n            pb_loading.visibility = View.GONE\n            tv_comment_body.visibility = View.VISIBLE\n        }\n    }\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        return inflater.inflate(R.layout.fragment_comment_preview, null)\n    }\n\n    private fun loadMarkdown(raw: String, repo: Repository?) {\n        MarkdownLoader.load(activity, raw, repo, imageGetter, true)\n            .subscribeOn(Schedulers.io())\n            .observeOn(AndroidSchedulers.mainThread())\n            .subscribe({ rendered ->\n                tv_comment_body!!.text = rendered\n                showLoading(false)\n            }, { e -> ToastUtils.show(activity, R.string.error_rendering_markdown) })\n    }\n\n    companion object {\n\n        private val ARG_TEXT = \"text\"\n\n        private val ARG_REPO = \"repo\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/commit/CommitCompareListFragment.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.commit\n\nimport android.app.Activity\nimport android.content.Context\nimport android.os.Bundle\nimport android.text.TextUtils\nimport android.view.LayoutInflater\nimport android.view.Menu\nimport android.view.MenuInflater\nimport android.view.MenuItem\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.annotation.NonNull\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport com.github.pockethub.android.Intents.EXTRA_BASE\nimport com.github.pockethub.android.Intents.EXTRA_HEAD\nimport com.github.pockethub.android.Intents.EXTRA_REPOSITORY\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.core.commit.CommitUtils\nimport com.github.pockethub.android.rx.AutoDisposeUtils\nimport com.github.pockethub.android.ui.base.BaseFragment\nimport com.github.pockethub.android.ui.item.TextItem\nimport com.github.pockethub.android.ui.item.commit.CommitFileHeaderItem\nimport com.github.pockethub.android.ui.item.commit.CommitFileLineItem\nimport com.github.pockethub.android.ui.item.commit.CommitItem\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.github.pockethub.android.util.ToastUtils\nimport com.meisolsson.githubsdk.core.ServiceGenerator\nimport com.meisolsson.githubsdk.model.Commit\nimport com.meisolsson.githubsdk.model.CommitCompare\nimport com.meisolsson.githubsdk.model.GitHubFile\nimport com.meisolsson.githubsdk.model.Repository\nimport com.meisolsson.githubsdk.service.repositories.RepositoryCommitService\nimport com.xwray.groupie.GroupAdapter\nimport com.xwray.groupie.Item\nimport com.xwray.groupie.OnItemClickListener\nimport com.xwray.groupie.Section\nimport com.xwray.groupie.ViewHolder\nimport io.reactivex.android.schedulers.AndroidSchedulers\nimport io.reactivex.schedulers.Schedulers\nimport kotlinx.android.synthetic.main.fragment_commit_diff_list.*\nimport java.text.MessageFormat\nimport java.util.*\nimport javax.inject.Inject\n\n/**\n * Fragment to display a list of commits being compared\n */\nclass CommitCompareListFragment : BaseFragment(), OnItemClickListener {\n\n    @Inject\n    lateinit var avatars: AvatarLoader\n\n    private var diffStyler: DiffStyler? = null\n\n    private var repository: Repository? = null\n\n    private var base: String? = null\n\n    private var head: String? = null\n\n    private val adapter = GroupAdapter<ViewHolder>()\n\n    private val mainSection = Section()\n\n    private val commitsSection = Section()\n\n    private val filesSection = Section()\n\n    private var compare: CommitCompare? = null\n\n    override fun onAttach(context: Context) {\n        super.onAttach(context)\n\n        val activity = context as Activity\n        repository = activity.intent.getParcelableExtra(EXTRA_REPOSITORY)\n        base = activity.intent.getStringExtra(EXTRA_BASE).substring(0, 7)\n        head = activity.intent.getStringExtra(EXTRA_HEAD).substring(0, 7)\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        mainSection.add(commitsSection)\n        mainSection.add(filesSection)\n        adapter.add(mainSection)\n\n        adapter.setOnItemClickListener(this)\n\n        diffStyler = DiffStyler(resources)\n        compareCommits()\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        list.layoutManager = LinearLayoutManager(activity)\n        list.adapter = adapter\n    }\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        return inflater.inflate(R.layout.fragment_commit_diff_list, container, false)\n    }\n\n    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {\n        super.onCreateOptionsMenu(menu, inflater)\n        inflater.inflate(R.menu.fragment_refresh, menu)\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        if (!isAdded) {\n            return false\n        }\n\n        return when (item.itemId) {\n            R.id.m_refresh -> {\n                compareCommits()\n                true\n            }\n            else -> super.onOptionsItemSelected(item)\n        }\n    }\n\n    private fun compareCommits() {\n        ServiceGenerator.createService(activity, RepositoryCommitService::class.java)\n            .compareCommits(repository!!.owner()!!.login(), repository!!.name(), base, head)\n            .subscribeOn(Schedulers.io())\n            .observeOn(AndroidSchedulers.mainThread())\n            .`as`(AutoDisposeUtils.bindToLifecycle(this))\n            .subscribe({ response ->\n                val compareCommit = response.body()\n                val files = compareCommit!!.files()\n                diffStyler!!.setFiles(files)\n                Collections.sort(files, CommitFileComparator())\n                updateList(compareCommit)\n            }, { error -> ToastUtils.show(activity, R.string.error_commits_load) })\n    }\n\n    private fun updateList(compare: CommitCompare) {\n        if (!isAdded) {\n            return\n        }\n\n        this.compare = compare\n\n        pb_loading.visibility = View.GONE\n        list.visibility = View.VISIBLE\n\n        val commits = compare.commits()\n        if (!commits.isEmpty()) {\n            val comparingCommits = getString(R.string.comparing_commits)\n            val text = MessageFormat.format(comparingCommits, commits.size)\n            commitsSection.setHeader(\n                TextItem(R.layout.commit_details_header, R.id.tv_commit_summary, text)\n            )\n\n            val items = commits.map { CommitItem(avatars, it) }\n            commitsSection.update(items)\n        }\n\n        val files = compare.files()\n        if (!files.isEmpty()) {\n            filesSection.setHeader(\n                TextItem(R.layout.commit_compare_file_details_header,\n                    R.id.tv_commit_file_summary, CommitUtils.formatStats(files))\n            )\n            filesSection.update(createFileSections(files))\n        }\n    }\n\n    private fun createFileSections(files: List<GitHubFile>): List<Section> {\n        return files.map { file ->\n            val lines = diffStyler!!.get(file.filename())\n            Section(CommitFileHeaderItem(activity!!, file), lines.map { CommitFileLineItem(diffStyler!!, it) })\n        }\n    }\n\n    private fun openCommit(commit: Commit) {\n        if (compare != null) {\n            val commits = compare!!.commits()\n            val commitPosition = commits\n                .takeWhile { commit !== it }\n                .count()\n            if (commitPosition < commits.size) {\n                val ids = commits.map { it.sha()!! }.toTypedArray()\n                startActivity(CommitViewActivity.createIntent(repository!!, commitPosition, *ids))\n            }\n        } else {\n            startActivity(CommitViewActivity.createIntent(repository!!, commit.sha()!!))\n        }\n    }\n\n    private fun openFile(file: GitHubFile) {\n        if (!TextUtils.isEmpty(file.filename()) && !TextUtils.isEmpty(file.sha())) {\n            startActivity(CommitFileViewActivity.createIntent(repository!!, head!!, file))\n        }\n    }\n\n    private fun openLine(adapter: GroupAdapter<*>, position: Int) {\n        var pos = position\n        var item: Any\n        while (--pos >= 0) {\n            item = adapter.getItem(pos)\n            if (item is CommitFileHeaderItem) {\n                openFile(item.file)\n                return\n            }\n        }\n    }\n\n    override fun onItemClick(@NonNull item: Item<*>, @NonNull view: View) {\n        when (item) {\n            is CommitItem -> openCommit(item.commit)\n            is CommitFileHeaderItem -> openFile(item.file)\n            is CommitFileLineItem -> {\n                val position = adapter.getAdapterPosition(item)\n                openLine(adapter, position)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/commit/CommitCompareViewActivity.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.commit;\n\nimport android.content.Intent;\nimport android.os.Bundle;\nimport androidx.fragment.app.Fragment;\nimport androidx.appcompat.app.ActionBar;\nimport android.view.Menu;\nimport android.view.MenuItem;\n\nimport com.meisolsson.githubsdk.model.Repository;\nimport com.github.pockethub.android.Intents.Builder;\nimport com.github.pockethub.android.R;\nimport com.github.pockethub.android.ui.base.BaseActivity;\nimport com.github.pockethub.android.ui.repo.RepositoryViewActivity;\nimport com.github.pockethub.android.util.InfoUtils;\n\nimport static android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP;\nimport static android.content.Intent.FLAG_ACTIVITY_SINGLE_TOP;\nimport static com.github.pockethub.android.Intents.EXTRA_BASE;\nimport static com.github.pockethub.android.Intents.EXTRA_HEAD;\nimport static com.github.pockethub.android.Intents.EXTRA_REPOSITORY;\n\n/**\n * Activity to display a comparison between two commits\n */\npublic class CommitCompareViewActivity extends BaseActivity {\n\n    /**\n     * Create intent for this activity\n     *\n     * @param repository\n     * @param base\n     * @param head\n     * @return intent\n     */\n    public static Intent createIntent(final Repository repository,\n        final String base, final String head) {\n        Builder builder = new Builder(\"commits.compare.VIEW\");\n        builder.add(EXTRA_BASE, base);\n        builder.add(EXTRA_HEAD, head);\n        builder.repo(repository);\n        return builder.toIntent();\n    }\n\n    private Repository repository;\n\n    private Fragment fragment;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.commit_compare);\n\n        repository = getIntent().getParcelableExtra(EXTRA_REPOSITORY);\n\n        ActionBar actionBar = getSupportActionBar();\n        actionBar.setDisplayHomeAsUpEnabled(true);\n        actionBar.setSubtitle(InfoUtils.createRepoId(repository));\n\n        fragment = getSupportFragmentManager()\n            .findFragmentById(R.id.list);\n    }\n\n    @Override\n    public boolean onCreateOptionsMenu(Menu optionsMenu) {\n        if (fragment != null) {\n            fragment.onCreateOptionsMenu(optionsMenu, getMenuInflater());\n        }\n\n        return super.onCreateOptionsMenu(optionsMenu);\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(MenuItem item) {\n        switch (item.getItemId()) {\n            case android.R.id.home:\n                Intent intent = RepositoryViewActivity.Companion.createIntent(repository);\n                intent.addFlags(FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGLE_TOP);\n                startActivity(intent);\n                return true;\n            default:\n                if (fragment != null) {\n                    return fragment.onOptionsItemSelected(item);\n                } else {\n                    return super.onOptionsItemSelected(item);\n                }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/commit/CommitDiffListFragment.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.commit\n\nimport android.app.Activity.RESULT_OK\nimport android.content.ClipData\nimport android.content.ClipboardManager\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Bundle\nimport android.text.TextUtils\nimport android.view.LayoutInflater\nimport android.view.Menu\nimport android.view.MenuInflater\nimport android.view.MenuItem\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.Toast\nimport androidx.annotation.NonNull\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport com.afollestad.materialdialogs.MaterialDialog\nimport com.github.pockethub.android.Intents.EXTRA_BASE\nimport com.github.pockethub.android.Intents.EXTRA_COMMENT\nimport com.github.pockethub.android.Intents.EXTRA_REPOSITORY\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.RequestCodes.COMMENT_CREATE\nimport com.github.pockethub.android.core.commit.CommitStore\nimport com.github.pockethub.android.core.commit.CommitUtils\nimport com.github.pockethub.android.core.commit.FullCommitFile\nimport com.github.pockethub.android.core.commit.RefreshCommitTaskFactory\nimport com.github.pockethub.android.rx.AutoDisposeUtils\nimport com.github.pockethub.android.ui.base.BaseFragment\nimport com.github.pockethub.android.ui.item.LoadingItem\nimport com.github.pockethub.android.ui.item.TextItem\nimport com.github.pockethub.android.ui.item.commit.CommitCommentItem\nimport com.github.pockethub.android.ui.item.commit.CommitFileHeaderItem\nimport com.github.pockethub.android.ui.item.commit.CommitFileLineItem\nimport com.github.pockethub.android.ui.item.commit.CommitHeaderItem\nimport com.github.pockethub.android.ui.item.commit.CommitParentItem\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.github.pockethub.android.util.HttpImageGetter\nimport com.github.pockethub.android.util.InfoUtils\nimport com.github.pockethub.android.util.ShareUtils\nimport com.github.pockethub.android.util.ToastUtils\nimport com.meisolsson.githubsdk.model.Commit\nimport com.meisolsson.githubsdk.model.GitHubFile\nimport com.meisolsson.githubsdk.model.Repository\nimport com.meisolsson.githubsdk.model.git.GitComment\nimport com.meisolsson.githubsdk.model.git.GitCommit\nimport com.xwray.groupie.GroupAdapter\nimport com.xwray.groupie.Item\nimport com.xwray.groupie.OnItemClickListener\nimport com.xwray.groupie.Section\nimport com.xwray.groupie.ViewHolder\nimport io.reactivex.android.schedulers.AndroidSchedulers\nimport io.reactivex.schedulers.Schedulers\nimport kotlinx.android.synthetic.main.diff_line_dialog.view.*\nimport kotlinx.android.synthetic.main.fragment_commit_diff_list.*\nimport java.util.Collections\nimport javax.inject.Inject\n\n/**\n * Fragment to display commit details with diff output\n */\nclass CommitDiffListFragment : BaseFragment(), OnItemClickListener {\n    \n    @Inject\n    lateinit var refreshCommitTaskFactory: RefreshCommitTaskFactory\n\n    @Inject\n    lateinit var commentImageGetter: HttpImageGetter\n\n    @Inject\n    lateinit var avatars: AvatarLoader\n\n    @Inject\n    lateinit var store: CommitStore\n\n    private var diffStyler: DiffStyler? = null\n\n    private var repository: Repository? = null\n\n    private var base: String? = null\n\n    private var commit: Commit? = null\n\n    private var comments: MutableList<GitComment>? = null\n\n    private var files: List<FullCommitFile>? = null\n\n    private val adapter = GroupAdapter<ViewHolder>()\n\n    private val mainSection = Section()\n\n    private val commitSection = Section()\n\n    private val filesSection = Section()\n\n    private val commentSection = Section()\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setHasOptionsMenu(true)\n\n        val args = arguments!!\n        base = args.getString(EXTRA_BASE)\n        repository = args.getParcelable(EXTRA_REPOSITORY)\n\n        mainSection.add(commitSection)\n        mainSection.add(filesSection)\n        mainSection.add(commentSection)\n\n        adapter.add(mainSection)\n        adapter.setOnItemClickListener(this)\n    }\n\n    override fun onActivityCreated(savedInstanceState: Bundle?) {\n        super.onActivityCreated(savedInstanceState)\n        commit = store.getCommit(repository, base)\n\n        if (files == null || commit != null && commit!!.commit()!!.commentCount()!! > 0 && comments == null) {\n            mainSection.setFooter(LoadingItem())\n        }\n\n        if (commit != null && comments != null && files != null) {\n            updateList(commit!!, comments!!, files!!)\n        } else {\n            if (commit != null) {\n                updateHeader(commit!!)\n            }\n            refreshCommit()\n        }\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        diffStyler = DiffStyler(resources)\n\n        list.layoutManager = LinearLayoutManager(activity)\n        list.adapter = adapter\n    }\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?, \n        savedInstanceState: Bundle?\n    ): View {\n        return inflater.inflate(R.layout.fragment_commit_diff_list, container, false)\n    }\n\n    private fun addComment(comment: GitComment) {\n        if (comments != null && files != null) {\n            comments!!.add(comment)\n            var rawCommit: GitCommit? = commit!!.commit()\n            if (rawCommit != null) {\n                rawCommit = rawCommit.toBuilder()\n                    .commentCount(rawCommit.commentCount()!! + 1)\n                    .build()\n\n                commit = commit!!.toBuilder()\n                    .commit(rawCommit)\n                    .build()\n            }\n            commentImageGetter.encode(comment, comment.bodyHtml())\n            updateItems(comments!!, files!!)\n        } else {\n            refreshCommit()\n        }\n    }\n\n    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {\n        if (RESULT_OK == resultCode && COMMENT_CREATE == requestCode\n            && data != null) {\n            val comment = data.getParcelableExtra<GitComment>(EXTRA_COMMENT)\n            addComment(comment)\n            return\n        }\n\n        super.onActivityResult(requestCode, resultCode, data)\n    }\n\n    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {\n        super.onCreateOptionsMenu(menu, inflater)\n        inflater.inflate(R.menu.fragment_commit_view, menu)\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        if (!isAdded) {\n            return false\n        }\n\n        when (item.itemId) {\n            R.id.m_refresh -> {\n                refreshCommit()\n                return true\n            }\n            R.id.m_copy_hash -> {\n                copyHashToClipboard()\n                return true\n            }\n            R.id.m_comment -> {\n                startActivityForResult(\n                    CreateCommentActivity.createIntent(repository, base),\n                    COMMENT_CREATE)\n                return true\n            }\n            R.id.m_share -> {\n                shareCommit()\n                return true\n            }\n            else -> return super.onOptionsItemSelected(item)\n        }\n    }\n\n    private fun copyHashToClipboard() {\n        val manager = activity!!.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager\n        val clip = ClipData.newPlainText(\"hash\", commit!!.sha())\n        manager.primaryClip = clip\n        Toast.makeText(activity, R.string.toast_msg_copied, Toast.LENGTH_SHORT).show()\n    }\n\n    private fun shareCommit() {\n        val id = InfoUtils.createRepoId(repository!!)\n        startActivity(ShareUtils.create(\n            \"Commit \" + CommitUtils.abbreviate(base) + \" on \" + id,\n            \"https://github.com/$id/commit/$base\")\n        )\n    }\n\n    private fun refreshCommit() {\n        refreshCommitTaskFactory.create(activity, repository, base)\n            .refresh()\n            .subscribeOn(Schedulers.io())\n            .observeOn(AndroidSchedulers.mainThread())\n            .`as`(AutoDisposeUtils.bindToLifecycle(this))\n            .subscribe({ full ->\n                val files = full.commit.files()\n                diffStyler!!.setFiles(files)\n                if (files != null) {\n                    Collections.sort(files, CommitFileComparator())\n                }\n\n                updateList(full.commit, full, full.files)\n            }, { e ->\n                ToastUtils.show(activity, R.string.error_commit_load)\n                pb_loading.visibility = View.GONE\n            })\n    }\n\n    private fun addCommitParents(commit: Commit) {\n        val parents = commit.parents()\n        if (parents == null || parents.isEmpty()) {\n            return\n        }\n\n        val items = parents.map { CommitParentItem(activity!!, it) }\n        commitSection.update(items)\n    }\n\n    private fun updateHeader(commit: Commit) {\n        pb_loading.visibility = View.GONE\n        list.visibility = View.VISIBLE\n\n        mainSection.setHeader(CommitHeaderItem(avatars, activity!!, commit))\n        addCommitParents(commit)\n    }\n\n    private fun updateList(commit: Commit, comments: MutableList<GitComment>, files: List<FullCommitFile>) {\n        if (!isAdded) {\n            return\n        }\n\n        this.commit = commit\n        this.comments = comments\n        this.files = files\n\n        updateHeader(commit)\n        mainSection.removeFooter()\n\n        filesSection.setHeader(\n            TextItem(R.layout.commit_file_details_header,\n                R.id.tv_commit_file_summary, CommitUtils.formatStats(commit.files()))\n        )\n        updateItems(comments, files)\n    }\n\n    private fun updateItems(comments: List<GitComment>, files: List<FullCommitFile>) {\n        filesSection.update(createFileSections(files))\n\n        val items = comments.map { CommitCommentItem(avatars, commentImageGetter, it) }\n        commentSection.update(items)\n    }\n\n    private fun createFileSections(files: List<FullCommitFile>): List<Section> {\n        return files.map { file ->\n            val section = Section(CommitFileHeaderItem(activity!!, file.file))\n            val lines = diffStyler!!.get(file.file.filename())\n            for ((number, line) in lines.withIndex()) {\n                section.add(CommitFileLineItem(diffStyler!!, line))\n                for (comment in file.get(number)) {\n                    section.add(CommitCommentItem(avatars, commentImageGetter, comment, true))\n                }\n            }\n            section\n        }\n    }\n\n    private fun showFileOptions(line: CharSequence, position: Int, file: GitHubFile) {\n\n        val builder = MaterialDialog.Builder(activity!!)\n            .title(CommitUtils.getName(file)!!)\n\n        val dialogHolder = arrayOfNulls<MaterialDialog>(1)\n\n        val view = activity!!.layoutInflater.inflate(R.layout.diff_line_dialog, null)\n\n        val diff = view.tv_diff\n        diff.text = line\n        diffStyler!!.updateColors(line, diff)\n\n        view.tv_commit.text = getString(R.string.commit_prefix) + CommitUtils.abbreviate(commit)!!\n\n        view.ll_view_area.setOnClickListener { v ->\n            dialogHolder[0]!!.dismiss()\n            openFile(file)\n        }\n\n        view.ll_comment_area.setOnClickListener { v ->\n            dialogHolder[0]!!.dismiss()\n            startActivityForResult(CreateCommentActivity\n                .createIntent(repository, commit!!.sha(),\n                    file.filename(), position),\n                COMMENT_CREATE)\n        }\n\n        builder.customView(view, false)\n            .negativeText(R.string.cancel)\n            .onNegative { dialog, which -> dialog.dismiss() }\n\n        val dialog = builder.build()\n        dialogHolder[0] = dialog\n        dialog.setCanceledOnTouchOutside(true)\n        dialog.show()\n    }\n\n    private fun openFile(file: GitHubFile) {\n        if (!TextUtils.isEmpty(file.filename()) && !TextUtils.isEmpty(file.sha())) {\n            startActivity(CommitFileViewActivity.createIntent(repository!!, base!!, file))\n        }\n    }\n\n    /**\n     * Select previous file by scanning backwards from the current position\n     *\n     * @param position\n     * @param item\n     * @param adapter\n     */\n    private fun selectPreviousFile(position: Int, item: Any, adapter: GroupAdapter<*>) {\n        var posItem: Item<*>\n        var pos = position\n        var line: CharSequence?\n        line = item as? CharSequence\n\n        var linePosition = 0\n        while (--pos >= 0) {\n            posItem = adapter.getItem(pos)\n\n            if (posItem is CommitFileHeaderItem) {\n                if (line != null) {\n                    showFileOptions(line, linePosition, posItem.file)\n                }\n                break\n            } else if (posItem is CharSequence) {\n                if (line != null) {\n                    linePosition++\n                } else {\n                    line = posItem\n                }\n            }\n        }\n    }\n\n    override fun onItemClick(@NonNull item: Item<*>, @NonNull view: View) {\n        val position = adapter.getAdapterPosition(item)\n\n        if (item is CommitParentItem) {\n            val sha = item.commit.sha()\n            startActivity(CommitViewActivity.createIntent(repository!!, sha!!))\n        } else if (item is CommitFileHeaderItem) {\n            openFile(item.file)\n        } else if (item is CharSequence) {\n            selectPreviousFile(position, item, adapter)\n        } else if (item is CommitCommentItem) {\n            if (!TextUtils.isEmpty(item.comment.path())) {\n                selectPreviousFile(position, item, adapter)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/commit/CommitFileComparator.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.commit;\n\nimport com.meisolsson.githubsdk.model.GitHubFile;\n\nimport java.util.Comparator;\n\nimport static java.lang.String.CASE_INSENSITIVE_ORDER;\n\n\n/**\n * Comparator for commit files\n */\npublic class CommitFileComparator implements Comparator<GitHubFile> {\n\n    @Override\n    public int compare(final GitHubFile lhs, final GitHubFile rhs) {\n        String lPath = lhs.filename();\n        final int lSlash = lPath.lastIndexOf('/');\n        if (lSlash != -1) {\n            lPath = lPath.substring(lSlash + 1);\n        }\n\n        String rPath = rhs.filename();\n        final int rSlash = rPath.lastIndexOf('/');\n        if (rSlash != -1) {\n            rPath = rPath.substring(rSlash + 1);\n        }\n\n        return CASE_INSENSITIVE_ORDER.compare(lPath, rPath);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/commit/CommitFileViewActivity.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.commit\n\nimport android.content.Intent\nimport android.os.Bundle\nimport android.text.TextUtils\nimport android.util.Base64\nimport android.util.Log\nimport android.view.Menu\nimport android.view.MenuItem\nimport android.view.View\nimport androidx.core.content.edit\n\nimport com.github.pockethub.android.rx.AutoDisposeUtils\nimport com.meisolsson.githubsdk.core.ServiceGenerator\nimport com.meisolsson.githubsdk.model.GitHubFile\nimport com.meisolsson.githubsdk.model.Repository\nimport com.github.pockethub.android.Intents.Builder\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.core.commit.CommitUtils\nimport com.github.pockethub.android.ui.base.BaseActivity\nimport com.github.pockethub.android.util.MarkdownLoader\nimport com.github.pockethub.android.util.HttpImageGetter\nimport com.github.pockethub.android.util.InfoUtils\nimport com.github.pockethub.android.util.MarkdownUtils\nimport com.github.pockethub.android.util.PreferenceUtils\nimport com.github.pockethub.android.util.ShareUtils\nimport com.github.pockethub.android.util.SourceEditor\nimport com.github.pockethub.android.util.ToastUtils\nimport com.meisolsson.githubsdk.model.git.GitBlob\nimport com.meisolsson.githubsdk.service.git.GitService\nimport javax.inject.Inject\n\nimport io.reactivex.android.schedulers.AndroidSchedulers\nimport io.reactivex.schedulers.Schedulers\n\nimport com.github.pockethub.android.Intents.EXTRA_BASE\nimport com.github.pockethub.android.Intents.EXTRA_HEAD\nimport com.github.pockethub.android.Intents.EXTRA_PATH\nimport com.github.pockethub.android.Intents.EXTRA_REPOSITORY\nimport com.github.pockethub.android.util.PreferenceUtils.RENDER_MARKDOWN\nimport com.github.pockethub.android.util.PreferenceUtils.WRAP\nimport kotlinx.android.synthetic.main.activity_commit_file_view.*\n\n/**\n * Activity to display the contents of a file in a commit\n */\nclass CommitFileViewActivity : BaseActivity() {\n\n    @Inject\n    lateinit var imageGetter: HttpImageGetter\n\n    private var repo: Repository? = null\n\n    private var commit: String? = null\n\n    private var sha: String? = null\n\n    private var path: String? = null\n\n    private var file: String? = null\n\n    private var isMarkdownFile: Boolean = false\n\n    private var renderedMarkdown: String? = null\n\n    private var blob: GitBlob? = null\n\n    private var markdownItem: MenuItem? = null\n\n    private lateinit var editor: SourceEditor\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_commit_file_view)\n\n        repo = intent.getParcelableExtra(EXTRA_REPOSITORY)\n        commit = intent.getStringExtra(EXTRA_HEAD)\n        sha = intent.getStringExtra(EXTRA_BASE)\n        path = intent.getStringExtra(EXTRA_PATH)\n\n        file = CommitUtils.getName(path)\n        isMarkdownFile = MarkdownUtils.isMarkdown(file)\n        editor = SourceEditor(wv_code)\n        editor.wrap = PreferenceUtils.getCodePreferences(this).getBoolean(WRAP, false)\n\n        val actionBar = supportActionBar!!\n        val lastSlash = path!!.lastIndexOf('/')\n        if (lastSlash != -1) {\n            actionBar.title = path!!.substring(lastSlash + 1)\n        } else {\n            actionBar.title = path\n        }\n        actionBar.subtitle = getString(R.string.commit_prefix) + CommitUtils.abbreviate(commit)!!\n\n        loadContent()\n    }\n\n    override fun onCreateOptionsMenu(optionsMenu: Menu): Boolean {\n        menuInflater.inflate(R.menu.activity_file_view, optionsMenu)\n\n        val wrapItem = optionsMenu.findItem(R.id.m_wrap)\n        if (PreferenceUtils.getCodePreferences(this).getBoolean(WRAP, false)) {\n            wrapItem.setTitle(R.string.disable_wrapping)\n        } else {\n            wrapItem.setTitle(R.string.enable_wrapping)\n        }\n\n        markdownItem = optionsMenu.findItem(R.id.m_render_markdown)\n        if (isMarkdownFile) {\n            markdownItem!!.isEnabled = blob != null\n            markdownItem!!.isVisible = true\n            if (PreferenceUtils.getCodePreferences(this).getBoolean(\n                    RENDER_MARKDOWN, true)) {\n                markdownItem!!.setTitle(R.string.show_raw_markdown)\n            } else {\n                markdownItem!!.setTitle(R.string.render_markdown)\n            }\n        }\n\n        return true\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        when (item.itemId) {\n            R.id.m_wrap -> {\n                if (editor.wrap) {\n                    item.setTitle(R.string.enable_wrapping)\n                } else {\n                    item.setTitle(R.string.disable_wrapping)\n                }\n                editor.toggleWrap()\n                PreferenceUtils.getCodePreferences(this).edit {\n                    putBoolean(WRAP, editor.wrap)\n                }\n                return true\n            }\n\n            R.id.m_share -> {\n                shareFile()\n                return true\n            }\n\n            R.id.m_render_markdown -> {\n                if (editor.isMarkdown) {\n                    item.setTitle(R.string.render_markdown)\n                    editor.toggleMarkdown()\n                    editor.setSource(file, blob)\n                } else {\n                    item.setTitle(R.string.show_raw_markdown)\n                    editor.toggleMarkdown()\n                    if (renderedMarkdown != null) {\n                        editor.setSource(file, renderedMarkdown, false)\n                    } else {\n                        loadMarkdown()\n                    }\n                }\n                PreferenceUtils.getCodePreferences(this).edit {\n                    putBoolean(RENDER_MARKDOWN, editor.isMarkdown)\n                }\n                return true\n            }\n\n            else -> return super.onOptionsItemSelected(item)\n        }\n    }\n\n    private fun shareFile() {\n        val id = InfoUtils.createRepoId(repo!!)\n        startActivity(ShareUtils.create(\n            path + \" at \" + CommitUtils.abbreviate(commit) + \" on \" + id,\n            \"https://github.com/\" + id + \"/blob/\" + commit + '/'.toString() + path))\n    }\n\n    private fun loadMarkdown() {\n        pb_loading.visibility = View.VISIBLE\n        wv_code.visibility = View.GONE\n\n        val markdown = String(Base64.decode(blob!!.content(), Base64.DEFAULT))\n\n        MarkdownLoader.load(this, markdown, repo, imageGetter, false)\n            .subscribeOn(Schedulers.io())\n            .observeOn(AndroidSchedulers.mainThread())\n            .subscribe({ rendered ->\n                pb_loading.visibility = View.GONE\n                wv_code.visibility = View.VISIBLE\n\n                if (!TextUtils.isEmpty(rendered)) {\n                    renderedMarkdown = rendered.toString()\n                    if (markdownItem != null) {\n                        markdownItem!!.isEnabled = true\n                    }\n                    editor!!.setMarkdown(true).setSource(file, renderedMarkdown, false)\n                }\n            }, { e -> ToastUtils.show(this, R.string.error_rendering_markdown) })\n    }\n\n    private fun loadContent() {\n        ServiceGenerator.createService(this, GitService::class.java)\n            .getGitBlob(repo!!.owner()!!.login(), repo!!.name(), sha)\n            .subscribeOn(Schedulers.io())\n            .observeOn(AndroidSchedulers.mainThread())\n            .`as`(AutoDisposeUtils.bindToLifecycle(this))\n            .subscribe({ response ->\n                val gitBlob = response.body()\n                pb_loading.visibility = View.GONE\n                wv_code.visibility = View.VISIBLE\n\n                editor.setSource(path, gitBlob)\n                blob = gitBlob\n\n                if (markdownItem != null) {\n                    markdownItem!!.isEnabled = true\n                }\n\n                if (isMarkdownFile && PreferenceUtils.getCodePreferences(this).getBoolean(\n                        RENDER_MARKDOWN, true)) {\n                    loadMarkdown()\n                } else {\n                    pb_loading.visibility = View.GONE\n                    wv_code.visibility = View.VISIBLE\n                    editor.setSource(path, gitBlob)\n                }\n            }, { error ->\n                Log.e(TAG, \"Loading commit file contents failed\", error)\n\n                pb_loading.visibility = View.GONE\n                wv_code.visibility = View.VISIBLE\n                ToastUtils.show(this, R.string.error_file_load)\n            })\n    }\n\n    companion object {\n\n        private val TAG = \"CommitFileViewActivity\"\n\n        private val ARG_TEXT = \"text\"\n\n        private val ARG_REPO = \"repo\"\n\n        /**\n         * Create intent to show file in commit\n         *\n         * @param repository\n         * @param commit\n         * @param file\n         * @return intent\n         */\n        fun createIntent(repository: Repository, commit: String, file: GitHubFile): Intent {\n            val builder = Builder(\"commit.file.VIEW\")\n            builder.repo(repository)\n            builder.add(EXTRA_HEAD, commit)\n            builder.add(EXTRA_PATH, file.filename())\n            builder.add(EXTRA_BASE, file.sha())\n            return builder.toIntent()\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/commit/CommitListFragment.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.commit\n\nimport android.app.Activity\nimport android.app.Activity.RESULT_OK\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Bundle\nimport android.text.TextUtils\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport com.github.pockethub.android.Intents.EXTRA_REPOSITORY\nimport com.github.pockethub.android.ui.helpers.ItemListHandler\nimport com.github.pockethub.android.ui.helpers.PagedListFetcher\nimport com.github.pockethub.android.ui.helpers.PagedScrollListener\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.RequestCodes.COMMIT_VIEW\nimport com.github.pockethub.android.RequestCodes.REF_UPDATE\nimport com.github.pockethub.android.core.commit.CommitStore\nimport com.github.pockethub.android.core.ref.RefUtils\nimport com.github.pockethub.android.ui.base.BaseActivity\nimport com.github.pockethub.android.ui.DialogResultListener\nimport com.github.pockethub.android.ui.base.BaseFragment\nimport com.github.pockethub.android.ui.item.commit.CommitItem\nimport com.github.pockethub.android.ui.ref.RefDialog\nimport com.github.pockethub.android.ui.ref.RefDialogFragment\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.github.pockethub.android.util.ToastUtils\nimport com.meisolsson.githubsdk.model.Commit\nimport com.meisolsson.githubsdk.model.Page\nimport com.meisolsson.githubsdk.model.Repository\nimport com.meisolsson.githubsdk.model.git.GitReference\nimport com.meisolsson.githubsdk.service.repositories.RepositoryCommitService\nimport com.meisolsson.githubsdk.service.repositories.RepositoryService\nimport com.xwray.groupie.Item\nimport com.xwray.groupie.OnItemClickListener\nimport io.reactivex.Single\nimport kotlinx.android.synthetic.main.fragment_commit_list.view.*\nimport kotlinx.android.synthetic.main.ref_footer.view.*\nimport retrofit2.Response\nimport javax.inject.Inject\n\n/**\n * Fragment to display a list of repo commits\n */\nclass CommitListFragment : BaseFragment(), DialogResultListener {\n\n    @Inject\n    protected lateinit var service: RepositoryCommitService\n\n    @Inject\n    protected lateinit var repoService: RepositoryService\n\n    /**\n     * Avatar loader\n     */\n    @Inject\n    protected lateinit var avatars: AvatarLoader\n\n    @Inject\n    protected lateinit var store: CommitStore\n\n    protected lateinit var pagedListFetcher: PagedListFetcher<Commit>\n\n    protected lateinit var itemListHandler: ItemListHandler\n\n    private var repo: Repository? = null\n\n    private var dialog: RefDialog? = null\n\n    private var ref: String? = null\n\n    protected val errorMessage: Int\n        get() = R.string.error_commits_load\n\n    override fun onAttach(context: Context) {\n        super.onAttach(context)\n\n        val activity = context as Activity?\n        repo = activity!!.intent.getParcelableExtra(EXTRA_REPOSITORY)\n    }\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? {\n        return inflater.inflate(R.layout.fragment_commit_list, container, false)\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        itemListHandler = ItemListHandler(\n            view.list,\n            view.empty,\n            lifecycle,\n            activity,\n            OnItemClickListener(this::onItemClick)\n        )\n\n        pagedListFetcher = PagedListFetcher(\n            view.swipe_item,\n            lifecycle,\n            itemListHandler,\n            { t -> ToastUtils.show(activity, errorMessage) },\n            this::loadData,\n            this::createItem\n        )\n        pagedListFetcher.onPageLoaded = this::onPageLoaded\n\n        view.list.addOnScrollListener(\n            PagedScrollListener(itemListHandler.mainSection, pagedListFetcher)\n        )\n        itemListHandler.setEmptyText(R.string.no_commits)\n\n        view.rl_branch.setOnClickListener { switchRefs()}\n        view.rl_branch.visibility = View.VISIBLE\n    }\n\n    private fun loadData(page: Int): Single<Response<Page<Commit>>> {\n        val refSingle: Single<String>\n        if (TextUtils.isEmpty(ref)) {\n            val defaultBranch = repo!!.defaultBranch()\n            refSingle = if (TextUtils.isEmpty(defaultBranch)) {\n                repoService.getRepository(repo!!.owner()!!.login(), repo!!.name())\n                    .map { it.body()!!.defaultBranch() }\n                    .map {\n                        return@map if (TextUtils.isEmpty(it)) {\n                            \"master\"\n                        } else {\n                            it\n                        }\n                    }\n            } else {\n                Single.just(defaultBranch!!)\n            }\n        } else {\n            refSingle = Single.just(ref!!)\n        }\n\n        return refSingle\n            .map { ref ->\n                this@CommitListFragment.ref = ref\n                ref\n            }\n            .flatMap { branch ->\n                service.getCommits(repo!!.owner()!!.login(), repo!!.name(), branch, page.toLong())\n            }\n    }\n\n    protected fun createItem(dataItem: Commit): Item<*> {\n        return CommitItem(avatars, dataItem)\n    }\n\n    protected fun onPageLoaded(items: MutableList<Item<*>>): MutableList<Item<*>> {\n        if (ref != null) {\n            updateRefLabel()\n        }\n\n        return items\n    }\n\n    fun onItemClick(item: Item<*>, view: View) {\n        if (item is CommitItem) {\n            val position = itemListHandler.getItemPosition(item)\n            startActivityForResult(\n                CommitViewActivity.createIntent(repo!!, position, itemListHandler.items),\n                COMMIT_VIEW\n            )\n        }\n    }\n\n    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {\n        if (requestCode == COMMIT_VIEW) {\n            itemListHandler.mainSection.notifyChanged()\n            return\n        }\n\n        super.onActivityResult(requestCode, resultCode, data)\n    }\n\n    override fun onDialogResult(requestCode: Int, resultCode: Int, arguments: Bundle) {\n        if (RESULT_OK != resultCode) {\n            return\n        }\n\n        when (requestCode) {\n            REF_UPDATE -> setRef(RefDialogFragment.getSelected(arguments))\n        }\n    }\n\n    private fun updateRefLabel() {\n        view!!.tv_branch.text = RefUtils.getName(ref)\n        if (RefUtils.isTag(ref)) {\n            view!!.tv_branch_icon.setText(R.string.icon_tag)\n        } else {\n            view!!.tv_branch_icon.setText(R.string.icon_fork)\n        }\n    }\n\n    private fun setRef(ref: GitReference) {\n        this.ref = ref.ref()\n        updateRefLabel()\n        pagedListFetcher.refresh()\n    }\n\n    fun switchRefs() {\n        if (ref == null) {\n            return\n        }\n\n        if (dialog == null) {\n            dialog = RefDialog(activity as BaseActivity?,\n                REF_UPDATE, repo)\n        }\n        val reference = GitReference.builder()\n            .ref(ref)\n            .build()\n        dialog!!.show(reference)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/commit/CommitPagerAdapter.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.commit;\n\nimport android.os.Bundle;\nimport androidx.fragment.app.Fragment;\nimport androidx.appcompat.app.AppCompatActivity;\n\nimport com.meisolsson.githubsdk.model.Repository;\nimport com.github.pockethub.android.ui.base.FragmentStatePagerAdapter;\n\nimport static com.github.pockethub.android.Intents.EXTRA_BASE;\nimport static com.github.pockethub.android.Intents.EXTRA_REPOSITORY;\n\n/**\n * Pager over commits\n */\npublic class CommitPagerAdapter extends FragmentStatePagerAdapter {\n\n    private final Repository repository;\n\n    private final CharSequence[] ids;\n\n    /**\n     * @param activity\n     * @param repository\n     * @param ids\n     */\n    public CommitPagerAdapter(AppCompatActivity activity,\n            Repository repository, CharSequence[] ids) {\n        super(activity);\n\n        this.repository = repository;\n        this.ids = ids;\n    }\n\n    @Override\n    public Fragment getItem(final int position) {\n        Bundle arguments = new Bundle();\n        arguments.putString(EXTRA_BASE, ids[position].toString());\n        arguments.putParcelable(EXTRA_REPOSITORY, repository);\n        CommitDiffListFragment fragment = new CommitDiffListFragment();\n        fragment.setArguments(arguments);\n        return fragment;\n    }\n\n    @Override\n    public int getCount() {\n        return ids.length;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/commit/CommitViewActivity.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.commit\n\nimport android.content.Intent\nimport android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP\nimport android.content.Intent.FLAG_ACTIVITY_SINGLE_TOP\nimport android.os.Bundle\nimport android.view.MenuItem\nimport com.github.pockethub.android.Intents.Builder\nimport com.github.pockethub.android.Intents.EXTRA_BASES\nimport com.github.pockethub.android.Intents.EXTRA_POSITION\nimport com.github.pockethub.android.Intents.EXTRA_REPOSITORY\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.core.commit.CommitUtils\nimport com.github.pockethub.android.ui.base.BaseActivity\nimport com.github.pockethub.android.ui.helpers.PagerHandler\nimport com.github.pockethub.android.ui.item.commit.CommitItem\nimport com.github.pockethub.android.ui.repo.RepositoryViewActivity\nimport com.github.pockethub.android.util.InfoUtils\nimport com.meisolsson.githubsdk.model.Repository\nimport com.xwray.groupie.Item\nimport kotlinx.android.synthetic.main.activity_pager.*\n\n/**\n * Activity to display a commit\n */\nclass CommitViewActivity : BaseActivity() {\n\n    private var repository: Repository? = null\n\n    private var ids: Array<CharSequence>? = null\n\n    private var initialPosition: Int = 0\n\n    private lateinit var pagerHandler: PagerHandler<CommitPagerAdapter>\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_pager)\n\n        repository = intent.getParcelableExtra(EXTRA_REPOSITORY)\n        ids = intent.getCharSequenceArrayExtra(EXTRA_BASES)\n        initialPosition = intent.getIntExtra(EXTRA_POSITION, -1)\n\n        val adapter = CommitPagerAdapter(this, repository, ids)\n        pagerHandler = PagerHandler(this, vp_pages, adapter)\n        lifecycle.addObserver(pagerHandler)\n\n        pagerHandler.onPagedChanged = this::onPageChanged\n        vp_pages.scheduleSetItem(initialPosition, pagerHandler)\n        onPageChanged(initialPosition)\n\n        val actionBar = supportActionBar!!\n        actionBar.setDisplayHomeAsUpEnabled(true)\n        actionBar.subtitle = InfoUtils.createRepoId(repository!!)\n    }\n\n    override fun onDestroy() {\n        super.onDestroy()\n        lifecycle.removeObserver(pagerHandler)\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        return when (item.itemId) {\n            android.R.id.home -> {\n                val intent = RepositoryViewActivity.createIntent(repository!!)\n                intent.addFlags(FLAG_ACTIVITY_CLEAR_TOP or FLAG_ACTIVITY_SINGLE_TOP)\n                startActivity(intent)\n                true\n            }\n            else -> super.onOptionsItemSelected(item)\n        }\n    }\n\n    private fun onPageChanged(position: Int) {\n        val id = CommitUtils.abbreviate(ids!![position].toString())\n        supportActionBar!!.title = getString(R.string.commit_prefix) + id!!\n    }\n\n    companion object {\n\n        /**\n         * Create intent for this activity\n         *\n         * @param repository\n         * @param id\n         * @return intent\n         */\n        fun createIntent(repository: Repository,\n            id: String): Intent {\n            return createIntent(repository, 0, id)\n        }\n\n        /**\n         * Create intent for this activity\n         *\n         * @param repository\n         * @param position\n         * @param commits\n         * @return intent\n         */\n        fun createIntent(\n            repository: Repository,\n            position: Int,\n            commits: Collection<Item<*>>\n        ): Intent {\n            val ids = commits.map { (it as CommitItem).commit.sha()!! }.toTypedArray()\n            return createIntent(repository, position, *ids)\n        }\n\n        /**\n         * Create intent for this activity\n         *\n         * @param repository\n         * @param position\n         * @param ids\n         * @return intent\n         */\n        fun createIntent(repository: Repository, position: Int, vararg ids: String): Intent {\n            val builder = Builder(\"commits.VIEW\")\n            builder.add(EXTRA_POSITION, position)\n            builder.add(EXTRA_BASES, ids)\n            builder.repo(repository)\n            return builder.toIntent()\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/commit/CreateCommentActivity.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.commit;\n\nimport android.content.Intent;\nimport android.os.Bundle;\nimport androidx.appcompat.app.ActionBar;\nimport android.text.TextUtils;\n\nimport com.github.pockethub.android.rx.AutoDisposeUtils;\nimport com.github.pockethub.android.rx.RxProgress;\nimport com.meisolsson.githubsdk.core.ServiceGenerator;\nimport com.meisolsson.githubsdk.model.Repository;\nimport com.github.pockethub.android.Intents.Builder;\nimport com.github.pockethub.android.R;\nimport com.github.pockethub.android.core.commit.CommitUtils;\nimport com.github.pockethub.android.ui.comment.CommentPreviewPagerAdapter;\nimport com.github.pockethub.android.util.InfoUtils;\nimport com.github.pockethub.android.util.ToastUtils;\nimport com.meisolsson.githubsdk.model.request.repository.CreateCommitComment;\nimport com.meisolsson.githubsdk.service.repositories.RepositoryCommentService;\n\nimport io.reactivex.android.schedulers.AndroidSchedulers;\nimport io.reactivex.schedulers.Schedulers;\n\nimport static com.github.pockethub.android.Intents.EXTRA_BASE;\nimport static com.github.pockethub.android.Intents.EXTRA_PATH;\nimport static com.github.pockethub.android.Intents.EXTRA_POSITION;\nimport static com.github.pockethub.android.Intents.EXTRA_REPOSITORY;\n\n/**\n * Activity to create a comment on a commit\n */\npublic class CreateCommentActivity extends\n        com.github.pockethub.android.ui.comment.CreateCommentActivity {\n\n    /**\n     * Create intent to create a comment\n     *\n     * @param repository\n     * @param commit\n     * @return intent\n     */\n    public static Intent createIntent(Repository repository, String commit) {\n        return createIntent(repository, commit, null, -1);\n    }\n\n    /**\n     * Create intent to create a comment on a diff position\n     *\n     * @param repository\n     * @param commit\n     * @param path\n     * @param position\n     * @return intent\n     */\n    public static Intent createIntent(Repository repository, String commit,\n            String path, int position) {\n        Builder builder = new Builder(\"commit.comment.create.VIEW\");\n        builder.repo(repository);\n        builder.add(EXTRA_BASE, commit);\n        if (isLineComment(path, position)) {\n            builder.add(EXTRA_PATH, path).add(EXTRA_POSITION, position);\n        }\n        return builder.toIntent();\n    }\n\n    private static boolean isLineComment(final String path, final int position) {\n        return !TextUtils.isEmpty(path) && position > -1;\n    }\n\n    private Repository repository;\n\n    private String commit;\n\n    private int position;\n\n    private String path;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        repository = getIntent().getParcelableExtra(EXTRA_REPOSITORY);\n        commit = getIntent().getStringExtra(EXTRA_BASE);\n        position = getIntent().getIntExtra(EXTRA_POSITION, -1);\n        path = getIntent().getStringExtra(EXTRA_PATH);\n\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.pager_with_tabs);\n\n        ActionBar actionBar = getSupportActionBar();\n        actionBar.setTitle(getString(R.string.commit_prefix)\n                + CommitUtils.abbreviate(commit));\n        actionBar.setSubtitle(InfoUtils.createRepoId(repository));\n    }\n\n    @Override\n    protected void createComment(final String comment) {\n        CreateCommitComment.Builder commitCommentBuilder = CreateCommitComment.builder()\n                .body(comment);\n\n\n        if(isLineComment(path, position)) {\n            commitCommentBuilder.path(path).position(position);\n        }\n\n        ServiceGenerator.createService(this, RepositoryCommentService.class)\n                .createCommitComment(repository.owner().login(), repository.name(), commit, commitCommentBuilder.build())\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .compose(RxProgress.bindToLifecycle(this, R.string.creating_comment))\n                .as(AutoDisposeUtils.bindToLifecycle(this))\n                .subscribe(response -> finish(response.body()),\n                        e -> ToastUtils.show(this, e.getMessage()));\n    }\n\n    @Override\n    protected CommentPreviewPagerAdapter createAdapter() {\n        return new CommentPreviewPagerAdapter(this, repository);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/commit/DiffStyler.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.commit;\n\nimport android.content.res.Resources;\nimport android.text.TextUtils;\nimport android.widget.TextView;\n\nimport com.github.pockethub.android.R;\nimport com.meisolsson.githubsdk.model.GitHubFile;\n\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * Styler for the file diffs introduced in a commit\n */\npublic class DiffStyler {\n\n    private final Map<String, List<CharSequence>> diffs = new HashMap<>();\n\n    private final int markerColor;\n\n    private final int defaultColor;\n\n    /**\n     * Create diff styler\n     *\n     * @param resources\n     */\n    public DiffStyler(final Resources resources) {\n        markerColor = resources.getColor(R.color.diff_marker_text);\n        defaultColor = resources.getColor(R.color.text);\n    }\n\n    private int nextLine(final String patch, final int start, final int length) {\n        final int end = patch.indexOf('\\n', start);\n        if (end != -1) {\n            return end;\n        } else {\n            return length;\n        }\n    }\n\n    /**\n     * Style view for line\n     *\n     * @param line\n     * @param view\n     */\n    public void updateColors(final CharSequence line, final TextView view) {\n        if (TextUtils.isEmpty(line)) {\n            view.setBackgroundResource(R.drawable.list_item_background);\n            view.setTextColor(defaultColor);\n            return;\n        }\n\n        switch (line.charAt(0)) {\n        case '@':\n            view.setBackgroundResource(R.drawable.diff_marker_background);\n            view.setTextColor(markerColor);\n            return;\n        case '+':\n            view.setBackgroundResource(R.drawable.diff_add_background);\n            view.setTextColor(defaultColor);\n            return;\n        case '-':\n            view.setBackgroundResource(R.drawable.diff_remove_background);\n            view.setTextColor(defaultColor);\n            return;\n        default:\n            view.setBackgroundResource(R.drawable.list_item_background);\n            view.setTextColor(defaultColor);\n        }\n    }\n\n    /**\n     * Set files to styler\n     *\n     * @param files\n     * @return this styler\n     */\n    public DiffStyler setFiles(final Collection<GitHubFile> files) {\n        diffs.clear();\n        if (files == null || files.isEmpty()) {\n            return this;\n        }\n\n        for (GitHubFile file : files) {\n            String patch = file.patch();\n            if (TextUtils.isEmpty(patch)) {\n                continue;\n            }\n\n            int start = 0;\n            int length = patch.length();\n            int end = nextLine(patch, start, length);\n            List<CharSequence> lines = new ArrayList<>();\n            while (start < length) {\n                lines.add(patch.substring(start, end));\n                start = end + 1;\n                end = nextLine(patch, start, length);\n            }\n            diffs.put(file.filename(), lines);\n        }\n        return this;\n    }\n\n    /**\n     * Get lines for file path\n     *\n     * @param file\n     * @return styled text\n     */\n    public List<CharSequence> get(final String file) {\n        if (TextUtils.isEmpty(file)) {\n            return Collections.emptyList();\n        }\n        List<CharSequence> lines = diffs.get(file);\n        return lines != null ? lines : Collections.emptyList();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/gist/CreateCommentActivity.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.gist;\n\nimport android.content.Intent;\nimport android.os.Bundle;\nimport androidx.appcompat.app.ActionBar;\nimport android.util.Log;\n\nimport com.github.pockethub.android.rx.AutoDisposeUtils;\nimport com.meisolsson.githubsdk.core.ServiceGenerator;\nimport com.meisolsson.githubsdk.model.Gist;\nimport com.meisolsson.githubsdk.model.User;\nimport com.github.pockethub.android.Intents.Builder;\nimport com.github.pockethub.android.R;\nimport com.github.pockethub.android.util.ToastUtils;\nimport com.meisolsson.githubsdk.model.request.CommentRequest;\nimport com.meisolsson.githubsdk.service.gists.GistCommentService;\n\nimport io.reactivex.android.schedulers.AndroidSchedulers;\nimport io.reactivex.schedulers.Schedulers;\n\nimport static com.github.pockethub.android.Intents.EXTRA_GIST;\n\n/**\n * Activity to create a comment on a {@link Gist}\n */\npublic class CreateCommentActivity extends\n        com.github.pockethub.android.ui.comment.CreateCommentActivity {\n\n    /**\n     * Create intent to create a comment\n     *\n     * @param gist\n     * @return intent\n     */\n    public static Intent createIntent(Gist gist) {\n        Builder builder = new Builder(\"gist.comment.create.VIEW\");\n        builder.gist(gist);\n        return builder.toIntent();\n    }\n\n    private Gist gist;\n\n    private String TAG = \"CreateCommentActivity\";\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.pager_with_tabs);\n\n        gist = getIntent().getParcelableExtra(EXTRA_GIST);\n\n        ActionBar actionBar = getSupportActionBar();\n        actionBar.setTitle(getString(R.string.gist_title) + gist.id());\n        User user = gist.owner();\n        if (user != null) {\n            actionBar.setSubtitle(user.login());\n        }\n    }\n\n    @Override\n    protected void createComment(final String comment) {\n        CommentRequest commentRequest = CommentRequest.builder()\n                .body(comment)\n                .build();\n\n        ServiceGenerator.createService(this, GistCommentService.class)\n                .createGistComment(gist.id(), commentRequest)\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .as(AutoDisposeUtils.bindToLifecycle(this))\n                .subscribe(response -> finish(response.body()), error -> {\n                    Log.e(TAG, \"Exception creating comment on gist\", error);\n\n                    ToastUtils.show(this, error.getMessage());\n                });\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/gist/CreateGistActivity.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.gist\n\nimport android.os.Bundle\nimport android.text.TextUtils\nimport android.util.Log\nimport android.view.Menu\nimport android.view.MenuItem\nimport android.view.View\nimport android.view.View.OnFocusChangeListener\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.rx.AutoDisposeUtils\nimport com.github.pockethub.android.rx.RxProgress\nimport com.github.pockethub.android.ui.base.BaseActivity\nimport com.github.pockethub.android.ui.TextWatcherAdapter\nimport com.github.pockethub.android.util.ShareUtils\nimport com.github.pockethub.android.util.ToastUtils\nimport com.meisolsson.githubsdk.core.ServiceGenerator\nimport com.meisolsson.githubsdk.model.GistFile\nimport com.meisolsson.githubsdk.model.request.gist.CreateGist\nimport com.meisolsson.githubsdk.service.gists.GistService\nimport io.reactivex.android.schedulers.AndroidSchedulers\nimport io.reactivex.schedulers.Schedulers\nimport kotlinx.android.synthetic.main.activity_gist_create.*\nimport java.util.HashMap\n\n/**\n * Activity to share a text selection as a public or private Gist\n */\nclass CreateGistActivity : BaseActivity() {\n\n    private var menuItem: MenuItem? = null\n\n    private val expandAppBarOnFocusChangeListener =\n        OnFocusChangeListener { v: View, hasFocus: Boolean ->\n            if (hasFocus) {\n                appbar.setExpanded(true)\n            }\n        }\n\n    private val expandAppBarOnChange = object : TextWatcherAdapter() {\n        override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {\n            appbar.setExpanded(true)\n        }\n    }\n\n    private val onContentTextChange = object : TextWatcherAdapter() {\n        override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {\n            updateCreateMenu()\n        }\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_gist_create)\n\n        supportActionBar!!.setDisplayHomeAsUpEnabled(true)\n\n        val text = ShareUtils.getBody(intent)\n        if (!TextUtils.isEmpty(text)) {\n            et_gist_content.setText(text)\n        }\n\n        val subject = ShareUtils.getSubject(intent)\n        if (!TextUtils.isEmpty(subject)) {\n            et_gist_description.setText(subject)\n        }\n\n        et_gist_description.onFocusChangeListener = expandAppBarOnFocusChangeListener\n        et_gist_name.onFocusChangeListener = expandAppBarOnFocusChangeListener\n        cb_public.onFocusChangeListener = expandAppBarOnFocusChangeListener\n\n        cb_public.setOnCheckedChangeListener { buttonView, isChecked -> appbar.setExpanded(true) }\n\n        et_gist_description.addTextChangedListener(expandAppBarOnChange)\n        et_gist_name.addTextChangedListener(expandAppBarOnChange)\n        cb_public.addTextChangedListener(expandAppBarOnChange)\n\n        et_gist_content.addTextChangedListener(onContentTextChange)\n\n        updateCreateMenu()\n    }\n\n    override fun onDestroy() {\n        super.onDestroy()\n        et_gist_description.removeTextChangedListener(expandAppBarOnChange)\n        et_gist_name.removeTextChangedListener(expandAppBarOnChange)\n        cb_public.removeTextChangedListener(expandAppBarOnChange)\n\n        et_gist_content.removeTextChangedListener(onContentTextChange)\n    }\n\n    override fun onCreateOptionsMenu(menu: Menu): Boolean {\n        super.onCreateOptionsMenu(menu)\n        menuInflater.inflate(R.menu.activity_create_gist, menu)\n        menuItem = menu.findItem(R.id.create_gist)\n        updateCreateMenu()\n        return true\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        return when (item.itemId) {\n            R.id.create_gist -> {\n                createGist()\n                true\n            }\n            android.R.id.home -> {\n                finish()\n                true\n            }\n            else -> super.onOptionsItemSelected(item)\n        }\n    }\n\n    private fun updateCreateMenu(text: CharSequence = et_gist_content.text) {\n        if (menuItem != null) {\n            menuItem!!.isEnabled = !TextUtils.isEmpty(text)\n        }\n    }\n\n    private fun createGist() {\n        val isPublic = cb_public.isChecked\n\n        val enteredDescription = et_gist_description.text.toString().trim { it <= ' ' }\n        val description = if (enteredDescription.isNotEmpty())\n            enteredDescription\n        else\n            getString(R.string.gist_description_hint)\n\n        val enteredName = et_gist_name.text.toString().trim { it <= ' ' }\n        val name = if (enteredName.isNotEmpty())\n            enteredName\n        else\n            getString(R.string.gist_file_name_hint)\n\n        val content = et_gist_content.text.toString()\n        val map = HashMap<String, GistFile>()\n        map[name] = GistFile.builder().filename(name).content(content).build()\n\n        val createGist = CreateGist.builder()\n            .files(map)\n            .description(description)\n            .isPublic(isPublic)\n            .build()\n\n        ServiceGenerator.createService(this, GistService::class.java)\n            .createGist(createGist)\n            .subscribeOn(Schedulers.io())\n            .observeOn(AndroidSchedulers.mainThread())\n            .compose(RxProgress.bindToLifecycle(this, R.string.creating_gist))\n            .`as`(AutoDisposeUtils.bindToLifecycle(this))\n            .subscribe({ response ->\n                startActivity(GistsViewActivity.createIntent(response.body()!!))\n                setResult(RESULT_OK)\n                finish()\n            }, { e ->\n                Log.d(TAG, \"Exception creating Gist\", e)\n                ToastUtils.show(this, e.message)\n            })\n    }\n\n    companion object {\n\n        private val TAG = \"CreateGistActivity\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/gist/EditCommentActivity.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.gist;\n\nimport android.content.Intent;\nimport android.os.Bundle;\nimport androidx.appcompat.app.ActionBar;\nimport android.util.Log;\n\nimport com.github.pockethub.android.rx.AutoDisposeUtils;\nimport com.github.pockethub.android.rx.RxProgress;\nimport com.meisolsson.githubsdk.core.ServiceGenerator;\nimport com.meisolsson.githubsdk.model.Gist;\nimport com.meisolsson.githubsdk.model.GitHubComment;\nimport com.meisolsson.githubsdk.model.User;\nimport com.github.pockethub.android.Intents.Builder;\nimport com.github.pockethub.android.R;\nimport com.github.pockethub.android.ui.comment.CommentPreviewPagerAdapter;\nimport com.github.pockethub.android.util.ToastUtils;\nimport com.meisolsson.githubsdk.model.request.CommentRequest;\nimport com.meisolsson.githubsdk.service.gists.GistCommentService;\n\nimport io.reactivex.android.schedulers.AndroidSchedulers;\nimport io.reactivex.schedulers.Schedulers;\n\nimport static com.github.pockethub.android.Intents.EXTRA_COMMENT;\nimport static com.github.pockethub.android.Intents.EXTRA_GIST;\n\n/**\n * Activity to edit a comment on a {@link Gist}\n */\npublic class EditCommentActivity extends\n        com.github.pockethub.android.ui.comment.CreateCommentActivity {\n\n    private static final String TAG = \"EditCommentActivity\";\n\n    /**\n     * Create intent to edit a comment\n     *\n     * @param gist\n     * @return intent\n     */\n    public static Intent createIntent(Gist gist, GitHubComment comment) {\n        Builder builder = new Builder(\"gist.comment.edit.VIEW\");\n        builder.gist(gist);\n        builder.add(EXTRA_COMMENT, comment);\n        return builder.toIntent();\n    }\n\n    private Gist gist;\n\n    /**\n     * Comment to edit.\n     */\n    private GitHubComment comment;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        gist = getIntent().getParcelableExtra(EXTRA_GIST);\n        comment = getIntent().getParcelableExtra(EXTRA_COMMENT);\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.pager_with_tabs);\n\n        ActionBar actionBar = getSupportActionBar();\n        actionBar.setTitle(getString(R.string.gist_title) + gist.id());\n        User user = gist.owner();\n        if (user != null) {\n            actionBar.setSubtitle(user.login());\n        }\n    }\n\n    @Override\n    protected void createComment(String comment) {\n        CommentRequest commentRequest = CommentRequest.builder()\n                .body(comment)\n                .build();\n        editComment(commentRequest);\n    }\n\n    /**\n     * Edit comment.\n     *\n     * @param commentRequest\n     */\n    protected void editComment(CommentRequest commentRequest) {\n        ServiceGenerator.createService(this, GistCommentService.class)\n                .editGistComment(gist.id(), comment.id(), commentRequest)\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .compose(RxProgress.bindToLifecycle(this, R.string.editing_comment))\n                .as(AutoDisposeUtils.bindToLifecycle(this))\n                .subscribe(response -> finish(response.body()), e -> {\n                    Log.d(TAG, \"Exception editing comment on gist\", e);\n                    ToastUtils.show(this, e.getMessage());\n                });\n    }\n\n    @Override\n    protected CommentPreviewPagerAdapter createAdapter() {\n        CommentPreviewPagerAdapter commentPreviewPagerAdapter = new CommentPreviewPagerAdapter(this, null);\n        commentPreviewPagerAdapter.setCommentText(comment != null ? comment.body() : null);\n        return commentPreviewPagerAdapter;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/gist/GistFileFragment.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.gist\n\nimport android.content.Context\nimport android.content.SharedPreferences\nimport android.content.SharedPreferences.OnSharedPreferenceChangeListener\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.Menu\nimport android.view.MenuInflater\nimport android.view.MenuItem\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.core.content.edit\nimport com.github.pockethub.android.Intents.EXTRA_GIST_FILE\nimport com.github.pockethub.android.Intents.EXTRA_GIST_ID\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.core.gist.GistStore\nimport com.github.pockethub.android.ui.base.BaseFragment\nimport com.github.pockethub.android.util.PreferenceUtils\nimport com.github.pockethub.android.util.PreferenceUtils.WRAP\nimport com.github.pockethub.android.util.SourceEditor\nimport com.github.pockethub.android.util.ToastUtils\nimport com.meisolsson.githubsdk.model.GistFile\nimport io.reactivex.android.schedulers.AndroidSchedulers\nimport io.reactivex.schedulers.Schedulers\nimport kotlinx.android.synthetic.main.activity_commit_file_view.*\nimport java.io.IOException\nimport javax.inject.Inject\n\n/**\n * Fragment to display the content of a file in a Gist\n */\nclass GistFileFragment : BaseFragment(), OnSharedPreferenceChangeListener {\n\n    @Inject\n    lateinit var store: GistStore\n\n    private var gistId: String? = null\n\n    private var file: GistFile? = null\n\n    private lateinit var editor: SourceEditor\n\n    private var codePrefs: SharedPreferences? = null\n\n    private var wrapItem: MenuItem? = null\n\n    override fun onAttach(context: Context) {\n        super.onAttach(context)\n\n        gistId = activity?.intent?.getStringExtra(EXTRA_GIST_ID)\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setHasOptionsMenu(true)\n\n        file = arguments!!.get(EXTRA_GIST_FILE) as GistFile\n\n        codePrefs = PreferenceUtils.getCodePreferences(activity)\n        codePrefs!!.registerOnSharedPreferenceChangeListener(this)\n    }\n\n    override fun onDestroy() {\n        super.onDestroy()\n        codePrefs!!.unregisterOnSharedPreferenceChangeListener(this)\n    }\n\n    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {\n        super.onCreateOptionsMenu(menu, inflater)\n        inflater.inflate(R.menu.fragment_code_view, menu)\n\n        wrapItem = menu.findItem(R.id.m_wrap)\n        updateWrapItem()\n    }\n\n    private fun updateWrapItem() {\n        if (wrapItem != null) {\n            if (codePrefs!!.getBoolean(WRAP, false)) {\n                wrapItem!!.setTitle(R.string.disable_wrapping)\n            } else {\n                wrapItem!!.setTitle(R.string.enable_wrapping)\n            }\n        }\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        return when (item.itemId) {\n            R.id.m_wrap -> {\n                if (editor.wrap) {\n                    item.setTitle(R.string.enable_wrapping)\n                    editor.wrap = false\n                } else {\n                    item.setTitle(R.string.disable_wrapping)\n                    editor.wrap = true\n                }\n                codePrefs!!.edit {\n                    putBoolean(WRAP, editor.wrap)\n                }\n                true\n            }\n            else -> super.onOptionsItemSelected(item)\n        }\n    }\n\n    private fun loadSource() {\n        store.refreshGist(gistId)\n            .map { gist ->\n                val files = gist.files() ?: throw IOException()\n\n                val loadedFile = files[file!!.filename()] ?: throw IOException()\n\n                loadedFile\n            }\n            .subscribeOn(Schedulers.io())\n            .observeOn(AndroidSchedulers.mainThread())\n            .subscribe({ loadedFile ->\n                file = loadedFile\n                arguments!!.putParcelable(EXTRA_GIST_FILE, file)\n                if (file!!.content() != null) {\n                    showSource()\n                }\n            }, { e -> ToastUtils.show(activity, R.string.error_gist_file_load) })\n    }\n\n    private fun showSource() {\n        editor.setSource(file!!.filename(), file!!.content(), false)\n    }\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        return inflater.inflate(R.layout.fragment_gist_file_view, container, false)\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        editor = SourceEditor(wv_code)\n        editor.wrap = PreferenceUtils.getCodePreferences(activity).getBoolean(WRAP, false)\n\n        if (file!!.content() != null) {\n            showSource()\n        } else {\n            loadSource()\n        }\n    }\n\n    override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) {\n        if (WRAP == key) {\n            updateWrapItem()\n            editor.wrap = sharedPreferences.getBoolean(WRAP, false)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/gist/GistFilesPagerAdapter.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.gist;\n\nimport android.os.Bundle;\nimport androidx.fragment.app.Fragment;\nimport androidx.appcompat.app.AppCompatActivity;\n\nimport com.github.pockethub.android.ui.base.FragmentPagerAdapter;\nimport com.meisolsson.githubsdk.model.Gist;\nimport com.meisolsson.githubsdk.model.GistFile;\n\nimport java.util.Map;\n\nimport static com.github.pockethub.android.Intents.EXTRA_GIST_FILE;\n\n/**\n * Pager adapter for all the files in a given gist\n */\npublic class GistFilesPagerAdapter extends FragmentPagerAdapter {\n\n    private final GistFile[] files;\n\n    /**\n     * @param activity\n     * @param gist\n     */\n    public GistFilesPagerAdapter(AppCompatActivity activity, Gist gist) {\n        super(activity);\n\n        Map<String, GistFile> gistFiles = gist.files();\n        if (gistFiles != null && !gistFiles.isEmpty()) {\n            files = gistFiles.values().toArray(new GistFile[gistFiles.size()]);\n        } else {\n            files = new GistFile[0];\n        }\n    }\n\n    @Override\n    public CharSequence getPageTitle(int position) {\n        return files[position].filename();\n    }\n\n    @Override\n    public Fragment getItem(final int position) {\n        GistFile file = files[position];\n        Fragment fragment = new GistFileFragment();\n        Bundle args = new Bundle();\n        args.putParcelable(EXTRA_GIST_FILE, file);\n        fragment.setArguments(args);\n        return fragment;\n    }\n\n    @Override\n    public int getCount() {\n        return files.length;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/gist/GistFilesViewActivity.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.gist\n\nimport android.content.Intent\nimport android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP\nimport android.content.Intent.FLAG_ACTIVITY_SINGLE_TOP\nimport android.os.Bundle\nimport android.view.MenuItem\nimport android.view.View\nimport com.github.pockethub.android.Intents.Builder\nimport com.github.pockethub.android.Intents.EXTRA_GIST_ID\nimport com.github.pockethub.android.Intents.EXTRA_POSITION\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.core.gist.GistStore\nimport com.github.pockethub.android.core.gist.RefreshGistTaskFactory\nimport com.github.pockethub.android.rx.AutoDisposeUtils\nimport com.github.pockethub.android.ui.base.BaseActivity\nimport com.github.pockethub.android.ui.helpers.PagerHandler\nimport com.meisolsson.githubsdk.model.Gist\nimport io.reactivex.android.schedulers.AndroidSchedulers\nimport io.reactivex.schedulers.Schedulers\nimport kotlinx.android.synthetic.main.activity_pager_with_title.*\nimport javax.inject.Inject\n\n/**\n * Activity to page through the content of all the files in a Gist\n */\nclass GistFilesViewActivity : BaseActivity() {\n\n    private var gistId: String? = null\n\n    private var initialPosition: Int = 0\n\n    private var gist: Gist? = null\n\n    @Inject\n    lateinit var store: GistStore\n\n    @Inject\n    lateinit var refreshGistTaskFactory: RefreshGistTaskFactory\n\n    private var pagerHandler: PagerHandler<GistFilesPagerAdapter>? = null\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_pager_with_title)\n\n        gistId = intent.getStringExtra(EXTRA_GIST_ID)\n        initialPosition = intent.getIntExtra(EXTRA_POSITION, -1)\n\n        if (initialPosition < 0) {\n            initialPosition = 0\n        }\n\n        supportActionBar!!.title = getString(R.string.gist_title) + gistId!!\n\n        gist = store.getGist(gistId)\n        if (gist != null) {\n            configurePager()\n        } else {\n            pb_loading.visibility = View.VISIBLE\n            vp_pages.visibility = View.GONE\n            sliding_tabs_layout.visibility = View.GONE\n            refreshGistTaskFactory.create(this, gistId)\n                .refresh()\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .`as`(AutoDisposeUtils.bindToLifecycle(this))\n                .subscribe { gist ->\n                    this.gist = gist.gist\n                    configurePager()\n                }\n        }\n    }\n\n    private fun configurePager() {\n        val actionBar = supportActionBar!!\n        actionBar.setDisplayHomeAsUpEnabled(true)\n        val author = gist!!.owner()\n        if (author != null) {\n            actionBar.subtitle = author.login()\n        } else {\n            actionBar.setSubtitle(R.string.anonymous)\n        }\n\n        pb_loading.visibility = View.GONE\n        vp_pages.visibility = View.VISIBLE\n        sliding_tabs_layout.visibility = View.VISIBLE\n\n        val adapter = GistFilesPagerAdapter(this, gist)\n        pagerHandler = PagerHandler(this, vp_pages, adapter)\n        lifecycle.addObserver(pagerHandler!!)\n        sliding_tabs_layout.setupWithViewPager(vp_pages)\n\n        if (initialPosition < adapter.count) {\n            vp_pages.scheduleSetItem(initialPosition)\n        }\n    }\n\n    override fun onDestroy() {\n        super.onDestroy()\n        lifecycle.removeObserver(pagerHandler!!)\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        return when (item.itemId) {\n            android.R.id.home -> {\n                if (gist != null) {\n                    val intent = GistsViewActivity.createIntent(gist!!)\n                    intent.addFlags(FLAG_ACTIVITY_CLEAR_TOP or FLAG_ACTIVITY_SINGLE_TOP)\n                    startActivity(intent)\n                }\n                true\n            }\n            else -> super.onOptionsItemSelected(item)\n        }\n    }\n\n    companion object {\n\n        /**\n         * Create intent to show files with an initial selected file\n         *\n         * @param gist\n         * @param position\n         * @return intent\n         */\n        fun createIntent(gist: Gist, position: Int): Intent {\n            return Builder(\"gist.files.VIEW\").gist(gist.id())\n                .add(EXTRA_POSITION, position).toIntent()\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/gist/GistFragment.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.gist\n\nimport android.app.Activity\nimport android.app.Activity.RESULT_OK\nimport android.content.Intent\nimport android.os.Bundle\nimport android.text.TextUtils\nimport android.util.Log\nimport android.view.LayoutInflater\nimport android.view.Menu\nimport android.view.MenuInflater\nimport android.view.MenuItem\nimport android.view.View\nimport android.view.View.GONE\nimport android.view.View.VISIBLE\nimport android.view.ViewGroup\nimport androidx.annotation.NonNull\nimport androidx.recyclerview.widget.DividerItemDecoration\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport com.github.pockethub.android.Intents.EXTRA_COMMENT\nimport com.github.pockethub.android.Intents.EXTRA_GIST_ID\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.RequestCodes.COMMENT_CREATE\nimport com.github.pockethub.android.RequestCodes.COMMENT_DELETE\nimport com.github.pockethub.android.RequestCodes.COMMENT_EDIT\nimport com.github.pockethub.android.accounts.AccountUtils\nimport com.github.pockethub.android.core.OnLoadListener\nimport com.github.pockethub.android.core.gist.GistStore\nimport com.github.pockethub.android.core.gist.RefreshGistTaskFactory\nimport com.github.pockethub.android.rx.AutoDisposeUtils\nimport com.github.pockethub.android.rx.RxProgress\nimport com.github.pockethub.android.ui.ConfirmDialogFragment\nimport com.github.pockethub.android.ui.DialogResultListener\nimport com.github.pockethub.android.ui.base.BaseFragment\nimport com.github.pockethub.android.ui.comment.DeleteCommentListener\nimport com.github.pockethub.android.ui.comment.EditCommentListener\nimport com.github.pockethub.android.ui.item.GitHubCommentItem\nimport com.github.pockethub.android.ui.item.LoadingItem\nimport com.github.pockethub.android.ui.item.gist.GistFileItem\nimport com.github.pockethub.android.ui.item.gist.GistHeaderItem\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.github.pockethub.android.util.HttpImageGetter\nimport com.github.pockethub.android.util.ShareUtils\nimport com.github.pockethub.android.util.ToastUtils\nimport com.meisolsson.githubsdk.core.ServiceGenerator\nimport com.meisolsson.githubsdk.model.Gist\nimport com.meisolsson.githubsdk.model.GitHubComment\nimport com.meisolsson.githubsdk.service.gists.GistCommentService\nimport com.meisolsson.githubsdk.service.gists.GistService\nimport com.xwray.groupie.GroupAdapter\nimport com.xwray.groupie.Item\nimport com.xwray.groupie.OnItemClickListener\nimport com.xwray.groupie.Section\nimport com.xwray.groupie.ViewHolder\nimport io.reactivex.android.schedulers.AndroidSchedulers\nimport io.reactivex.schedulers.Schedulers\nimport kotlinx.android.synthetic.main.fragment_comment_list.*\nimport java.util.ArrayList\nimport java.util.Collections\nimport javax.inject.Inject\n\n/**\n * Activity to display an existing Gist\n */\nclass GistFragment : BaseFragment(), OnItemClickListener, DialogResultListener {\n\n    @Inject\n    lateinit var store: GistStore\n\n    @Inject\n    lateinit var refreshGistTaskFactory: RefreshGistTaskFactory\n\n    @Inject\n    lateinit var imageGetter: HttpImageGetter\n\n    @Inject\n    lateinit var avatars: AvatarLoader\n\n    private var gistId: String? = null\n\n    private var comments: MutableList<GitHubComment>? = null\n\n    private var gist: Gist? = null\n\n    private val adapter = GroupAdapter<ViewHolder>()\n\n    private val mainSection = Section()\n\n    private val filesSection = Section()\n\n    private val commentsSection = Section()\n\n    private var starred: Boolean = false\n\n    private var loadFinished: Boolean = false\n\n    private val isOwner: Boolean\n        get() {\n            if (gist == null) {\n                return false\n            }\n            val user = gist!!.owner() ?: return false\n            val login = AccountUtils.getLogin(activity)\n            return login != null && login == user.login()\n        }\n\n    /**\n     * Edit existing comment\n     */\n    private val editCommentListener: EditCommentListener = EditCommentListener { comment ->\n        startActivityForResult(\n            EditCommentActivity.createIntent(gist, comment),\n            COMMENT_EDIT)\n    }\n\n    /**\n     * Delete existing comment\n     */\n    private val deleteCommentListener = DeleteCommentListener { comment ->\n        val args = Bundle()\n        args.putParcelable(EXTRA_COMMENT, comment)\n        ConfirmDialogFragment.show(\n            activity,\n            COMMENT_DELETE,\n            activity!!.getString(R.string.confirm_comment_delete_title),\n            activity!!.getString(R.string.confirm_comment_delete_message),\n            args\n        )\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setHasOptionsMenu(true)\n        gistId = arguments!!.getString(EXTRA_GIST_ID)\n        gist = store.getGist(gistId)\n\n        mainSection.add(filesSection)\n        mainSection.add(commentsSection)\n        adapter.add(mainSection)\n\n        adapter.setOnItemClickListener(this)\n    }\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        return inflater.inflate(R.layout.fragment_comment_list, container, false)\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        val itemDecoration = DividerItemDecoration(activity, DividerItemDecoration.VERTICAL)\n        itemDecoration.setDrawable(resources.getDrawable(R.drawable.list_divider_5dp))\n\n        list.layoutManager = LinearLayoutManager(activity)\n        list.addItemDecoration(itemDecoration)\n        list.adapter = adapter\n    }\n\n    override fun onActivityCreated(savedInstanceState: Bundle?) {\n        super.onActivityCreated(savedInstanceState)\n        if (gist != null) {\n            updateHeader(gist)\n            updateFiles(gist)\n        }\n\n        if (gist == null || gist!!.comments()!! > 0 && comments == null) {\n            mainSection.setFooter(LoadingItem())\n        }\n\n        if (gist != null && comments != null) {\n            updateList(gist, comments!!)\n        } else {\n            refreshGist()\n        }\n    }\n\n    private fun updateHeader(gist: Gist?) {\n        mainSection.setHeader(GistHeaderItem(activity!!, gist!!))\n        pb_loading.visibility = GONE\n        list.visibility = VISIBLE\n    }\n\n    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {\n        super.onCreateOptionsMenu(menu, inflater)\n        inflater.inflate(R.menu.fragment_gist_view, menu)\n    }\n\n    override fun onPrepareOptionsMenu(menu: Menu) {\n        super.onPrepareOptionsMenu(menu)\n        menu.findItem(R.id.m_delete).isVisible = isOwner\n\n        val starItem = menu.findItem(R.id.m_star)\n        starItem.isEnabled = loadFinished\n        if (starred) {\n            starItem.setTitle(R.string.unstar)\n        } else {\n            starItem.setTitle(R.string.star)\n        }\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        if (gist == null) {\n            return super.onOptionsItemSelected(item)\n        }\n\n        when (item.itemId) {\n            R.id.m_comment -> {\n                startActivityForResult(CreateCommentActivity.createIntent(gist),\n                    COMMENT_CREATE)\n                return true\n            }\n            R.id.m_star -> {\n                if (starred) {\n                    unstarGist()\n                } else {\n                    starGist()\n                }\n                return true\n            }\n            R.id.m_refresh -> {\n                refreshGist()\n                return true\n            }\n            R.id.m_share -> {\n                shareGist()\n                return true\n            }\n            else -> return super.onOptionsItemSelected(item)\n        }\n    }\n\n    private fun starGist() {\n        ToastUtils.show(activity, R.string.starring_gist)\n        ServiceGenerator.createService(activity, GistService::class.java)\n            .starGist(gistId)\n            .subscribeOn(Schedulers.io())\n            .observeOn(AndroidSchedulers.mainThread())\n            .`as`(AutoDisposeUtils.bindToLifecycle(this))\n            .subscribe({ response -> starred = response.code() == 204 },\n                { e -> ToastUtils.show(context as Activity, e.message) })\n    }\n\n    private fun shareGist() {\n        val subject = StringBuilder(\"Gist \")\n        val id = gist!!.id()\n        subject.append(id)\n        val user = gist!!.owner()\n        if (user != null && !TextUtils.isEmpty(user.login())) {\n            subject.append(\" by \").append(user.login())\n        }\n        startActivity(ShareUtils.create(subject, \"https://gist.github.com/$id\"))\n    }\n\n    private fun unstarGist() {\n        ToastUtils.show(activity, R.string.unstarring_gist)\n        ServiceGenerator.createService(activity, GistService::class.java)\n            .unstarGist(gistId)\n            .subscribeOn(Schedulers.io())\n            .observeOn(AndroidSchedulers.mainThread())\n            .`as`(AutoDisposeUtils.bindToLifecycle(this))\n            .subscribe({ response -> starred = response.code() != 204 },\n                { e -> ToastUtils.show(context as Activity, e.message) })\n    }\n\n    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {\n        if (RESULT_OK != resultCode || data == null) {\n            return\n        }\n\n        when (requestCode) {\n            COMMENT_CREATE -> {\n                val comment = data.getParcelableExtra<GitHubComment>(EXTRA_COMMENT)\n                if (comments != null) {\n                    comments!!.add(comment)\n                    gist = gist!!.toBuilder().comments(gist!!.comments()!! + 1).build()\n                    updateList(gist, comments!!)\n                } else {\n                    refreshGist()\n                }\n                return\n            }\n            COMMENT_EDIT -> {\n                val comment = data.getParcelableExtra<GitHubComment>(EXTRA_COMMENT)\n                if (comments != null && comment != null) {\n                    val position = Collections.binarySearch(comments, comment) {\n                        lhs, rhs -> lhs.id()!!.compareTo(rhs.id()!!)\n                    }\n                    imageGetter.removeFromCache(comment.id())\n                    comments!![position] = comment\n                    updateList(gist, comments!!)\n                } else {\n                    refreshGist()\n                }\n                return\n            }\n        }\n\n        super.onActivityResult(requestCode, resultCode, data)\n    }\n\n    private fun updateFiles(gist: Gist?) {\n        if (activity == null) {\n            return\n        }\n\n        val files = gist!!.files().orEmpty()\n        val fileItems = files.values.map { GistFileItem(it) }\n        filesSection.update(fileItems)\n    }\n\n    private fun updateList(gist: Gist?, comments: List<GitHubComment>) {\n        val username = AccountUtils.getLogin(activity)\n        val isOwner = isOwner\n\n        val items = comments.map {\n            GitHubCommentItem(avatars, imageGetter, editCommentListener, deleteCommentListener, username!!, isOwner, it)\n        }\n        commentsSection.update(items)\n        mainSection.removeFooter()\n\n        updateHeader(gist)\n        updateFiles(gist)\n    }\n\n    private fun refreshGist() {\n        refreshGistTaskFactory.create(activity, gistId)\n            .refresh()\n            .subscribeOn(Schedulers.io())\n            .observeOn(AndroidSchedulers.mainThread())\n            .filter { (gist1, starred1, comments1) -> isAdded }\n            .`as`(AutoDisposeUtils.bindToLifecycle(this))\n            .subscribe({ fullGist ->\n                val activity = activity\n                if (activity is OnLoadListener<*>) {\n                    (activity as OnLoadListener<Gist>).loaded(fullGist.gist)\n                }\n\n                starred = fullGist.starred\n                loadFinished = true\n                gist = fullGist.gist\n                comments = fullGist.comments.toMutableList()\n                updateList(fullGist.gist, fullGist.comments)\n            }, { e -> ToastUtils.show(activity, R.string.error_gist_load) })\n    }\n\n    override fun onItemClick(@NonNull item: Item<*>, @NonNull view: View) {\n        if (item is GistFileItem) {\n            val position = adapter.getAdapterPosition(item)\n            startActivity(GistFilesViewActivity.createIntent(gist!!, position - 1))\n        }\n    }\n\n    override fun onDialogResult(requestCode: Int, resultCode: Int, arguments: Bundle) {\n        if (RESULT_OK != resultCode) {\n            return\n        }\n\n        when (requestCode) {\n            COMMENT_DELETE -> {\n                val comment = arguments.getParcelable<GitHubComment>(EXTRA_COMMENT)\n                ServiceGenerator.createService(activity, GistCommentService::class.java)\n                    .deleteGistComment(gistId, comment.id()!!)\n                    .subscribeOn(Schedulers.io())\n                    .observeOn(AndroidSchedulers.mainThread())\n                    .compose(RxProgress.bindToLifecycle(activity, R.string.deleting_comment))\n                    .`as`(AutoDisposeUtils.bindToLifecycle(this))\n                    .subscribe({ response ->\n                        // Update comment list\n                        if (comments != null) {\n                            val position = Collections.binarySearch(comments,\n                                comment) { lhs, rhs -> lhs.id()!!.compareTo(rhs.id()!!) }\n                            comments!!.removeAt(position)\n                            updateList(gist, comments!!)\n                        } else {\n                            refreshGist()\n                        }\n                    }, { e ->\n                        Log.d(TAG, \"Exception deleting comment on gist\", e)\n                        ToastUtils.show(context as Activity, e.message)\n                    })\n            }\n        }\n    }\n\n    companion object {\n\n        private val TAG = \"GistFragment\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/gist/GistQueriesPagerAdapter.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.gist;\n\nimport android.content.res.Resources;\nimport androidx.fragment.app.Fragment;\n\nimport com.github.pockethub.android.R;\nimport com.github.pockethub.android.ui.base.FragmentPagerAdapter;\n\n/**\n * Pager adapter for different Gist queries\n */\npublic class GistQueriesPagerAdapter extends FragmentPagerAdapter {\n\n    private final Resources resources;\n\n    /**\n     * Create pager adapter\n     *\n     * @param fragment\n     */\n    public GistQueriesPagerAdapter(Fragment fragment) {\n        super(fragment);\n\n        resources = fragment.getResources();\n    }\n\n    @Override\n    public int getCount() {\n        return 3;\n    }\n\n    @Override\n    public Fragment getItem(int position) {\n        switch (position) {\n            case 0:\n                return new MyGistsFragment();\n            case 1:\n                return new StarredGistsFragment();\n            case 2:\n                return new PublicGistsFragment();\n            default:\n                return null;\n        }\n    }\n\n    @Override\n    public CharSequence getPageTitle(int position) {\n        switch (position) {\n            case 0:\n                return resources.getString(R.string.tab_mine);\n            case 1:\n                return resources.getString(R.string.tab_starred);\n            case 2:\n                return resources.getString(R.string.tab_all);\n            default:\n                return null;\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/gist/GistsFragment.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.gist\n\nimport android.content.Intent\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.MenuItem\nimport android.view.View\nimport android.view.ViewGroup\nimport com.github.pockethub.android.ui.helpers.ItemListHandler\nimport com.github.pockethub.android.ui.helpers.PagedListFetcher\nimport com.github.pockethub.android.ui.helpers.PagedScrollListener\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.RequestCodes.GIST_CREATE\nimport com.github.pockethub.android.RequestCodes.GIST_VIEW\nimport com.github.pockethub.android.core.gist.GistStore\nimport com.github.pockethub.android.ui.base.BaseFragment\nimport com.github.pockethub.android.ui.item.gist.GistItem\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.github.pockethub.android.util.ToastUtils\nimport com.meisolsson.githubsdk.model.Gist\nimport com.meisolsson.githubsdk.model.Page\nimport com.xwray.groupie.Item\nimport com.xwray.groupie.OnItemClickListener\nimport io.reactivex.Single\nimport kotlinx.android.synthetic.main.fragment_item_list.view.*\nimport retrofit2.Response\nimport javax.inject.Inject\n\n/**\n * Fragment to display a list of Gists\n */\nabstract class GistsFragment : BaseFragment() {\n\n    /**\n     * Avatar loader\n     */\n    @Inject\n    protected lateinit var avatars: AvatarLoader\n\n    /**\n     * Gist store\n     */\n    @Inject\n    protected lateinit var store: GistStore\n\n    protected lateinit var pagedListFetcher: PagedListFetcher<Gist>\n\n    private lateinit var itemListHandler: ItemListHandler\n\n    protected val errorMessage: Int\n        get() = R.string.error_gists_load\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setHasOptionsMenu(true)\n    }\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? {\n        return inflater.inflate(R.layout.fragment_item_list, container, false)\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        itemListHandler = ItemListHandler(\n            view.list,\n            view.empty,\n            lifecycle,\n            activity,\n            OnItemClickListener(this::onItemClick)\n        )\n\n        pagedListFetcher = PagedListFetcher(\n            view.swipe_item,\n            lifecycle,\n            itemListHandler,\n            { t -> ToastUtils.show(activity, errorMessage) },\n            this::loadData,\n            this::createItem\n        )\n\n        view.list.addOnScrollListener(\n            PagedScrollListener(itemListHandler.mainSection, pagedListFetcher)\n        )\n        itemListHandler.setEmptyText(R.string.no_gists)\n    }\n\n    protected abstract fun loadData(page: Int): Single<Response<Page<Gist>>>\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        if (!isAdded) {\n            return false\n        }\n        return when (item.itemId) {\n            R.id.m_create -> {\n                startActivityForResult(Intent(activity,\n                    CreateGistActivity::class.java), GIST_CREATE)\n                true\n            }\n            else -> super.onOptionsItemSelected(item)\n        }\n    }\n\n    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {\n        if (requestCode == GIST_VIEW || requestCode == GIST_CREATE) {\n            pagedListFetcher.refresh()\n            return\n        }\n\n        super.onActivityResult(requestCode, resultCode, data)\n    }\n\n    protected fun createItem(item: Gist): Item<*> {\n        return GistItem(avatars, item)\n    }\n\n    fun onItemClick(item: Item<*>, view: View) {\n        val position = itemListHandler.getItemPosition(item)\n        val intent = GistsViewActivity.createIntent(itemListHandler.items, position)\n        startActivityForResult(intent, GIST_VIEW)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/gist/GistsPagerAdapter.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.gist;\n\nimport android.os.Bundle;\nimport androidx.fragment.app.Fragment;\nimport androidx.appcompat.app.AppCompatActivity;\nimport android.util.SparseArray;\nimport android.view.ViewGroup;\n\nimport com.github.pockethub.android.ui.base.FragmentStatePagerAdapter;\n\nimport static com.github.pockethub.android.Intents.EXTRA_GIST_ID;\n\n/**\n * Adapter to page through an array of Gists\n */\npublic class GistsPagerAdapter extends FragmentStatePagerAdapter {\n\n    private final String[] ids;\n\n    private final SparseArray<GistFragment> fragments = new SparseArray<>();\n\n    /**\n     * @param activity\n     * @param gistIds\n     */\n    public GistsPagerAdapter(AppCompatActivity activity, String[] gistIds) {\n        super(activity);\n\n        this.ids = gistIds;\n    }\n\n    @Override\n    public Fragment getItem(int position) {\n        Fragment fragment = new GistFragment();\n        Bundle args = new Bundle();\n        args.putString(EXTRA_GIST_ID, ids[position]);\n        fragment.setArguments(args);\n        return fragment;\n    }\n\n    @Override\n    public int getCount() {\n        return ids.length;\n    }\n\n    @Override\n    public void destroyItem(ViewGroup container, int position, Object object) {\n        super.destroyItem(container, position, object);\n\n        fragments.remove(position);\n    }\n\n    @Override\n    public Object instantiateItem(ViewGroup container, int position) {\n        Object fragment = super.instantiateItem(container, position);\n        if (fragment instanceof GistFragment) {\n            fragments.put(position, (GistFragment) fragment);\n        }\n        return fragment;\n    }\n\n    /**\n     * Deliver dialog result to fragment at given position\n     *\n     * @param position\n     * @param requestCode\n     * @param resultCode\n     * @param arguments\n     * @return this adapter\n     */\n    public GistsPagerAdapter onDialogResult(int position, int requestCode,\n            int resultCode, Bundle arguments) {\n        GistFragment fragment = fragments.get(position);\n        if (fragment != null) {\n            fragment.onDialogResult(requestCode, resultCode, arguments);\n        }\n        return this;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/gist/GistsPagerFragment.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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\npackage com.github.pockethub.android.ui.gist\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.Menu\nimport android.view.MenuInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.annotation.Nullable\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.ui.base.BaseFragment\nimport com.github.pockethub.android.ui.helpers.PagerHandler\nimport kotlinx.android.synthetic.main.pager_with_tabs.*\nimport kotlinx.android.synthetic.main.pager_with_tabs.view.*\n\nclass GistsPagerFragment : BaseFragment() {\n\n    private var pagerHandler: PagerHandler<GistQueriesPagerAdapter>? = null\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? {\n        return inflater.inflate(R.layout.pager_with_tabs, container, false)\n    }\n\n    override fun onViewCreated(view: View, @Nullable savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        setHasOptionsMenu(true)\n        view.toolbar.visibility = View.GONE\n        configurePager()\n    }\n\n    private fun configurePager() {\n        val adapter = GistQueriesPagerAdapter(this)\n        pagerHandler = PagerHandler(this, vp_pages, adapter)\n        lifecycle.addObserver(pagerHandler!!)\n        pagerHandler!!.tabs = sliding_tabs_layout\n    }\n\n    override fun onDestroy() {\n        super.onDestroy()\n        lifecycle.removeObserver(pagerHandler!!)\n    }\n\n    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {\n        inflater.inflate(R.menu.fragment_gists, menu)\n        super.onCreateOptionsMenu(menu, inflater)\n    }\n\n    companion object {\n\n        private val TAG = \"GistsPagerFragment\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/gist/GistsViewActivity.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.gist\n\nimport android.content.Intent\nimport android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP\nimport android.content.Intent.FLAG_ACTIVITY_SINGLE_TOP\nimport android.os.Bundle\nimport android.util.Log\nimport android.view.MenuItem\nimport com.github.pockethub.android.Intents.Builder\nimport com.github.pockethub.android.Intents.EXTRA_GIST\nimport com.github.pockethub.android.Intents.EXTRA_GIST_ID\nimport com.github.pockethub.android.Intents.EXTRA_GIST_IDS\nimport com.github.pockethub.android.Intents.EXTRA_POSITION\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.core.OnLoadListener\nimport com.github.pockethub.android.core.gist.GistStore\nimport com.github.pockethub.android.rx.AutoDisposeUtils\nimport com.github.pockethub.android.rx.RxProgress\nimport com.github.pockethub.android.ui.base.BaseActivity\nimport com.github.pockethub.android.ui.ConfirmDialogFragment\nimport com.github.pockethub.android.ui.DialogResultListener\nimport com.github.pockethub.android.ui.MainActivity\nimport com.github.pockethub.android.ui.helpers.PagerHandler\nimport com.github.pockethub.android.ui.item.gist.GistItem\nimport com.github.pockethub.android.ui.user.UriLauncherActivity\nimport com.github.pockethub.android.util.ToastUtils\nimport com.meisolsson.githubsdk.core.ServiceGenerator\nimport com.meisolsson.githubsdk.model.Gist\nimport com.meisolsson.githubsdk.service.gists.GistService\nimport com.xwray.groupie.Item\nimport io.reactivex.android.schedulers.AndroidSchedulers\nimport io.reactivex.schedulers.Schedulers\nimport kotlinx.android.synthetic.main.activity_pager.*\nimport java.io.Serializable\nimport javax.inject.Inject\n\n/**\n * Activity to display a collection of Gists in a pager\n */\nclass GistsViewActivity : BaseActivity(), DialogResultListener, OnLoadListener<Gist> {\n\n    @Inject\n    lateinit var store: GistStore\n\n    private var gists: Array<String>? = null\n\n    private var gist: Gist? = null\n\n    private var initialPosition: Int = 0\n\n    private var pagerHandler: PagerHandler<GistsPagerAdapter>? = null\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_pager)\n\n        gists = intent.getStringArrayExtra(EXTRA_GIST_IDS)\n        gist = intent.getParcelableExtra(EXTRA_GIST)\n        initialPosition = intent.getIntExtra(EXTRA_POSITION, -1)\n\n        supportActionBar!!.setDisplayHomeAsUpEnabled(true)\n\n        // Support opening this activity with a single Gist that may be present\n        // in the intent but not currently present in the store\n        if (gists == null && gist != null) {\n            if (gist!!.createdAt() != null) {\n                val stored = store.getGist(gist!!.id())\n                if (stored == null) {\n                    store.addGist(gist)\n                }\n            }\n            gists = arrayOf(gist!!.id()!!)\n        }\n\n        val adapter = GistsPagerAdapter(this, gists)\n        pagerHandler = PagerHandler(this, vp_pages, adapter)\n        lifecycle.addObserver(pagerHandler!!)\n        pagerHandler!!.onPagedChanged = this::onPageChanged\n        vp_pages.scheduleSetItem(initialPosition, pagerHandler)\n    }\n\n    override fun onDestroy() {\n        super.onDestroy()\n        lifecycle.removeObserver(pagerHandler!!)\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        when (item.itemId) {\n            android.R.id.home -> {\n                finish()\n                val intent = Intent(this, MainActivity::class.java)\n                intent.addFlags(FLAG_ACTIVITY_CLEAR_TOP or FLAG_ACTIVITY_SINGLE_TOP)\n                startActivity(intent)\n                return true\n            }\n            R.id.m_delete -> {\n                val gistId = gists!![vp_pages.currentItem]\n                val args = Bundle()\n                args.putString(EXTRA_GIST_ID, gistId)\n                ConfirmDialogFragment.show(this, REQUEST_CONFIRM_DELETE,\n                    getString(R.string.confirm_gist_delete_title),\n                    getString(R.string.confirm_gist_delete_message), args)\n                return true\n            }\n            else -> return super.onOptionsItemSelected(item)\n        }\n    }\n\n    override fun onDialogResult(requestCode: Int, resultCode: Int, arguments: Bundle) {\n        if (REQUEST_CONFIRM_DELETE == requestCode && RESULT_OK == resultCode) {\n            val gistId = arguments.getString(EXTRA_GIST_ID)\n\n            ServiceGenerator.createService(this, GistService::class.java)\n                .deleteGist(gistId)\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .compose(RxProgress.bindToLifecycle(this, R.string.deleting_gist))\n                .`as`(AutoDisposeUtils.bindToLifecycle(this))\n                .subscribe({ response ->\n                    setResult(RESULT_OK)\n                    finish()\n                }, { e ->\n                    Log.d(TAG, \"Exception deleting Gist\", e)\n                    ToastUtils.show(this, e.message)\n                })\n            return\n        }\n\n        pagerHandler!!.adapter\n            .onDialogResult(vp_pages.currentItem, requestCode, resultCode, arguments)\n    }\n\n    private fun onPageChanged(position: Int) {\n        val gistId = gists!![position]\n        val gist = store.getGist(gistId)\n        updateActionBar(gist, gistId)\n    }\n\n    override fun startActivity(intent: Intent) {\n        val converted = UriLauncherActivity.convert(intent)\n        if (converted != null) {\n            super.startActivity(converted)\n        } else {\n            super.startActivity(intent)\n        }\n    }\n\n    private fun updateActionBar(gist: Gist?, gistId: String) {\n        val actionBar = supportActionBar!!\n        when {\n            gist == null -> {\n                actionBar.subtitle = null\n                actionBar.setLogo(null)\n            }\n            gist.owner() != null -> {\n                actionBar.subtitle = gist.owner()!!.login()\n            }\n            else -> {\n                actionBar.setSubtitle(R.string.anonymous)\n                actionBar.setLogo(null)\n            }\n        }\n        actionBar.title = getString(R.string.gist_title) + gistId\n    }\n\n    override fun loaded(gist: Gist) {\n        if (gists!![vp_pages.currentItem] == gist.id()) {\n            updateActionBar(gist, gist.id()!!)\n        }\n    }\n\n    companion object {\n\n        private val REQUEST_CONFIRM_DELETE = 1\n        private val TAG = \"GistsViewActivity\"\n\n        /**\n         * Create an intent to show a single gist\n         *\n         * @param gist\n         * @return intent\n         */\n        fun createIntent(gist: Gist): Intent {\n            return Builder(\"gists.VIEW\").gist(gist).add(EXTRA_POSITION, 0)\n                .toIntent()\n        }\n\n        /**\n         * Create an intent to show gists with an initial selected Gist\n         *\n         * @param items\n         * @param position\n         * @return intent\n         */\n        fun createIntent(items: List<Item<*>>, position: Int): Intent {\n            val ids = items.map { (it as GistItem).gist.id() }.toTypedArray()\n            return Builder(\"gists.VIEW\")\n                .add(EXTRA_GIST_IDS, ids as Serializable)\n                .add(EXTRA_POSITION, position).toIntent()\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/gist/MyGistsFragment.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.gist;\n\nimport android.accounts.Account;\nimport android.content.Intent;\nimport com.meisolsson.githubsdk.core.ServiceGenerator;\nimport com.meisolsson.githubsdk.model.Gist;\nimport com.meisolsson.githubsdk.model.Page;\nimport com.meisolsson.githubsdk.service.gists.GistService;\nimport io.reactivex.Single;\nimport retrofit2.Response;\n\nimport javax.inject.Inject;\nimport javax.inject.Provider;\n\nimport static android.app.Activity.RESULT_OK;\nimport static com.github.pockethub.android.RequestCodes.GIST_CREATE;\nimport static com.github.pockethub.android.RequestCodes.GIST_VIEW;\n\n/**\n * Fragment to display a list of Gists\n */\npublic class MyGistsFragment extends GistsFragment {\n\n    GistService service = ServiceGenerator.createService(getActivity(), GistService.class);\n\n    @Inject\n    protected Provider<Account> accountProvider;\n\n    @Override\n    public void onActivityResult(int requestCode, int resultCode, Intent data) {\n        if ((requestCode == GIST_CREATE || requestCode == GIST_VIEW)\n                && RESULT_OK == resultCode) {\n            pagedListFetcher.refresh();\n            return;\n        }\n\n        super.onActivityResult(requestCode, resultCode, data);\n    }\n\n    @Override\n    protected Single<Response<Page<Gist>>> loadData(int page) {\n        return service.getUserGists(page);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/gist/PublicGistsFragment.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.gist;\n\nimport com.meisolsson.githubsdk.core.ServiceGenerator;\nimport com.meisolsson.githubsdk.model.Gist;\nimport com.meisolsson.githubsdk.model.Page;\nimport com.meisolsson.githubsdk.service.gists.GistService;\n\nimport io.reactivex.Single;\nimport retrofit2.Response;\n\n/**\n * Fragment to display a list of public Gists\n */\npublic class PublicGistsFragment extends GistsFragment {\n\n    GistService service = ServiceGenerator.createService(getActivity(), GistService.class);\n\n    @Override\n    protected Single<Response<Page<Gist>>> loadData(int page) {\n        return service.getPublicGists(page);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/gist/StarredGistsFragment.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.gist;\n\nimport com.meisolsson.githubsdk.core.ServiceGenerator;\nimport com.meisolsson.githubsdk.model.Gist;\nimport com.meisolsson.githubsdk.model.Page;\nimport com.meisolsson.githubsdk.service.gists.GistService;\n\nimport io.reactivex.Single;\nimport retrofit2.Response;\n\n/**\n * Fragment to display a list of Gists\n */\npublic class StarredGistsFragment extends GistsFragment {\n\n    GistService service = ServiceGenerator.createService(getActivity(), GistService.class);\n\n    @Override\n    protected Single<Response<Page<Gist>>> loadData(int page) {\n        return service.getUserStarredGists(page);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/helpers/ItemListHandler.kt",
    "content": "package com.github.pockethub.android.ui.helpers\n\nimport android.content.Context\nimport android.view.View\nimport android.view.animation.AnimationUtils\nimport android.widget.TextView\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.LifecycleObserver\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport com.xwray.groupie.GroupAdapter\nimport com.xwray.groupie.Item\nimport com.xwray.groupie.OnItemClickListener\nimport com.xwray.groupie.OnItemLongClickListener\nimport com.xwray.groupie.Section\nimport com.xwray.groupie.ViewHolder\nimport java.util.ArrayList\n\nclass ItemListHandler(\n    private val recyclerView: RecyclerView,\n    private val emptyView: TextView,\n    private val lifecycle: Lifecycle,\n    context: Context?,\n    clickListener: OnItemClickListener = OnItemClickListener { _, _ -> },\n    longClickListener: OnItemLongClickListener = OnItemLongClickListener { _, _ -> false }\n): LifecycleObserver {\n\n    /**\n     * The adapter used by the [RecyclerView] to display [com.xwray.groupie.Group]:s\n     * from Groupie.\n     */\n    private val adapter = GroupAdapter<ViewHolder>()\n\n    /**\n     * The [Section] containing headers, footers and the items.\n     */\n    val mainSection = Section()\n\n    /**\n     * List items.\n     */\n    var items: MutableList<Item<*>> = ArrayList()\n        private set\n\n    init {\n        adapter.add(mainSection)\n        recyclerView.layoutManager = LinearLayoutManager(context)\n        recyclerView.adapter = adapter\n\n        adapter.setOnItemClickListener(clickListener)\n        adapter.setOnItemLongClickListener(longClickListener)\n    }\n\n    fun getItemPosition(item: Item<*>): Int {\n        return adapter.getAdapterPosition(item)\n    }\n\n    private fun show(view: View) {\n        view.visibility = View.VISIBLE\n    }\n\n    private fun hide(view: View) {\n        view.visibility = View.GONE\n    }\n\n    private fun fadeIn(view: View?, animate: Boolean) {\n        if (view != null) {\n            if (animate) {\n                val animation = AnimationUtils.loadAnimation(view.context, android.R.anim.fade_in)\n                view.startAnimation(animation)\n            } else {\n                view.clearAnimation()\n            }\n        }\n    }\n\n    /**\n     * Set empty text on list fragment.\n     *\n     * @param message\n     * @return this fragment\n     */\n    fun setEmptyText(message: String) {\n        emptyView.text = message\n    }\n\n    /**\n     * Set empty text on list fragment.\n     *\n     * @param resId\n     * @return this fragment\n     */\n    fun setEmptyText(resId: Int) {\n        emptyView.setText(resId)\n    }\n\n    /**\n     * Update\n     *\n     * @param animate\n     * @return this fragment\n     */\n    private fun updateEmptyView(animate: Boolean = false) {\n        if (items.isNotEmpty()) {\n            hide(emptyView)\n        } else {\n            fadeIn(emptyView, animate)\n            show(emptyView)\n        }\n    }\n\n    fun addItems(newItems: List<Item<*>>) {\n        items.addAll(newItems)\n        mainSection.update(items)\n\n        updateEmptyView(lifecycle.currentState == Lifecycle.State.RESUMED)\n    }\n\n    fun update(newItems: List<Item<*>>) {\n        items.clear()\n        items.addAll(newItems)\n        mainSection.update(items)\n\n        updateEmptyView(lifecycle.currentState == Lifecycle.State.RESUMED)\n    }\n\n    fun isEmpty(): Boolean = items.isEmpty()\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/helpers/ListFetcher.kt",
    "content": "package com.github.pockethub.android.ui.helpers\n\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.LifecycleObserver\nimport androidx.lifecycle.OnLifecycleEvent\nimport androidx.swiperefreshlayout.widget.SwipeRefreshLayout\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.rx.AutoDisposeUtils\nimport com.xwray.groupie.Item\nimport io.reactivex.Observable\nimport io.reactivex.Single\nimport io.reactivex.android.schedulers.AndroidSchedulers\nimport io.reactivex.disposables.Disposable\nimport io.reactivex.disposables.Disposables\nimport io.reactivex.schedulers.Schedulers\n\nclass ListFetcher<E>(\n        private val swipeRefreshLayout: SwipeRefreshLayout?,\n        private val lifecycle: Lifecycle,\n        private val itemListHandler: ItemListHandler,\n        private val showError: (Throwable) -> Unit,\n        private val loadData: (force: Boolean) -> Single<List<E>>,\n        private val createItem: (item: E) -> Item<*>\n): LifecycleObserver {\n\n    /**\n     * Disposable for data load request.\n     */\n    private var dataLoadDisposable: Disposable = Disposables.disposed()\n\n    private var isLoading = false\n\n    var onDataLoaded: (MutableList<Item<*>>) -> MutableList<Item<*>> = { items -> items }\n\n    init {\n        lifecycle.addObserver(this)\n        if (swipeRefreshLayout != null) {\n            swipeRefreshLayout.setOnRefreshListener(this::forceRefresh)\n            swipeRefreshLayout.setColorSchemeResources(\n                R.color.pager_title_background_top_start,\n                R.color.pager_title_background_end,\n                R.color.text_link,\n                R.color.pager_title_background_end)\n        }\n    }\n\n    @OnLifecycleEvent(Lifecycle.Event.ON_START)\n    private fun onStart()  {\n        refresh()\n    }\n\n    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)\n    private fun onPause() {\n\n        isLoading = false\n        if (swipeRefreshLayout != null) {\n            swipeRefreshLayout.isRefreshing = false\n        }\n    }\n\n    private fun refresh(force: Boolean) {\n        if (isLoading) {\n            return\n        }\n\n        if (!dataLoadDisposable.isDisposed) {\n            dataLoadDisposable.dispose()\n        }\n\n        isLoading = true\n\n        dataLoadDisposable = loadData(force)\n            .flatMap { items ->\n                Observable.fromIterable<E>(items)\n                    .map<Item<*>> { this.createItem(it) }\n                    .toList()\n            }\n            .subscribeOn(Schedulers.io())\n            .observeOn(AndroidSchedulers.mainThread())\n            .`as`(AutoDisposeUtils.bindToLifecycle<MutableList<Item<*>>>(lifecycle))\n            .subscribe(\n                { this.onLoadFinished(it) },\n                { this.onDataLoadError(it) }\n            )\n    }\n\n    fun refresh() {\n        refresh(false)\n    }\n\n    fun forceRefresh() {\n        swipeRefreshLayout!!.isRefreshing = true\n        refresh(true)\n    }\n    /**\n     * Called when the data has loaded.\n     *\n     * @param newItems The items added to the list.\n     */\n    private fun onLoadFinished(newItems: MutableList<Item<*>>) {\n        isLoading = false\n        swipeRefreshLayout!!.isRefreshing = false\n\n        val items = onDataLoaded(newItems)\n        itemListHandler.update(items)\n    }\n\n    private fun onDataLoadError(throwable: Throwable) {\n        isLoading = false\n        swipeRefreshLayout!!.isRefreshing = false\nthrowable.printStackTrace()\n        showError(throwable)\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/helpers/PagedListFetcher.kt",
    "content": "package com.github.pockethub.android.ui.helpers\n\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.LifecycleObserver\nimport androidx.lifecycle.OnLifecycleEvent\nimport androidx.swiperefreshlayout.widget.SwipeRefreshLayout\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.rx.AutoDisposeUtils\nimport com.meisolsson.githubsdk.model.Page\nimport com.xwray.groupie.Item\nimport io.reactivex.Observable\nimport io.reactivex.Single\nimport io.reactivex.android.schedulers.AndroidSchedulers\nimport io.reactivex.disposables.Disposable\nimport io.reactivex.disposables.Disposables\nimport io.reactivex.schedulers.Schedulers\nimport retrofit2.Response\n\nclass PagedListFetcher<E>(\n    private val swipeRefreshLayout: SwipeRefreshLayout?,\n    private val lifecycle: Lifecycle,\n    private val itemListHandler: ItemListHandler,\n    private val showError: (Throwable) -> Unit,\n    private val loadPage: (page: Int) -> Single<Response<Page<E>>>,\n    private val createItem: (item: E) -> Item<*>\n): LifecycleObserver {\n\n    /**\n     * Disposable for data load request.\n     */\n    private var dataLoadDisposable: Disposable = Disposables.disposed()\n\n    private var isLoading = false\n\n    var hasMore: Boolean = true\n\n    var onPageLoaded: (MutableList<Item<*>>) -> MutableList<Item<*>> = { items -> items }\n\n    /**\n     * The current page.\n     */\n    private var page: Int = 1\n\n    init {\n        lifecycle.addObserver(this)\n        if (swipeRefreshLayout != null) {\n            swipeRefreshLayout.setOnRefreshListener(this::refresh)\n            swipeRefreshLayout.setColorSchemeResources(\n                R.color.pager_title_background_top_start,\n                R.color.pager_title_background_end,\n                R.color.text_link,\n                R.color.pager_title_background_end)\n        }\n    }\n\n    @OnLifecycleEvent(Lifecycle.Event.ON_START)\n    private fun onStart() {\n        refresh()\n    }\n\n    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)\n    private fun onPause() {\n\n        isLoading = false\n        if (swipeRefreshLayout != null) {\n            swipeRefreshLayout.isRefreshing = false\n        }\n    }\n\n    fun refresh() {\n        page = 1\n        hasMore = true\n        isLoading = false\n\n        if (swipeRefreshLayout != null) {\n            swipeRefreshLayout.isRefreshing = true\n        }\n\n        fetchPage()\n    }\n\n    fun fetchNext() {\n        if (!isLoading) {\n            page++\n            fetchPage()\n        }\n    }\n\n    private fun fetchPage() {\n        if (isLoading) {\n            return\n        }\n\n        if (!dataLoadDisposable.isDisposed) {\n            dataLoadDisposable.dispose()\n        }\n\n        isLoading = true\n\n        dataLoadDisposable = loadPage(page)\n            .map { it.body() }\n            .map { page ->\n                hasMore = page.next() != null\n                page\n            }\n            .flatMap { page ->\n                Observable.fromIterable<E>(page.items())\n                    .map<Item<*>> { this.createItem(it) }\n                    .toList()\n            }\n            .subscribeOn(Schedulers.io())\n            .observeOn(AndroidSchedulers.mainThread())\n            .`as`(AutoDisposeUtils.bindToLifecycle<MutableList<Item<*>>>(lifecycle))\n            .subscribe(\n                { this.onDataLoaded(it) },\n                { this.onDataLoadError(it) }\n            )\n    }\n\n    private fun onDataLoaded(newItems: MutableList<Item<*>>) {\n        isLoading = false\n        if (swipeRefreshLayout != null) {\n            swipeRefreshLayout.isRefreshing = false\n        }\n\n        val items = onPageLoaded(newItems)\n        if (page == 1) {\n            itemListHandler.update(items)\n        } else {\n            itemListHandler.addItems(items)\n        }\n    }\n\n    private fun onDataLoadError(throwable: Throwable) {\n        isLoading = false\n        if (swipeRefreshLayout != null) {\n            swipeRefreshLayout.isRefreshing = false\n        }\n\n        showError(throwable)\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/helpers/PagedScrollListener.kt",
    "content": "package com.github.pockethub.android.ui.helpers\n\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport com.xwray.groupie.Section\n\nclass PagedScrollListener(\n    private val section: Section,\n    private val listFetcher: PagedListFetcher<*>\n) : RecyclerView.OnScrollListener() {\n\n    private val loadingIndicator: ResourceLoadingIndicator =\n        ResourceLoadingIndicator(section)\n\n    override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {\n        super.onScrolled(recyclerView, dx, dy)\n\n        if (!listFetcher.hasMore) {\n            loadingIndicator.visible = false\n            return\n        }\n\n        // The item count minus the footer\n        val count = section.itemCount - 1\n        val layoutManager = recyclerView.layoutManager as LinearLayoutManager\n\n        if (layoutManager.findLastVisibleItemPosition() >= count) {\n            listFetcher.fetchNext()\n            loadingIndicator.visible = true\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/helpers/PagerHandler.kt",
    "content": "package com.github.pockethub.android.ui.helpers\n\nimport android.app.Activity\nimport android.view.View\nimport androidx.lifecycle.LifecycleObserver\nimport androidx.viewpager.widget.PagerAdapter\nimport androidx.viewpager.widget.ViewPager\nimport com.github.pockethub.android.ui.FragmentProvider\nimport com.github.pockethub.android.ui.base.BaseActivity\nimport com.github.pockethub.android.ui.base.BaseFragment\nimport com.google.android.material.tabs.TabLayout\n\nclass PagerHandler<V> private constructor(\n    private val pager: ViewPager,\n    val adapter: V,\n    private val activity: Activity\n): LifecycleObserver,\n    ViewPager.OnPageChangeListener\n    where V : FragmentProvider, V : PagerAdapter {\n\n    var onPagedChanged: (Int) -> Unit = {}\n\n    var tabs: TabLayout? = null\n        set(value) {\n            value?.setupWithViewPager(pager)\n        }\n\n    constructor(\n        activity: BaseActivity,\n        pager: ViewPager,\n        adapter: V\n    ): this(pager, adapter, activity)\n\n    constructor(\n        fragment: BaseFragment,\n        pager: ViewPager,\n        adapter: V\n    ): this(pager, adapter, fragment.activity!!)\n\n    init {\n        pager.adapter = adapter\n        pager.addOnPageChangeListener(this)\n        activity.invalidateOptionsMenu()\n    }\n\n    /**\n     * Set tab and pager as gone or visible\n     *\n     * @param gone\n     * @return this activity\n     */\n    fun setGone(gone: Boolean) {\n        if (gone) {\n            tabs?.visibility = View.GONE\n            pager.visibility = View.GONE\n        } else {\n            tabs?.visibility = View.VISIBLE\n            pager.visibility = View.VISIBLE\n        }\n    }\n\n    override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {\n    }\n\n    override fun onPageSelected(position: Int) {\n        activity.invalidateOptionsMenu()\n        onPagedChanged(position)\n    }\n\n    override fun onPageScrollStateChanged(state: Int) {\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/helpers/ResourceLoadingIndicator.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.helpers\n\nimport com.github.pockethub.android.ui.item.LoadingItem\nimport com.xwray.groupie.Section\n\n/**\n * Helper for showing more items are being loaded at the bottom of a list via a\n * custom footer view\n *\n * @param section the adapter that this indicator should be added as a footer to.\n */\nclass ResourceLoadingIndicator(private val section: Section) {\n\n    private val loadingItem = LoadingItem()\n\n    /**\n     * Visibility of entire indicator view.\n     */\n    var visible: Boolean = false\n        set(value) {\n            if (visible != value) {\n                if (value) {\n                    section.setFooter(loadingItem)\n                } else {\n                    section.removeFooter()\n                }\n                field = value\n            }\n        }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/issue/AssigneeDialog.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.issue;\n\nimport android.util.Log;\n\nimport com.github.pockethub.android.core.GitHubRequest;\nimport com.github.pockethub.android.rx.RxProgress;\nimport com.github.pockethub.android.util.RxPageUtil;\nimport com.meisolsson.githubsdk.core.ServiceGenerator;\nimport com.meisolsson.githubsdk.model.Page;\nimport com.meisolsson.githubsdk.model.Repository;\nimport com.meisolsson.githubsdk.model.User;\nimport com.github.pockethub.android.R;\nimport com.github.pockethub.android.ui.base.BaseActivity;\nimport com.github.pockethub.android.util.ToastUtils;\nimport com.meisolsson.githubsdk.service.issues.IssueAssigneeService;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport io.reactivex.Observable;\nimport io.reactivex.Single;\nimport retrofit2.Response;\n\nimport static java.lang.String.CASE_INSENSITIVE_ORDER;\n\n/**\n * Dialog helper to display a list of assignees to select one from\n */\npublic class AssigneeDialog {\n\n    private static final String TAG = \"AssigneeDialog\";\n\n    private final int requestCode;\n\n    private final BaseActivity activity;\n\n    private final Single<List<User>> assigneeSingle;\n\n    /**\n     * Create dialog helper to display assignees\n     *\n     * @param activity\n     * @param requestCode\n     * @param repository\n     */\n    public AssigneeDialog(final BaseActivity activity,\n            final int requestCode, final Repository repository) {\n        this.activity = activity;\n        this.requestCode = requestCode;\n\n        GitHubRequest<Response<Page<User>>> gitHubRequest = page -> ServiceGenerator\n                .createService(activity, IssueAssigneeService.class)\n                .getAssignees(repository.owner().login(), repository.name(), page);\n\n        assigneeSingle = RxPageUtil.getAllPages(gitHubRequest, 1)\n                .flatMap(page -> Observable.fromIterable(page.items()))\n                .toSortedList((o1, o2) -> CASE_INSENSITIVE_ORDER.compare(o1.login(), o2.login()))\n                .compose(RxProgress.bindToLifecycle(activity, R.string.loading_collaborators))\n                .cache();\n    }\n\n    /**\n     * Show dialog with given assignee selected\n     *\n     * @param selectedAssignee\n     */\n    public void show(User selectedAssignee) {\n        assigneeSingle.subscribe(collaborators -> {\n            int checked = -1;\n            if (selectedAssignee != null) {\n                for (int i = 0; i < collaborators.size(); i++) {\n                    if (selectedAssignee.login().equals(collaborators.get(i).login())) {\n                        checked = i;\n                    }\n                }\n            }\n            AssigneeDialogFragment.show(activity, requestCode,\n                    activity.getString(R.string.select_assignee), null, new ArrayList<>(collaborators),\n                    checked);\n        }, error -> {\n            Log.d(TAG, \"Exception loading collaborators\", error);\n            ToastUtils.show(activity, R.string.error_collaborators_load);\n        });\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/issue/AssigneeDialogFragment.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.issue;\n\nimport android.app.Dialog;\nimport android.os.Bundle;\nimport androidx.annotation.NonNull;\nimport android.view.View;\n\nimport com.github.pockethub.android.ui.item.dialog.AssigneeDialogItem;\nimport com.meisolsson.githubsdk.model.User;\nimport com.github.pockethub.android.R;\nimport com.github.pockethub.android.ui.base.BaseActivity;\nimport com.github.pockethub.android.ui.SingleChoiceDialogFragment;\nimport com.github.pockethub.android.util.AvatarLoader;\nimport com.xwray.groupie.GroupAdapter;\nimport com.xwray.groupie.Item;\n\nimport javax.inject.Inject;\n\nimport java.util.ArrayList;\n\nimport static android.app.Activity.RESULT_OK;\n\n/**\n * Dialog fragment to select an issue assignee from a list of collaborators\n */\npublic class AssigneeDialogFragment extends SingleChoiceDialogFragment {\n\n    /**\n     * Get selected user from results bundle\n     *\n     * @param arguments\n     * @return user\n     */\n    public static User getSelected(Bundle arguments) {\n        return (User) arguments.getParcelable(ARG_SELECTED);\n    }\n\n    /**\n     * Confirm message and deliver callback to given activity\n     *\n     * @param activity\n     * @param requestCode\n     * @param title\n     * @param message\n     * @param choices\n     * @param selectedChoice\n     */\n    public static void show(final BaseActivity activity,\n            final int requestCode, final String title, final String message,\n            ArrayList<User> choices, final int selectedChoice) {\n        show(activity, requestCode, title, message, choices, selectedChoice,\n                new AssigneeDialogFragment());\n    }\n\n    @Inject\n    protected AvatarLoader avatars;\n\n    @NonNull\n    @Override\n    public Dialog onCreateDialog(final Bundle savedInstanceState) {\n        int selected = getArguments().getInt(ARG_SELECTED_CHOICE);\n\n        GroupAdapter adapter = new GroupAdapter();\n        for (User user : getChoices()) {\n            adapter.add(new AssigneeDialogItem(avatars, user, selected));\n        }\n        adapter.setOnItemClickListener(this);\n\n        return createDialogBuilder()\n                .adapter(adapter, null)\n                .negativeText(R.string.cancel)\n                .neutralText(R.string.clear)\n                .onNeutral((dialog, which) -> onResult(RESULT_OK))\n                .build();\n    }\n\n    @SuppressWarnings(\"unchecked\")\n    private ArrayList<User> getChoices() {\n        return getArguments().getParcelableArrayList(ARG_CHOICES);\n    }\n\n    @Override\n    public void onItemClick(@NonNull Item item, @NonNull View view) {\n        super.onItemClick(item, view);\n        if (item instanceof AssigneeDialogItem) {\n            getArguments().putParcelable(ARG_SELECTED, ((AssigneeDialogItem) item).getUser());\n            onResult(RESULT_OK);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/issue/CreateCommentActivity.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.issue;\n\nimport android.content.Intent;\nimport android.os.Bundle;\nimport androidx.appcompat.app.ActionBar;\n\nimport com.github.pockethub.android.rx.AutoDisposeUtils;\nimport com.meisolsson.githubsdk.core.ServiceGenerator;\nimport com.meisolsson.githubsdk.model.Issue;\nimport com.meisolsson.githubsdk.model.Repository;\nimport com.meisolsson.githubsdk.model.User;\nimport com.github.pockethub.android.Intents;\nimport com.github.pockethub.android.Intents.Builder;\nimport com.github.pockethub.android.R;\nimport com.github.pockethub.android.ui.comment.CommentPreviewPagerAdapter;\nimport com.github.pockethub.android.util.InfoUtils;\nimport com.meisolsson.githubsdk.model.request.CommentRequest;\nimport com.meisolsson.githubsdk.service.issues.IssueCommentService;\n\nimport io.reactivex.android.schedulers.AndroidSchedulers;\nimport io.reactivex.schedulers.Schedulers;\n\nimport static com.github.pockethub.android.Intents.EXTRA_ISSUE_NUMBER;\nimport static com.github.pockethub.android.Intents.EXTRA_USER;\n\n/**\n * Activity to create a comment on an {@link Issue}\n */\npublic class CreateCommentActivity extends\n        com.github.pockethub.android.ui.comment.CreateCommentActivity {\n\n    /**\n     * Create intent to create a comment\n     *\n     * @param repoId\n     * @param issueNumber\n     * @param user\n     * @return intent\n     */\n    public static Intent createIntent(Repository repoId, int issueNumber,\n            User user) {\n        Builder builder = new Builder(\"issue.comment.create.VIEW\");\n        builder.repo(repoId);\n        builder.add(EXTRA_ISSUE_NUMBER, issueNumber);\n        builder.add(EXTRA_USER, user);\n        return builder.toIntent();\n    }\n\n    private Repository repositoryId;\n\n    private int issueNumber;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        issueNumber = getIntent().getIntExtra(EXTRA_ISSUE_NUMBER, -1);\n        repositoryId = getIntent().getParcelableExtra(Intents.EXTRA_REPOSITORY);\n\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.pager_with_tabs);\n\n        ActionBar actionBar = getSupportActionBar();\n        actionBar.setTitle(getString(R.string.issue_title) + issueNumber);\n        actionBar.setSubtitle(InfoUtils.createRepoId(repositoryId));\n    }\n\n    @Override\n    protected void createComment(String comment) {\n        CommentRequest commentRequest = CommentRequest.builder()\n                .body(comment)\n                .build();\n\n        ServiceGenerator.createService(this, IssueCommentService.class)\n                .createIssueComment(repositoryId.owner().login(), repositoryId.name(), issueNumber, commentRequest)\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .as(AutoDisposeUtils.bindToLifecycle(this))\n                .subscribe(response -> finish(response.body()));\n    }\n\n    @Override\n    protected CommentPreviewPagerAdapter createAdapter() {\n        return new CommentPreviewPagerAdapter(this, repositoryId);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/issue/DashboardIssueFragment.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.issue\n\nimport android.content.Intent\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport com.github.pockethub.android.ui.helpers.ItemListHandler\nimport com.github.pockethub.android.ui.helpers.PagedListFetcher\nimport com.github.pockethub.android.ui.helpers.PagedScrollListener\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.RequestCodes.ISSUE_VIEW\nimport com.github.pockethub.android.core.issue.IssueStore\nimport com.github.pockethub.android.ui.base.BaseFragment\nimport com.github.pockethub.android.ui.item.issue.IssueDashboardItem\nimport com.github.pockethub.android.ui.item.issue.IssueItem\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.github.pockethub.android.util.ToastUtils\nimport com.meisolsson.githubsdk.model.Issue\nimport com.meisolsson.githubsdk.model.Page\nimport com.meisolsson.githubsdk.service.issues.IssueService\nimport com.xwray.groupie.Item\nimport com.xwray.groupie.OnItemClickListener\nimport io.reactivex.Single\nimport kotlinx.android.synthetic.main.fragment_item_list.view.*\nimport retrofit2.Response\nimport java.util.ArrayList\nimport javax.inject.Inject\n\n/**\n * Fragment to display a pageable list of dashboard issues\n */\nclass DashboardIssueFragment : BaseFragment() {\n\n    @Inject\n    protected lateinit var service: IssueService\n\n    @Inject\n    protected lateinit var store: IssueStore\n\n    @Inject\n    protected lateinit var avatars: AvatarLoader\n\n    private lateinit var pagedListFetcher: PagedListFetcher<Issue>\n\n    private lateinit var itemListHandler: ItemListHandler\n\n    private var filterData: Map<String, Any>? = null\n\n    protected val errorMessage: Int\n        get() = R.string.error_issues_load\n\n    override fun onActivityCreated(savedInstanceState: Bundle?) {\n        filterData = arguments!!.getSerializable(ARG_FILTER) as Map<String, Any>\n        super.onActivityCreated(savedInstanceState)\n    }\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? {\n        return inflater.inflate(R.layout.fragment_item_list, container, false)\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        itemListHandler = ItemListHandler(\n            view.list,\n            view.empty,\n            lifecycle,\n            activity,\n            OnItemClickListener(this::onItemClick)\n        )\n\n        pagedListFetcher = PagedListFetcher(\n            view.swipe_item,\n            lifecycle,\n            itemListHandler,\n            { t -> ToastUtils.show(activity, errorMessage) },\n            this::loadData,\n            this::createItem\n        )\n\n        view.list.addOnScrollListener(\n            PagedScrollListener(itemListHandler.mainSection, pagedListFetcher)\n        )\n        itemListHandler.setEmptyText(R.string.no_repositories)\n    }\n\n    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {\n        if (requestCode == ISSUE_VIEW) {\n            pagedListFetcher.refresh()\n            return\n        }\n\n        super.onActivityResult(requestCode, resultCode, data)\n    }\n\n    private fun loadData(page: Int): Single<Response<Page<Issue>>> {\n        return service.getIssues(filterData, page.toLong())\n    }\n\n    private fun onItemClick(clickedItem: Item<*>, view: View) {\n        if (clickedItem is IssueDashboardItem) {\n            val position = itemListHandler.getItemPosition(clickedItem)\n            val issues = itemListHandler.items\n                .filterIsInstance<IssueDashboardItem>()\n                .map { (it as IssueItem).issue }\n            startActivityForResult(IssuesViewActivity.createIntent(issues, position), ISSUE_VIEW)\n        }\n    }\n\n    private fun createItem(item: Issue): Item<*> {\n        return IssueDashboardItem(avatars, item)\n    }\n\n    companion object {\n\n        /**\n         * Filter data argument\n         */\n        val ARG_FILTER = \"filter\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/issue/EditAssigneeTask.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.issue;\n\nimport com.github.pockethub.android.rx.AutoDisposeUtils;\nimport com.github.pockethub.android.rx.RxProgress;\nimport com.google.auto.factory.AutoFactory;\nimport com.google.auto.factory.Provided;\nimport com.meisolsson.githubsdk.model.Issue;\nimport com.meisolsson.githubsdk.model.Repository;\nimport com.meisolsson.githubsdk.model.User;\nimport com.github.pockethub.android.R;\nimport com.github.pockethub.android.core.issue.IssueStore;\nimport com.github.pockethub.android.ui.base.BaseActivity;\nimport com.meisolsson.githubsdk.model.request.issue.IssueRequest;\n\nimport java.util.Collections;\n\nimport io.reactivex.android.schedulers.AndroidSchedulers;\nimport io.reactivex.functions.Consumer;\nimport io.reactivex.schedulers.Schedulers;\n\nimport static com.github.pockethub.android.RequestCodes.ISSUE_ASSIGNEE_UPDATE;\n\n/**\n * Task to edit the assignee\n */\n//TODO Let this take multiple assignees\n@AutoFactory\npublic class EditAssigneeTask {\n\n    private final IssueStore store;\n\n    private final AssigneeDialog assigneeDialog;\n\n    private final BaseActivity activity;\n\n    private final Repository repositoryId;\n\n    private final int issueNumber;\n\n    private final Consumer<Issue> observer;\n\n    /**\n     * Create task to edit a milestone\n     *\n     * @param activity\n     * @param repositoryId\n     * @param issueNumber\n     */\n    public EditAssigneeTask(@Provided IssueStore store, final BaseActivity activity,\n                            final Repository repositoryId, final int issueNumber,\n                            final Consumer<Issue> observer) {\n        this.store = store;\n        this.activity = activity;\n        this.repositoryId = repositoryId;\n        this.issueNumber = issueNumber;\n        this.observer = observer;\n        assigneeDialog = new AssigneeDialog(activity, ISSUE_ASSIGNEE_UPDATE, repositoryId);\n    }\n\n    /**\n     * Prompt for assignee selection\n     *\n     * @param assignee\n     *            current assignee\n     * @return this task\n     */\n    public EditAssigneeTask prompt(User assignee) {\n        assigneeDialog.show(assignee);\n        return this;\n    }\n\n    /**\n     * Edit issue to have given assignee.\n     *\n     * @param assignee The user the assign\n     * @return this task\n     */\n    public EditAssigneeTask edit(User assignee) {\n        String assigneeLogin = assignee != null ? assignee.login() : \"\";\n\n        IssueRequest edit = IssueRequest.builder()\n                .assignees(Collections.singletonList(assigneeLogin))\n                .build();\n\n        store.editIssue(repositoryId, issueNumber, edit)\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .compose(RxProgress.bindToLifecycle(activity, R.string.updating_assignee))\n                .as(AutoDisposeUtils.bindToLifecycle(activity))\n                .subscribe(observer);\n\n        return this;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/issue/EditCommentActivity.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.issue;\n\nimport android.content.Intent;\nimport android.os.Bundle;\nimport androidx.appcompat.app.ActionBar;\nimport android.util.Log;\n\nimport com.github.pockethub.android.rx.AutoDisposeUtils;\nimport com.github.pockethub.android.rx.RxProgress;\nimport com.meisolsson.githubsdk.core.ServiceGenerator;\nimport com.meisolsson.githubsdk.model.GitHubComment;\nimport com.meisolsson.githubsdk.model.Issue;\nimport com.meisolsson.githubsdk.model.Repository;\nimport com.meisolsson.githubsdk.model.User;\nimport com.github.pockethub.android.Intents;\nimport com.github.pockethub.android.Intents.Builder;\nimport com.github.pockethub.android.R;\nimport com.github.pockethub.android.ui.comment.CommentPreviewPagerAdapter;\nimport com.github.pockethub.android.util.InfoUtils;\nimport com.github.pockethub.android.util.ToastUtils;\nimport com.meisolsson.githubsdk.model.request.CommentRequest;\nimport com.meisolsson.githubsdk.service.issues.IssueCommentService;\n\nimport io.reactivex.android.schedulers.AndroidSchedulers;\nimport io.reactivex.schedulers.Schedulers;\n\nimport static com.github.pockethub.android.Intents.EXTRA_COMMENT;\nimport static com.github.pockethub.android.Intents.EXTRA_ISSUE_NUMBER;\nimport static com.github.pockethub.android.Intents.EXTRA_USER;\n\n/**\n * Activity to edit a comment on an {@link Issue}\n */\npublic class EditCommentActivity extends\n        com.github.pockethub.android.ui.comment.CreateCommentActivity {\n\n    private static final String TAG = \"EditCommentActivity\";\n\n    /**\n     * Create intent to edit a comment\n     *\n     * @param repoId\n     * @param issueNumber\n     * @param user\n     * @return intent\n     */\n    public static Intent createIntent(Repository repoId, int issueNumber, GitHubComment comment,\n            User user) {\n        Builder builder = new Builder(\"issue.comment.edit.VIEW\");\n        builder.repo(repoId);\n        builder.add(EXTRA_COMMENT, comment);\n        builder.add(EXTRA_ISSUE_NUMBER, issueNumber);\n        builder.add(EXTRA_USER, user);\n        return builder.toIntent();\n    }\n\n    private Repository repositoryId;\n\n    /**\n     * Comment to edit.\n     */\n    private GitHubComment comment;\n\n    private int issueNumber;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        comment = getIntent().getParcelableExtra(EXTRA_COMMENT);\n        issueNumber = getIntent().getIntExtra(EXTRA_ISSUE_NUMBER, -1);\n        repositoryId = getIntent().getParcelableExtra(Intents.EXTRA_REPOSITORY);\n\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.pager_with_tabs);\n\n        ActionBar actionBar = getSupportActionBar();\n        actionBar.setTitle(getString(R.string.issue_title) + issueNumber);\n        actionBar.setSubtitle(InfoUtils.createRepoId(repositoryId));\n    }\n\n    @Override\n    protected void createComment(String comment) {\n        editComment(comment);\n    }\n\n    /**\n     * Edit comment.\n     *\n     * @param commentText\n     */\n    protected void editComment(String commentText) {\n        CommentRequest commentRequest = CommentRequest.builder()\n                .body(commentText)\n                .build();\n\n        ServiceGenerator.createService(this, IssueCommentService.class)\n                .editIssueComment(repositoryId.owner().login(), repositoryId.name(),\n                        comment.id(), commentRequest)\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .compose(RxProgress.bindToLifecycle(this, R.string.editing_comment))\n                .as(AutoDisposeUtils.bindToLifecycle(this))\n                .subscribe(response -> finish(response.body()), e -> {\n                    Log.d(TAG, \"Exception editing comment on issue\", e);\n                    ToastUtils.show(this, e.getMessage());\n                });\n    }\n\n    @Override\n    protected CommentPreviewPagerAdapter createAdapter() {\n        CommentPreviewPagerAdapter commentPreviewPagerAdapter = new CommentPreviewPagerAdapter(this, repositoryId);\n        commentPreviewPagerAdapter.setCommentText(comment != null ? comment.body() : null);\n        return commentPreviewPagerAdapter;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/issue/EditIssueActivity.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.issue\n\nimport android.Manifest\nimport android.app.Activity\nimport android.content.Intent\nimport android.content.pm.PackageManager\nimport android.os.Bundle\nimport android.os.Parcelable\nimport android.text.TextUtils\nimport android.util.Log\nimport android.view.Menu\nimport android.view.MenuItem\nimport android.view.View\nimport android.view.View.GONE\nimport android.view.View.VISIBLE\nimport android.widget.LinearLayout.LayoutParams\nimport androidx.core.content.ContextCompat\nimport androidx.core.text.bold\nimport androidx.core.text.buildSpannedString\nimport com.github.pockethub.android.Intents.Builder\nimport com.github.pockethub.android.Intents.EXTRA_ISSUE\nimport com.github.pockethub.android.Intents.EXTRA_REPOSITORY_NAME\nimport com.github.pockethub.android.Intents.EXTRA_REPOSITORY_OWNER\nimport com.github.pockethub.android.Intents.EXTRA_USER\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.RequestCodes.ISSUE_ASSIGNEE_UPDATE\nimport com.github.pockethub.android.RequestCodes.ISSUE_LABELS_UPDATE\nimport com.github.pockethub.android.RequestCodes.ISSUE_MILESTONE_UPDATE\nimport com.github.pockethub.android.accounts.AccountUtils\nimport com.github.pockethub.android.core.issue.IssueUtils\nimport com.github.pockethub.android.rx.AutoDisposeUtils\nimport com.github.pockethub.android.rx.RxProgress\nimport com.github.pockethub.android.ui.DialogResultListener\nimport com.github.pockethub.android.ui.base.BaseActivity\nimport com.github.pockethub.android.ui.TextWatcherAdapter\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.github.pockethub.android.util.ImageBinPoster\nimport com.github.pockethub.android.util.InfoUtils\nimport com.github.pockethub.android.util.PermissionsUtils\nimport com.github.pockethub.android.util.ToastUtils\nimport com.meisolsson.githubsdk.core.ServiceGenerator\nimport com.meisolsson.githubsdk.model.Issue\nimport com.meisolsson.githubsdk.model.Repository\nimport com.meisolsson.githubsdk.model.User\nimport com.meisolsson.githubsdk.model.request.issue.IssueRequest\nimport com.meisolsson.githubsdk.service.issues.IssueService\nimport com.meisolsson.githubsdk.service.repositories.RepositoryCollaboratorService\nimport io.reactivex.Single\nimport io.reactivex.android.schedulers.AndroidSchedulers\nimport io.reactivex.schedulers.Schedulers\nimport kotlinx.android.synthetic.main.activity_issue_edit.*\nimport kotlinx.android.synthetic.main.milestone.*\nimport retrofit2.Response\nimport java.util.ArrayList\nimport javax.inject.Inject\n\n/**\n * Activity to edit or create an issue\n */\nclass EditIssueActivity : BaseActivity(), DialogResultListener {\n\n    @Inject\n    lateinit var avatars: AvatarLoader\n\n    private var issue: Issue? = null\n\n    private var repository: Repository? = null\n\n    private var saveItem: MenuItem? = null\n\n    private var milestoneDialog: MilestoneDialog? = null\n\n    private var assigneeDialog: AssigneeDialog? = null\n\n    private var labelsDialog: LabelsDialog? = null\n\n    private val titleTextWatcher = object : TextWatcherAdapter() {\n        override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {\n            updateSaveMenu(s)\n        }\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_issue_edit)\n\n        val intent = intent\n\n        if (savedInstanceState != null) {\n            issue = savedInstanceState.getParcelable(EXTRA_ISSUE)\n        }\n        if (issue == null) {\n            issue = intent.getParcelableExtra(EXTRA_ISSUE)\n        }\n        if (issue == null) {\n            issue = Issue.builder().build()\n        }\n\n        repository = InfoUtils.createRepoFromData(\n                intent.getStringExtra(EXTRA_REPOSITORY_OWNER),\n                intent.getStringExtra(EXTRA_REPOSITORY_NAME)\n        )\n\n        checkCollaboratorStatus()\n\n        val actionBar = supportActionBar\n        if (issue!!.number() != null && issue!!.number()!! > 0) {\n            if (IssueUtils.isPullRequest(issue)) {\n                actionBar!!.title = getString(R.string.pull_request_title) + issue!!.number()!!\n            } else {\n                actionBar!!.title = getString(R.string.issue_title) + issue!!.number()!!\n            }\n        } else {\n            actionBar!!.setTitle(R.string.new_issue)\n        }\n        actionBar.subtitle = InfoUtils.createRepoId(repository)\n\n        updateSaveMenu()\n        et_issue_title.setText(issue!!.title())\n        et_issue_body.setText(issue!!.body())\n\n        fab_add_image.setOnClickListener { onAddImageClicked() }\n        et_issue_title.addTextChangedListener(titleTextWatcher)\n    }\n\n    override fun onDestroy() {\n        super.onDestroy()\n        et_issue_title.removeTextChangedListener(titleTextWatcher)\n    }\n\n    override fun onRequestPermissionsResult(\n            requestCode: Int,\n            permissions: Array<String>,\n            grantResults: IntArray\n    ) {\n        super.onRequestPermissionsResult(requestCode, permissions, grantResults)\n        if (requestCode == READ_PERMISSION_REQUEST) {\n            val result = permissions.indices\n                .none { grantResults[it] != PackageManager.PERMISSION_GRANTED }\n\n            if (result) {\n                startImagePicker()\n            }\n        }\n    }\n\n    private fun startImagePicker() {\n        val photoPickerIntent = Intent(Intent.ACTION_GET_CONTENT)\n        photoPickerIntent.type = \"image/*\"\n        startActivityForResult(photoPickerIntent, REQUEST_CODE_SELECT_PHOTO)\n    }\n\n    override fun onDialogResult(requestCode: Int, resultCode: Int, arguments: Bundle) {\n        if (Activity.RESULT_OK != resultCode) {\n            return\n        }\n\n        when (requestCode) {\n            ISSUE_MILESTONE_UPDATE -> {\n                issue = issue!!.toBuilder()\n                        .milestone(MilestoneDialogFragment.getSelected(arguments))\n                        .build()\n                updateMilestone()\n            }\n            ISSUE_ASSIGNEE_UPDATE -> {\n                var assignee: User? = AssigneeDialogFragment.getSelected(arguments)\n                if (assignee == null) {\n                    assignee = User.builder().login(\"\").build()\n                }\n                issue = issue!!.toBuilder().assignee(assignee).build()\n                updateAssignee()\n            }\n            ISSUE_LABELS_UPDATE -> {\n                issue = issue!!.toBuilder()\n                        .labels(LabelsDialogFragment.getSelected(arguments))\n                        .build()\n                updateLabels()\n            }\n        }\n    }\n\n    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {\n        super.onActivityResult(requestCode, resultCode, data)\n\n        if (requestCode == REQUEST_CODE_SELECT_PHOTO && resultCode == Activity.RESULT_OK) {\n            ImageBinPoster.post(this, data?.data!!)\n                    .subscribeOn(Schedulers.io())\n                    .observeOn(AndroidSchedulers.mainThread())\n                    .compose(RxProgress.bindToLifecycle(this, R.string.loading))\n                    .`as`(AutoDisposeUtils.bindToLifecycle(this))\n                    .subscribe({ response ->\n                        if (response.isSuccessful) {\n                            insertImage(ImageBinPoster.getUrl(response.body()!!.string()))\n                        } else {\n                            showImageError()\n                        }\n                    }, { _ -> showImageError() })\n        }\n    }\n\n    fun onAddImageClicked() {\n        val activity = this@EditIssueActivity\n        val permission = Manifest.permission.READ_EXTERNAL_STORAGE\n\n        if (ContextCompat.checkSelfPermission(activity, permission) !=\n                PackageManager.PERMISSION_GRANTED\n        ) {\n            PermissionsUtils.askForPermission(\n                    activity,\n                    READ_PERMISSION_REQUEST,\n                    permission,\n                    R.string.read_permission_title,\n                    R.string.read_permission_content\n            )\n        } else {\n            startImagePicker()\n        }\n    }\n\n    private fun showImageError() {\n        ToastUtils.show(this, R.string.error_image_upload)\n    }\n\n    private fun insertImage(url: String?) {\n        runOnUiThread { et_issue_body.append(\"![]($url)\") }\n    }\n\n    private fun showMainContent() {\n        findViewById<View>(R.id.sv_issue_content).visibility = View.VISIBLE\n        findViewById<View>(R.id.pb_loading).visibility = View.GONE\n    }\n\n    private fun showCollaboratorOptions() {\n        val milestone = findViewById<View>(R.id.ll_milestone)\n        val labels = findViewById<View>(R.id.ll_labels)\n        val assignee = findViewById<View>(R.id.ll_assignee)\n\n        findViewById<View>(R.id.tv_milestone_label).visibility = View.VISIBLE\n        milestone.visibility = View.VISIBLE\n        findViewById<View>(R.id.tv_labels_label).visibility = View.VISIBLE\n        labels.visibility = View.VISIBLE\n        findViewById<View>(R.id.tv_assignee_label).visibility = View.VISIBLE\n        assignee.visibility = View.VISIBLE\n\n        milestone.setOnClickListener { _ ->\n            if (milestoneDialog == null) {\n                milestoneDialog = MilestoneDialog(this, ISSUE_MILESTONE_UPDATE, repository)\n            }\n            milestoneDialog!!.show(issue!!.milestone())\n        }\n\n        assignee.setOnClickListener { _ ->\n            if (assigneeDialog == null) {\n                assigneeDialog = AssigneeDialog(this, ISSUE_ASSIGNEE_UPDATE, repository)\n            }\n            assigneeDialog!!.show(issue!!.assignee())\n        }\n\n        labels.setOnClickListener { _ ->\n            if (labelsDialog == null) {\n                labelsDialog = LabelsDialog(this, ISSUE_LABELS_UPDATE, repository)\n            }\n            labelsDialog!!.show(issue!!.labels())\n        }\n\n        updateAssignee()\n        updateLabels()\n        updateMilestone()\n    }\n\n    private fun updateMilestone() {\n        val milestone = issue!!.milestone()\n        if (milestone != null) {\n            tv_milestone.text = milestone.title()\n            val closed = milestone.closedIssues()!!.toFloat()\n            val total = closed + milestone.openIssues()!!\n            if (total > 0) {\n                (v_closed.layoutParams as LayoutParams).weight = closed / total\n                v_closed.visibility = VISIBLE\n            } else {\n                v_closed.visibility = GONE\n            }\n            ll_milestone_graph.visibility = VISIBLE\n        } else {\n            tv_milestone.setText(R.string.none)\n            ll_milestone_graph.visibility = GONE\n        }\n    }\n\n    private fun updateAssignee() {\n        val assignee = issue!!.assignee()\n        val login = assignee?.login()\n        if (!TextUtils.isEmpty(login)) {\n            tv_assignee_name.text = buildSpannedString {\n                bold {\n                    append(login)\n                }\n            }\n            iv_assignee_avatar.visibility = VISIBLE\n            avatars.bind(iv_assignee_avatar, assignee)\n        } else {\n            iv_assignee_avatar.visibility = GONE\n            tv_assignee_name.setText(R.string.unassigned)\n        }\n    }\n\n    private fun updateLabels() {\n        val labels = issue!!.labels().orEmpty()\n        if (labels.isNotEmpty()) {\n            LabelDrawableSpan.setText(tv_labels, labels)\n        } else {\n            tv_labels.setText(R.string.none)\n        }\n    }\n\n    override fun onSaveInstanceState(outState: Bundle) {\n        super.onSaveInstanceState(outState)\n\n        outState!!.putParcelable(EXTRA_ISSUE, issue)\n    }\n\n    private fun updateSaveMenu(text: CharSequence = et_issue_title.text) {\n        saveItem?.isEnabled = text.isNotEmpty()\n    }\n\n    override fun onCreateOptionsMenu(menu: Menu): Boolean {\n        menuInflater.inflate(R.menu.activity_issue_edit, menu)\n        saveItem = menu.findItem(R.id.m_apply)\n        updateSaveMenu()\n        return super.onCreateOptionsMenu(menu)\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        when (item.itemId) {\n            R.id.m_apply -> {\n                val request = IssueRequest.builder()\n                        .body(et_issue_body.text.toString())\n                        .title(et_issue_title.text.toString())\n                        .state(issue!!.state())\n\n                if (issue!!.assignee() != null) {\n                    request.assignees(listOf(issue!!.assignee()!!.login()!!))\n                } else {\n                    request.assignees(emptyList())\n                }\n\n                if (issue!!.milestone() != null) {\n                    request.milestone(issue!!.milestone()!!.number()!!)\n                }\n\n                val labels = issue!!.labels().orEmpty().map { it.name()!! }\n                request.labels(labels)\n\n                val service = ServiceGenerator.createService(this, IssueService::class.java)\n                val single: Single<Response<Issue>>\n                val message: Int\n\n                if (issue!!.number() != null && issue!!.number()!! > 0) {\n                    single = service.editIssue(\n                            repository!!.owner()!!.login(),\n                            repository!!.name(),\n                            issue!!.number()!!.toLong(),\n                            request.build()\n                    )\n                    message = R.string.updating_issue\n                } else {\n                    single = service.createIssue(\n                            repository!!.owner()!!.login(),\n                            repository!!.name(),\n                            request.build()\n                    )\n                    message = R.string.creating_issue\n                }\n\n                single.subscribeOn(Schedulers.io())\n                        .observeOn(AndroidSchedulers.mainThread())\n                        .compose(RxProgress.bindToLifecycle(this, message))\n                        .`as`(AutoDisposeUtils.bindToLifecycle(this))\n                        .subscribe({ response ->\n                            val intent = Intent()\n                            intent.putExtra(EXTRA_ISSUE, response.body())\n                            setResult(Activity.RESULT_OK, intent)\n                            finish()\n                        }, { e ->\n                            Log.e(TAG, \"Exception creating issue\", e)\n                            ToastUtils.show(this, e.message)\n                        })\n                return true\n            }\n            else -> return super.onOptionsItemSelected(item)\n        }\n    }\n\n    private fun checkCollaboratorStatus() {\n        ServiceGenerator.createService(this, RepositoryCollaboratorService::class.java)\n                .isUserCollaborator(\n                        repository!!.owner()!!.login(),\n                        repository!!.name(),\n                        AccountUtils.getLogin(this)\n                )\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .`as`(AutoDisposeUtils.bindToLifecycle(this))\n                .subscribe({ response ->\n                    showMainContent()\n                    if (response.code() == 204) {\n                        showCollaboratorOptions()\n                    }\n                }, { e ->\n                    showMainContent()\n                    Log.e(TAG, \"Exception creating issue\", e)\n                    ToastUtils.show(this, e.message)\n                })\n    }\n\n    companion object {\n\n        private const val TAG = \"EditIssueActivity\"\n\n        private const val REQUEST_CODE_SELECT_PHOTO = 0\n        private const val READ_PERMISSION_REQUEST = 1\n\n        /**\n         * Create intent to create an issue\n         *\n         * @param repository\n         * @return intent\n         */\n        fun createIntent(repository: Repository?): Intent {\n            return createIntent(\n                    null,\n                    repository!!.owner()!!.login(),\n                    repository.name(),\n                    repository.owner()\n            )\n        }\n\n        /**\n         * Create intent to edit an issue\n         *\n         * @param issue\n         * @param repositoryOwner\n         * @param repositoryName\n         * @param user\n         * @return intent\n         */\n        fun createIntent(\n                issue: Issue?,\n                repositoryOwner: String?,\n                repositoryName: String?,\n                user: User?\n        ): Intent {\n            val builder = Builder(\"repo.issues.edit.VIEW\")\n            if (user != null) {\n                builder.add(EXTRA_USER, user)\n            }\n            builder.add(EXTRA_REPOSITORY_NAME, repositoryName)\n            builder.add(EXTRA_REPOSITORY_OWNER, repositoryOwner)\n            if (issue != null) {\n                builder.issue(issue)\n            }\n            return builder.toIntent()\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/issue/EditIssuesFilterActivity.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.issue\n\nimport android.content.Intent\nimport android.os.Bundle\nimport android.os.Parcelable\nimport android.view.Menu\nimport android.view.MenuItem\nimport android.view.View.GONE\nimport android.widget.RadioGroup\nimport com.github.pockethub.android.Intents.Builder\nimport com.github.pockethub.android.Intents.EXTRA_ISSUE_FILTER\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.core.issue.IssueFilter\nimport com.github.pockethub.android.ui.DialogResultListener\nimport com.github.pockethub.android.ui.base.BaseActivity\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.github.pockethub.android.util.InfoUtils\nimport kotlinx.android.synthetic.main.activity_issues_filter_edit.*\nimport javax.inject.Inject\n\n/**\n * Activity to create or edit an issues filter for a repository\n */\nclass EditIssuesFilterActivity : BaseActivity(), DialogResultListener {\n\n    @Inject\n    lateinit var avatars: AvatarLoader\n\n    private var labelsDialog: LabelsDialog? = null\n\n    private var milestoneDialog: MilestoneDialog? = null\n\n    private var assigneeDialog: AssigneeDialog? = null\n\n    private var filter: IssueFilter? = null\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_issues_filter_edit)\n\n        if (savedInstanceState != null) {\n            filter = savedInstanceState.getParcelable(EXTRA_ISSUE_FILTER)\n        }\n\n        if (filter == null) {\n            filter = intent.getParcelableExtra(EXTRA_ISSUE_FILTER)\n        }\n\n        val repository = filter!!.repository\n\n        val actionBar = supportActionBar!!\n        actionBar.setTitle(R.string.filter_issues_title)\n        actionBar.subtitle = InfoUtils.createRepoId(repository)\n\n        updateAssignee()\n        updateMilestone()\n        updateLabels()\n\n        val status = findViewById<RadioGroup>(R.id.issue_filter_status)\n        val sortOrder = findViewById<RadioGroup>(R.id.issue_sort_order)\n        val sortType = findViewById<RadioGroup>(R.id.issue_sort_type)\n\n        status.setOnCheckedChangeListener(this::onStatusChanged)\n        sortOrder.setOnCheckedChangeListener(this::onSortOrderChanged)\n        sortType.setOnCheckedChangeListener(this::onSortTypeChanged)\n\n        tv_assignee.setOnClickListener { onAssigneeClicked() }\n        tv_assignee_label.setOnClickListener { onAssigneeClicked() }\n\n        tv_milestone.setOnClickListener { onMilestoneClicked() }\n        tv_milestone_label.setOnClickListener { onMilestoneClicked() }\n\n        tv_labels.setOnClickListener { onLabelsClicked() }\n        tv_labels_label.setOnClickListener { onLabelsClicked() }\n\n        if (filter!!.isOpen) {\n            status.check(R.id.rb_open)\n        } else {\n            status.check(R.id.rb_closed)\n        }\n\n\n        if (filter!!.direction == IssueFilter.DIRECTION_ASCENDING) {\n            sortOrder.check(R.id.rb_asc)\n        } else {\n            sortOrder.check(R.id.rb_desc)\n        }\n\n        when (filter!!.sortType) {\n            IssueFilter.SORT_CREATED -> sortType.check(R.id.rb_created)\n            IssueFilter.SORT_UPDATED -> sortType.check(R.id.rb_updated)\n            IssueFilter.SORT_COMMENTS -> sortType.check(R.id.rb_comments)\n        }\n    }\n\n    override fun onCreateOptionsMenu(options: Menu): Boolean {\n        menuInflater.inflate(R.menu.activity_issue_filter, options)\n        return true\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        return when (item.itemId) {\n            R.id.m_apply -> {\n                val intent = Intent()\n                intent.putExtra(EXTRA_ISSUE_FILTER, filter as Parcelable)\n                setResult(RESULT_OK, intent)\n                finish()\n                true\n            }\n            else -> super.onOptionsItemSelected(item)\n        }\n    }\n\n    override fun onSaveInstanceState(outState: Bundle) {\n        super.onSaveInstanceState(outState)\n\n        outState.putParcelable(EXTRA_ISSUE_FILTER, filter)\n    }\n\n    fun onAssigneeClicked() {\n        if (assigneeDialog == null) {\n            assigneeDialog = AssigneeDialog(this, REQUEST_ASSIGNEE, filter!!.repository)\n        }\n        assigneeDialog!!.show(filter!!.assignee)\n    }\n\n    fun onMilestoneClicked() {\n        if (milestoneDialog == null) {\n            milestoneDialog = MilestoneDialog(this, REQUEST_MILESTONE, filter!!.repository)\n        }\n        milestoneDialog!!.show(filter!!.milestone)\n    }\n\n    fun onLabelsClicked() {\n        if (labelsDialog == null) {\n            labelsDialog = LabelsDialog(this, REQUEST_LABELS, filter!!.repository)\n        }\n        labelsDialog!!.show(filter!!.labels)\n    }\n\n    private fun onStatusChanged(radioGroup: RadioGroup, checkedId: Int) {\n        filter!!.isOpen = checkedId == R.id.rb_open\n    }\n\n    private fun onSortOrderChanged(radioGroup: RadioGroup, checkedId: Int) {\n        if (checkedId == R.id.rb_asc) {\n            filter!!.direction = IssueFilter.DIRECTION_ASCENDING\n        } else {\n            filter!!.direction = IssueFilter.DIRECTION_DESCENDING\n        }\n    }\n\n    private fun onSortTypeChanged(radioGroup: RadioGroup, checkedId: Int) {\n        when (checkedId) {\n            R.id.rb_created -> filter!!.sortType = IssueFilter.SORT_CREATED\n            R.id.rb_updated -> filter!!.sortType = IssueFilter.SORT_UPDATED\n            R.id.rb_comments -> filter!!.sortType = IssueFilter.SORT_COMMENTS\n            else -> {\n            }\n        }\n    }\n\n    private fun updateLabels() {\n        val selected = filter!!.labels\n        if (selected != null) {\n            LabelDrawableSpan.setText(tv_labels, selected)\n        } else {\n            tv_labels.setText(R.string.none)\n        }\n    }\n\n    private fun updateMilestone() {\n        val selected = filter!!.milestone\n        if (selected != null) {\n            tv_milestone.text = selected.title()\n        } else {\n            tv_milestone.setText(R.string.none)\n        }\n    }\n\n    private fun updateAssignee() {\n        val selected = filter!!.assignee\n        if (selected != null) {\n            avatars.bind(iv_avatar, selected)\n            tv_assignee.text = selected.login()\n        } else {\n            iv_avatar.visibility = GONE\n            tv_assignee.setText(R.string.assignee_anyone)\n        }\n    }\n\n    override fun onDialogResult(requestCode: Int, resultCode: Int, arguments: Bundle) {\n        if (RESULT_OK != resultCode) {\n            return\n        }\n\n        when (requestCode) {\n            REQUEST_LABELS -> {\n                filter!!.setLabels(LabelsDialogFragment.getSelected(arguments))\n                updateLabels()\n            }\n            REQUEST_MILESTONE -> {\n                filter!!.milestone = MilestoneDialogFragment.getSelected(arguments)\n                updateMilestone()\n            }\n            REQUEST_ASSIGNEE -> {\n                filter!!.assignee = AssigneeDialogFragment.getSelected(arguments)\n                updateAssignee()\n            }\n        }\n    }\n\n    companion object {\n\n        /**\n         * Create intent for creating an issue filter for the given repository\n         *\n         * @param filter\n         * @return intent\n         */\n        fun createIntent(filter: IssueFilter): Intent {\n            return Builder(\"repo.issues.filter.VIEW\")\n                .add(EXTRA_ISSUE_FILTER, filter as Parcelable)\n                .toIntent()\n        }\n\n        private val REQUEST_LABELS = 1\n\n        private val REQUEST_MILESTONE = 2\n\n        private val REQUEST_ASSIGNEE = 3\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/issue/EditLabelsTask.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.issue;\n\nimport androidx.annotation.NonNull;\n\nimport com.github.pockethub.android.rx.AutoDisposeUtils;\nimport com.github.pockethub.android.rx.RxProgress;\nimport com.google.auto.factory.AutoFactory;\nimport com.google.auto.factory.Provided;\nimport com.meisolsson.githubsdk.model.Issue;\nimport com.meisolsson.githubsdk.model.Label;\nimport com.meisolsson.githubsdk.model.Repository;\nimport com.github.pockethub.android.R;\nimport com.github.pockethub.android.core.issue.IssueStore;\nimport com.github.pockethub.android.ui.base.BaseActivity;\nimport com.meisolsson.githubsdk.model.request.issue.IssueRequest;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport io.reactivex.android.schedulers.AndroidSchedulers;\nimport io.reactivex.functions.Consumer;\nimport io.reactivex.schedulers.Schedulers;\n\nimport static com.github.pockethub.android.RequestCodes.ISSUE_LABELS_UPDATE;\n\n/**\n * Task to edit labels\n */\n@AutoFactory\npublic class EditLabelsTask {\n\n    private final IssueStore store;\n\n    private final LabelsDialog labelsDialog;\n\n    private final BaseActivity activity;\n\n    private final Repository repositoryId;\n\n    private final int issueNumber;\n\n    private final Consumer<Issue> observer;\n\n    /**\n     * Create task to edit labels\n     *\n     * @param activity\n     * @param repositoryId\n     * @param issueNumber\n     */\n    public EditLabelsTask(@Provided IssueStore store, final BaseActivity activity,\n                          final Repository repositoryId, final int issueNumber,\n                          final Consumer<Issue> observer) {\n\n        this.activity = activity;\n        this.store = store;\n        this.repositoryId = repositoryId;\n        this.issueNumber = issueNumber;\n        this.observer = observer;\n        labelsDialog = new LabelsDialog(activity, ISSUE_LABELS_UPDATE, repositoryId);\n    }\n\n    /**\n     * Prompt for labels selection\n     *\n     * @param labels\n     *            current labels\n     * @return this task\n     */\n    public EditLabelsTask prompt(List<Label> labels) {\n        labelsDialog.show(labels);\n        return this;\n    }\n\n    /**\n     * Edit issue to have given labels.\n     *\n     * @param labels\n     * @return this task\n     */\n    public EditLabelsTask edit(@NonNull List<Label> labels) {\n        List<String> labelNames = new ArrayList<>();\n        for (Label label : labels) {\n            labelNames.add(label.name());\n        }\n\n        IssueRequest editIssue = IssueRequest.builder().labels(labelNames).build();\n\n        store.editIssue(repositoryId, issueNumber, editIssue)\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .compose(RxProgress.bindToLifecycle(activity, R.string.updating_labels))\n                .as(AutoDisposeUtils.bindToLifecycle(activity))\n                .subscribe(observer);\n        return this;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/issue/EditMilestoneTask.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.issue;\n\nimport com.github.pockethub.android.R;\nimport com.github.pockethub.android.core.issue.IssueStore;\nimport com.github.pockethub.android.rx.AutoDisposeUtils;\nimport com.github.pockethub.android.rx.RxProgress;\nimport com.github.pockethub.android.ui.base.BaseActivity;\nimport com.google.auto.factory.AutoFactory;\nimport com.google.auto.factory.Provided;\nimport com.meisolsson.githubsdk.model.Issue;\nimport com.meisolsson.githubsdk.model.Milestone;\nimport com.meisolsson.githubsdk.model.Repository;\nimport com.meisolsson.githubsdk.model.request.issue.IssueRequest;\n\nimport io.reactivex.android.schedulers.AndroidSchedulers;\nimport io.reactivex.functions.Consumer;\nimport io.reactivex.schedulers.Schedulers;\n\nimport static com.github.pockethub.android.RequestCodes.ISSUE_MILESTONE_UPDATE;\n\n/**\n * Task to edit a milestone\n */\n@AutoFactory\npublic class EditMilestoneTask {\n\n    private final IssueStore store;\n\n    private final MilestoneDialog milestoneDialog;\n\n    private final BaseActivity activity;\n\n    private final Repository repositoryId;\n\n    private final int issueNumber;\n\n    private final Consumer<Issue> observer;\n\n    /**\n     * Create task to edit a milestone\n     *\n     * @param activity\n     * @param repositoryId\n     * @param issueNumber\n     */\n    public EditMilestoneTask(@Provided IssueStore store, final BaseActivity activity,\n                             final Repository repositoryId, final int issueNumber,\n                             final Consumer<Issue> observer) {\n        this.store = store;\n        this.activity = activity;\n        this.repositoryId = repositoryId;\n        this.issueNumber = issueNumber;\n        this.observer = observer;\n        milestoneDialog = new MilestoneDialog(activity, ISSUE_MILESTONE_UPDATE, repositoryId);\n    }\n\n    /**\n     * Prompt for milestone selection\n     *\n     * @param milestone current milestone\n     * @return this task\n     */\n    public EditMilestoneTask prompt(Milestone milestone) {\n        milestoneDialog.show(milestone);\n        return this;\n    }\n\n    /**\n     * Edit issue to have given milestone\n     *\n     * @param milestone\n     * @return this task\n     */\n    public EditMilestoneTask edit(Milestone milestone) {\n        if (milestone != null) {\n            IssueRequest editedIssue = IssueRequest.builder().milestone(milestone.number()).build();\n\n            store.editIssue(repositoryId, issueNumber, editedIssue)\n                    .subscribeOn(Schedulers.io())\n                    .observeOn(AndroidSchedulers.mainThread())\n                    .compose(RxProgress.bindToLifecycle(activity, R.string.updating_milestone))\n                    .as(AutoDisposeUtils.bindToLifecycle(activity))\n                    .subscribe(observer);\n        }\n\n        return this;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/issue/EditStateTask.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.issue;\n\nimport com.github.pockethub.android.R;\nimport com.github.pockethub.android.core.issue.IssueStore;\nimport com.github.pockethub.android.rx.AutoDisposeUtils;\nimport com.github.pockethub.android.rx.RxProgress;\nimport com.github.pockethub.android.ui.base.BaseActivity;\nimport com.github.pockethub.android.ui.ConfirmDialogFragment;\nimport com.google.auto.factory.AutoFactory;\nimport com.google.auto.factory.Provided;\nimport com.meisolsson.githubsdk.model.Issue;\nimport com.meisolsson.githubsdk.model.IssueState;\nimport com.meisolsson.githubsdk.model.Repository;\n\nimport io.reactivex.android.schedulers.AndroidSchedulers;\nimport io.reactivex.functions.Consumer;\nimport io.reactivex.schedulers.Schedulers;\n\nimport static com.github.pockethub.android.RequestCodes.ISSUE_CLOSE;\nimport static com.github.pockethub.android.RequestCodes.ISSUE_REOPEN;\n\n/**\n * Task to close or reopen an issue\n */\n@AutoFactory\npublic class EditStateTask {\n\n    private final IssueStore store;\n\n    private final BaseActivity activity;\n    private final Repository repository;\n\n    private final int issueNumber;\n    private final Consumer<Issue> observer;\n\n    /**\n     * Create task to edit issue state\n     *\n     * @param activity\n     * @param repository\n     * @param issueNumber\n     */\n    public EditStateTask(@Provided IssueStore store, final BaseActivity activity,\n                         final Repository repository, final int issueNumber,\n                         final Consumer<Issue> observer) {\n        this.store = store;\n        this.activity = activity;\n        this.repository = repository;\n        this.issueNumber = issueNumber;\n        this.observer = observer;\n    }\n\n    /**\n     * Confirm action\n     *\n     * @param close\n     * @return this task\n     */\n    public EditStateTask confirm(boolean close) {\n        if (close) {\n            ConfirmDialogFragment.show(activity, ISSUE_CLOSE, activity.getString(R.string.issue_confirm_close_title),\n                    activity.getString(R.string.issue_confirm_close_message));\n        } else {\n            ConfirmDialogFragment.show(activity, ISSUE_REOPEN, activity.getString(R.string.issue_confirm_reopen_title),\n                    activity.getString(R.string.issue_confirm_reopen_message));\n        }\n\n        return this;\n    }\n\n    /**\n     * Edit state of issue.\n     *\n     * @param close\n     * @return this task\n     */\n    public EditStateTask edit(boolean close) {\n        int message = close ? R.string.closing_issue : R.string.reopening_issue;\n        IssueState state = close ? IssueState.Closed : IssueState.Open;\n\n        try {\n            store.changeState(repository, issueNumber, state)\n                    .subscribeOn(Schedulers.io())\n                    .observeOn(AndroidSchedulers.mainThread())\n                    .compose(RxProgress.bindToLifecycle(activity, message))\n                    .as(AutoDisposeUtils.bindToLifecycle(activity))\n                    .subscribe(observer);\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n\n        return this;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/issue/FilterListFragment.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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\npackage com.github.pockethub.android.ui.issue\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.annotation.NonNull\nimport com.github.pockethub.android.ui.helpers.ItemListHandler\nimport com.github.pockethub.android.ui.helpers.ListFetcher\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.core.issue.IssueFilter\nimport com.github.pockethub.android.persistence.AccountDataManager\nimport com.github.pockethub.android.ui.ConfirmDialogFragment\nimport com.github.pockethub.android.ui.base.BaseFragment\nimport com.github.pockethub.android.ui.item.issue.IssueFilterItem\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.github.pockethub.android.util.InfoUtils\nimport com.github.pockethub.android.util.ToastUtils\nimport com.xwray.groupie.Item\nimport com.xwray.groupie.OnItemClickListener\nimport com.xwray.groupie.OnItemLongClickListener\nimport io.reactivex.Observable\nimport io.reactivex.Single\nimport kotlinx.android.synthetic.main.fragment_item_list.view.*\nimport java.lang.String.CASE_INSENSITIVE_ORDER\nimport java.util.ArrayList\nimport java.util.Comparator\nimport javax.inject.Inject\n\n/**\n * Fragment to display a list of [IssueFilter] objects\n */\nclass FilterListFragment : BaseFragment(), Comparator<IssueFilter> {\n\n    @Inject\n    protected lateinit var cache: AccountDataManager\n\n    @Inject\n    protected lateinit var avatars: AvatarLoader\n\n    lateinit var listFetcher: ListFetcher<IssueFilter>\n\n    private lateinit var itemListHandler: ItemListHandler\n\n    private val errorMessage: Int\n        get() = R.string.error_bookmarks_load\n\n    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {\n        return inflater.inflate(R.layout.fragment_item_list, container, false)\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n\n        itemListHandler = ItemListHandler(\n            view.list,\n            view.empty,\n            lifecycle,\n            activity,\n            OnItemClickListener(this::onItemClick),\n            OnItemLongClickListener(this::onItemLongClick)\n        )\n        itemListHandler.setEmptyText(R.string.no_bookmarks)\n\n        listFetcher = ListFetcher(\n            view.swipe_item,\n            lifecycle,\n            itemListHandler,\n            { t -> ToastUtils.show(activity, errorMessage) },\n            this::loadData,\n            this::createItem\n        )\n    }\n\n    private fun loadData(forceRefresh: Boolean): Single<List<IssueFilter>> {\n        return Single.fromCallable { ArrayList(cache.issueFilters) }\n            .flatMap { filters ->\n                Observable.fromIterable(filters)\n                    .sorted(this@FilterListFragment)\n                    .toList()\n            }\n    }\n\n    private fun createItem(item: IssueFilter): Item<*> = IssueFilterItem(avatars, item)\n\n    fun onItemClick(item: Item<*>, view: View) {\n        if (item is IssueFilterItem) {\n            val filter = item.issueFilter\n            startActivity(IssueBrowseActivity.createIntent(filter))\n        }\n    }\n\n    fun onItemLongClick(@NonNull item: Item<*>, @NonNull view: View): Boolean {\n        if (item is IssueFilterItem) {\n            val filter = item.issueFilter\n            val args = Bundle()\n            args.putParcelable(ARG_FILTER, filter)\n            ConfirmDialogFragment.show(activity, REQUEST_DELETE,\n                getString(R.string.confirm_bookmark_delete_title),\n                getString(R.string.confirm_bookmark_delete_message), args)\n            return true\n        }\n\n        return false\n    }\n\n    override fun onResume() {\n        super.onResume()\n        listFetcher.refresh()\n    }\n\n    override fun compare(lhs: IssueFilter, rhs: IssueFilter): Int {\n        var compare = CASE_INSENSITIVE_ORDER.compare(InfoUtils.createRepoId(lhs.repository), InfoUtils.createRepoId(rhs.repository))\n        if (compare == 0) {\n            compare = CASE_INSENSITIVE_ORDER.compare(\n                lhs.toDisplay().toString(), rhs.toDisplay().toString())\n        }\n        return compare\n    }\n\n    companion object {\n\n        const val ARG_FILTER = \"filter\"\n\n        const val REQUEST_DELETE = 1\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/issue/FiltersViewActivity.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.issue;\n\nimport android.content.Intent;\nimport android.os.Bundle;\nimport android.view.MenuItem;\nimport androidx.appcompat.app.ActionBar;\nimport com.github.pockethub.android.Intents.Builder;\nimport com.github.pockethub.android.R;\nimport com.github.pockethub.android.core.issue.IssueFilter;\nimport com.github.pockethub.android.persistence.AccountDataManager;\nimport com.github.pockethub.android.ui.DialogResultListener;\nimport com.github.pockethub.android.ui.base.BaseActivity;\nimport com.github.pockethub.android.ui.MainActivity;\nimport io.reactivex.disposables.CompositeDisposable;\n\nimport javax.inject.Inject;\n\nimport static android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP;\nimport static android.content.Intent.FLAG_ACTIVITY_SINGLE_TOP;\nimport static com.github.pockethub.android.ui.issue.FilterListFragment.ARG_FILTER;\nimport static com.github.pockethub.android.ui.issue.FilterListFragment.REQUEST_DELETE;\n\n/**\n * Activity to display a list of saved {@link IssueFilter} objects\n */\npublic class FiltersViewActivity extends BaseActivity implements DialogResultListener {\n\n    private CompositeDisposable disposables;\n\n    /**\n     * Create intent to browse issue filters\n     *\n     * @return intent\n     */\n    public static Intent createIntent() {\n        return new Builder(\"repo.issues.filters.VIEW\").toIntent();\n    }\n\n    @Inject\n    protected AccountDataManager cache;\n\n    private FilterListFragment fragment;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.issues_filter_list);\n\n        ActionBar actionBar = getSupportActionBar();\n        actionBar.setTitle(R.string.bookmarks);\n        actionBar.setDisplayHomeAsUpEnabled(true);\n\n        fragment = (FilterListFragment) getSupportFragmentManager()\n            .findFragmentById(R.id.list);\n    }\n\n    @Override\n    public void onDialogResult(int requestCode, int resultCode, Bundle arguments) {\n        if (requestCode == REQUEST_DELETE && resultCode == RESULT_OK) {\n            IssueFilter filter = arguments.getParcelable(ARG_FILTER);\n            disposables.add(\n                    cache.removeIssueFilter(filter)\n                            .subscribe(response -> {\n                                if (fragment != null) {\n                                    fragment.listFetcher.forceRefresh();\n                                }\n                            })\n            );\n        }\n    }\n\n    @Override\n    protected void onDestroy() {\n        super.onDestroy();\n        if (disposables != null) {\n            disposables.dispose();\n        }\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(MenuItem item) {\n        switch (item.getItemId()) {\n            case android.R.id.home:\n                Intent intent = new Intent(this, MainActivity.class);\n                intent.addFlags(FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGLE_TOP);\n                startActivity(intent);\n                return true;\n            default:\n                return super.onOptionsItemSelected(item);\n        }\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/issue/IssueBrowseActivity.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.issue;\n\nimport android.content.Intent;\nimport android.os.Bundle;\nimport androidx.appcompat.app.ActionBar;\nimport android.view.MenuItem;\n\nimport com.github.pockethub.android.ui.MainActivity;\nimport com.meisolsson.githubsdk.model.Repository;\nimport com.github.pockethub.android.Intents.Builder;\nimport com.github.pockethub.android.R;\nimport com.github.pockethub.android.core.issue.IssueFilter;\nimport com.github.pockethub.android.ui.base.BaseActivity;\n\nimport static android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP;\nimport static android.content.Intent.FLAG_ACTIVITY_SINGLE_TOP;\nimport static com.github.pockethub.android.Intents.EXTRA_ISSUE_FILTER;\nimport static com.github.pockethub.android.Intents.EXTRA_REPOSITORY;\n\n/**\n * Activity for browsing a list of issues scoped to a single {@link IssueFilter}\n */\npublic class IssueBrowseActivity extends BaseActivity {\n\n    /**\n     * Create intent to browse the filtered issues\n     *\n     * @param filter\n     * @return intent\n     */\n    public static Intent createIntent(IssueFilter filter) {\n        return new Builder(\"repo.issues.VIEW\").repo(filter.getRepository())\n            .add(EXTRA_ISSUE_FILTER, filter).toIntent();\n    }\n\n    private Repository repo;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_repo_issue_list);\n\n        repo = getIntent().getParcelableExtra(EXTRA_REPOSITORY);\n\n        ActionBar actionBar = getSupportActionBar();\n        actionBar.setTitle(repo.name());\n        actionBar.setSubtitle(repo.owner().login());\n        actionBar.setDisplayHomeAsUpEnabled(true);\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(MenuItem item) {\n        switch (item.getItemId()) {\n            case android.R.id.home:\n                finish();\n                Intent intent = new Intent(this, MainActivity.class);\n                intent.addFlags(FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGLE_TOP);\n                startActivity(intent);\n                return true;\n            default:\n                return super.onOptionsItemSelected(item);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/issue/IssueDashboardPagerAdapter.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.issue;\n\nimport android.content.res.Resources;\nimport android.os.Bundle;\nimport androidx.fragment.app.Fragment;\nimport com.github.pockethub.android.R;\nimport com.github.pockethub.android.ui.base.FragmentStatePagerAdapter;\n\nimport java.io.Serializable;\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport static com.github.pockethub.android.core.issue.IssueFilter.*;\n\n/**\n * Pager adapter for the issues dashboard\n */\npublic class IssueDashboardPagerAdapter extends FragmentStatePagerAdapter {\n\n    private final Resources resources;\n\n    /**\n     * Create pager adapter\n     *\n     * @param fragment\n     */\n    public IssueDashboardPagerAdapter(final Fragment fragment) {\n        super(fragment);\n\n        resources = fragment.getResources();\n    }\n\n    @Override\n    public int getCount() {\n        return 4;\n    }\n\n    @Override\n    public Fragment getItem(final int position) {\n        String filter;\n        switch (position) {\n            case 0:\n                filter = FILTER_SUBSCRIBED;\n                break;\n            case 1:\n                filter = FILTER_ASSIGNED;\n                break;\n            case 2:\n                filter = FILTER_CREATED;\n                break;\n            case 3:\n                filter = FILTER_MENTIONED;\n                break;\n            default:\n                return null;\n        }\n        final Map<String, Object> filterData = new HashMap<>();\n        filterData.put(FIELD_FILTER, filter);\n        filterData.put(FIELD_SORT, SORT_UPDATED);\n        filterData.put(FIELD_DIRECTION, DIRECTION_DESCENDING);\n        Bundle bundle = new Bundle();\n        bundle.putSerializable(DashboardIssueFragment.Companion.getARG_FILTER(), (Serializable) filterData);\n        DashboardIssueFragment fragment = new DashboardIssueFragment();\n        fragment.setArguments(bundle);\n        return fragment;\n    }\n\n    @Override\n    public CharSequence getPageTitle(final int position) {\n        switch (position) {\n            case 0:\n                return resources.getString(R.string.tab_watched);\n            case 1:\n                return resources.getString(R.string.tab_assigned);\n            case 2:\n                return resources.getString(R.string.tab_created);\n            case 3:\n                return resources.getString(R.string.tab_mentioned);\n            default:\n                return null;\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/issue/IssueDashboardPagerFragment.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.issue\n\nimport android.content.Intent\nimport android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP\nimport android.content.Intent.FLAG_ACTIVITY_SINGLE_TOP\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.MenuItem\nimport android.view.View\nimport android.view.ViewGroup\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.ui.MainActivity\nimport com.github.pockethub.android.ui.helpers.PagerHandler\nimport com.github.pockethub.android.ui.base.BaseFragment\nimport kotlinx.android.synthetic.main.pager_with_tabs.*\nimport kotlinx.android.synthetic.main.pager_with_tabs.view.*\n\n/**\n * Dashboard activity for issues\n */\nclass IssueDashboardPagerFragment : BaseFragment() {\n\n    private var pagerHandler: PagerHandler<IssueDashboardPagerAdapter>? = null\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? {\n        return inflater.inflate(R.layout.pager_with_tabs, container, false)\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        setHasOptionsMenu(true)\n        view.toolbar.visibility = View.GONE\n        configurePager()\n    }\n\n    private fun configurePager() {\n        val adapter = IssueDashboardPagerAdapter(this)\n        pagerHandler = PagerHandler(this, vp_pages, adapter)\n        lifecycle.addObserver(pagerHandler!!)\n        pagerHandler!!.tabs = sliding_tabs_layout\n    }\n\n    override fun onDestroy() {\n        super.onDestroy()\n        lifecycle.removeObserver(pagerHandler!!)\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        return when (item.itemId) {\n            android.R.id.home -> {\n                val intent = Intent(activity, MainActivity::class.java)\n                intent.addFlags(FLAG_ACTIVITY_CLEAR_TOP or FLAG_ACTIVITY_SINGLE_TOP)\n                startActivity(intent)\n                true\n            }\n            else -> super.onOptionsItemSelected(item)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/issue/IssueFragment.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.issue\n\nimport android.app.Activity.RESULT_OK\nimport android.content.Intent\nimport android.os.Bundle\nimport android.util.Log\nimport android.view.LayoutInflater\nimport android.view.Menu\nimport android.view.MenuInflater\nimport android.view.MenuItem\nimport android.view.View\nimport android.view.View.GONE\nimport android.view.View.VISIBLE\nimport android.view.ViewGroup\nimport androidx.recyclerview.widget.DividerItemDecoration\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport com.github.pockethub.android.Intents.EXTRA_CAN_WRITE_REPO\nimport com.github.pockethub.android.Intents.EXTRA_COMMENT\nimport com.github.pockethub.android.Intents.EXTRA_ISSUE\nimport com.github.pockethub.android.Intents.EXTRA_ISSUE_NUMBER\nimport com.github.pockethub.android.Intents.EXTRA_REPOSITORY_NAME\nimport com.github.pockethub.android.Intents.EXTRA_REPOSITORY_OWNER\nimport com.github.pockethub.android.Intents.EXTRA_USER\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.RequestCodes.COMMENT_CREATE\nimport com.github.pockethub.android.RequestCodes.COMMENT_DELETE\nimport com.github.pockethub.android.RequestCodes.COMMENT_EDIT\nimport com.github.pockethub.android.RequestCodes.ISSUE_ASSIGNEE_UPDATE\nimport com.github.pockethub.android.RequestCodes.ISSUE_CLOSE\nimport com.github.pockethub.android.RequestCodes.ISSUE_EDIT\nimport com.github.pockethub.android.RequestCodes.ISSUE_LABELS_UPDATE\nimport com.github.pockethub.android.RequestCodes.ISSUE_MILESTONE_UPDATE\nimport com.github.pockethub.android.RequestCodes.ISSUE_REOPEN\nimport com.github.pockethub.android.accounts.AccountUtils\nimport com.github.pockethub.android.core.issue.IssueStore\nimport com.github.pockethub.android.core.issue.IssueUtils\nimport com.github.pockethub.android.core.issue.RefreshIssueTaskFactory\nimport com.github.pockethub.android.rx.AutoDisposeUtils\nimport com.github.pockethub.android.rx.RxProgress\nimport com.github.pockethub.android.ui.base.BaseActivity\nimport com.github.pockethub.android.ui.ConfirmDialogFragment\nimport com.github.pockethub.android.ui.DialogResultListener\nimport com.github.pockethub.android.ui.base.BaseFragment\nimport com.github.pockethub.android.ui.comment.DeleteCommentListener\nimport com.github.pockethub.android.ui.comment.EditCommentListener\nimport com.github.pockethub.android.ui.commit.CommitCompareViewActivity\nimport com.github.pockethub.android.ui.item.GitHubCommentItem\nimport com.github.pockethub.android.ui.item.LoadingItem\nimport com.github.pockethub.android.ui.item.issue.IssueEventItem\nimport com.github.pockethub.android.ui.item.issue.IssueHeaderItem\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.github.pockethub.android.util.HttpImageGetter\nimport com.github.pockethub.android.util.InfoUtils\nimport com.github.pockethub.android.util.ShareUtils\nimport com.github.pockethub.android.util.ToastUtils\nimport com.meisolsson.githubsdk.core.ServiceGenerator\nimport com.meisolsson.githubsdk.model.GitHubComment\nimport com.meisolsson.githubsdk.model.GitHubEvent\nimport com.meisolsson.githubsdk.model.Issue\nimport com.meisolsson.githubsdk.model.IssueEvent\nimport com.meisolsson.githubsdk.model.IssueState\nimport com.meisolsson.githubsdk.model.Repository\nimport com.meisolsson.githubsdk.model.User\nimport com.meisolsson.githubsdk.service.issues.IssueCommentService\nimport com.xwray.groupie.GroupAdapter\nimport com.xwray.groupie.Item\nimport com.xwray.groupie.Section\nimport com.xwray.groupie.ViewHolder\nimport io.reactivex.android.schedulers.AndroidSchedulers\nimport io.reactivex.functions.Consumer\nimport io.reactivex.schedulers.Schedulers\nimport kotlinx.android.synthetic.main.fragment_comment_list.*\nimport java.util.ArrayList\nimport javax.inject.Inject\n\n/**\n * Fragment to display an issue\n */\nclass IssueFragment : BaseFragment(), IssueHeaderItem.OnIssueHeaderActionListener, DialogResultListener {\n\n    private var issueNumber: Int = 0\n\n    private val items: MutableList<Any> = ArrayList()\n\n    private var repositoryId: Repository? = null\n\n    private var issue: Issue? = null\n\n    private var user: User? = null\n\n    private var canWrite: Boolean = false\n\n    private val adapter = GroupAdapter<ViewHolder>()\n\n    private val mainSection = Section()\n\n    private var milestoneTask: EditMilestoneTask? = null\n\n    private var assigneeTask: EditAssigneeTask? = null\n\n    private var labelsTask: EditLabelsTask? = null\n\n    private var stateTask: EditStateTask? = null\n\n    private var stateItem: MenuItem? = null\n\n    @Inject\n    lateinit var avatars: AvatarLoader\n\n    @Inject\n    lateinit var store: IssueStore\n\n    @Inject\n    lateinit var refreshIssueTaskFactory: RefreshIssueTaskFactory\n\n    @Inject\n    lateinit var labelsTaskFactory: EditLabelsTaskFactory\n\n    @Inject\n    lateinit var milestoneTaskFactory: EditMilestoneTaskFactory\n\n    @Inject\n    lateinit var assigneeTaskFactory: EditAssigneeTaskFactory\n\n    @Inject\n    lateinit var stateTaskFactory: EditStateTaskFactory\n\n    @Inject\n    lateinit var bodyImageGetter: HttpImageGetter\n\n    @Inject\n    lateinit var commentImageGetter: HttpImageGetter\n\n    /**\n     * Edit existing comment\n     */\n    private val editCommentListener: EditCommentListener = EditCommentListener { comment ->\n        startActivityForResult(EditCommentActivity.createIntent(\n                repositoryId, issueNumber, comment, user), COMMENT_EDIT)\n    }\n\n    /**\n     * Delete existing comment\n     */\n    private val deleteCommentListener = DeleteCommentListener{ comment ->\n        val args = Bundle()\n        args.putParcelable(EXTRA_COMMENT, comment)\n        ConfirmDialogFragment.show(\n                activity,\n                COMMENT_DELETE,\n                activity!!\n                        .getString(R.string.confirm_comment_delete_title),\n                activity!!.getString(\n                        R.string.confirm_comment_delete_message), args)\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setHasOptionsMenu(true)\n\n        val args = arguments\n        repositoryId = InfoUtils.createRepoFromData(\n                args!!.getString(EXTRA_REPOSITORY_OWNER),\n                args.getString(EXTRA_REPOSITORY_NAME))\n        issueNumber = args.getInt(EXTRA_ISSUE_NUMBER)\n        user = args.getParcelable(EXTRA_USER)\n        canWrite = args.getBoolean(EXTRA_CAN_WRITE_REPO, false)\n\n        val dialogActivity = activity as BaseActivity?\n\n        milestoneTask = milestoneTaskFactory.create(dialogActivity, repositoryId, issueNumber, createObserver())\n        labelsTask = labelsTaskFactory.create(dialogActivity, repositoryId, issueNumber, createObserver())\n        assigneeTask = assigneeTaskFactory.create(dialogActivity, repositoryId, issueNumber, createObserver())\n        stateTask = stateTaskFactory.create(dialogActivity, repositoryId, issueNumber, createObserver())\n\n        adapter.add(mainSection)\n    }\n\n    private fun createObserver(): Consumer<Issue> {\n        return Consumer { issue ->\n            updateHeader(issue)\n            refreshIssue()\n        }\n    }\n\n    override fun onActivityCreated(savedInstanceState: Bundle?) {\n        super.onActivityCreated(savedInstanceState)\n        issue = store.getIssue(repositoryId, issueNumber)\n\n        if (issue == null || issue!!.comments()!! > 0 && items.isEmpty()) {\n            mainSection.setFooter(LoadingItem())\n        }\n\n        if (issue != null && items.isNotEmpty()) {\n            updateList(issue, items)\n        } else {\n            if (issue != null) {\n                updateHeader(issue)\n            }\n            refreshIssue()\n        }\n    }\n\n    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,\n                              savedInstanceState: Bundle?): View? {\n        return inflater.inflate(R.layout.fragment_comment_list, container, false)\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n\n        val itemDecoration = DividerItemDecoration(activity!!, DividerItemDecoration.VERTICAL)\n        itemDecoration.setDrawable(resources.getDrawable(R.drawable.list_divider_5dp))\n\n        list.layoutManager = LinearLayoutManager(activity)\n        list.addItemDecoration(itemDecoration)\n        list.adapter = adapter\n    }\n\n    private fun updateHeader(issue: Issue?) {\n        if (!isAdded) {\n            return\n        }\n\n        if (issue != null) {\n            mainSection.setHeader(IssueHeaderItem(avatars, bodyImageGetter, requireContext(), this, issue))\n        }\n\n        pb_loading.visibility = GONE\n        list.visibility = VISIBLE\n        updateStateItem(issue)\n    }\n\n    private fun refreshIssue() {\n        refreshIssueTaskFactory.create(repositoryId, issueNumber)\n                .refresh()\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .filter { (_, _, _) -> isAdded }\n                .`as`(AutoDisposeUtils.bindToLifecycle(this))\n                .subscribe({ fullIssue ->\n                    issue = fullIssue.issue\n                    items.clear()\n                    items.addAll(fullIssue.events)\n                    items.addAll(fullIssue.comments)\n                    updateList(fullIssue.issue, items)\n                }, { _ ->\n                    ToastUtils.show(activity, R.string.error_issue_load)\n                    pb_loading.visibility = GONE\n                })\n    }\n\n    private fun updateList(issue: Issue?, items: MutableList<Any>) {\n        items.sortBy {\n            when (it) {\n                is GitHubComment -> it.createdAt()\n                is GitHubEvent -> it.createdAt()\n                is IssueEvent -> it.createdAt()\n                else -> null\n            }\n        }\n\n        val listItems = ArrayList<Item<*>>()\n        for (item in items) {\n            if (item is IssueEvent) {\n                listItems.add(IssueEventItem(avatars, activity!!, issue!!, item))\n            } else if (item is GitHubComment) {\n                listItems.add(\n                        GitHubCommentItem(avatars, commentImageGetter,\n                                editCommentListener, deleteCommentListener,\n                                AccountUtils.getLogin(activity), canWrite,\n                                item\n                        )\n                )\n            }\n        }\n\n        mainSection.removeFooter()\n        mainSection.update(listItems)\n        updateHeader(issue)\n    }\n\n    override fun onDialogResult(requestCode: Int, resultCode: Int, arguments: Bundle) {\n        if (RESULT_OK != resultCode) {\n            return\n        }\n\n        when (requestCode) {\n            ISSUE_MILESTONE_UPDATE -> milestoneTask!!.edit(MilestoneDialogFragment.getSelected(arguments))\n            ISSUE_ASSIGNEE_UPDATE -> assigneeTask!!.edit(AssigneeDialogFragment.getSelected(arguments))\n            ISSUE_LABELS_UPDATE -> {\n                val labels = LabelsDialogFragment.getSelected(arguments)\n                labelsTask!!.edit(labels)\n            }\n            ISSUE_CLOSE -> stateTask!!.edit(true)\n            ISSUE_REOPEN -> stateTask!!.edit(false)\n            COMMENT_DELETE -> {\n                val comment = arguments.getParcelable<GitHubComment>(EXTRA_COMMENT)\n\n                ServiceGenerator.createService(activity, IssueCommentService::class.java)\n                        .deleteIssueComment(repositoryId!!.owner()!!.login(), repositoryId!!.name(), comment!!.id()!!)\n                        .subscribeOn(Schedulers.io())\n                        .observeOn(AndroidSchedulers.mainThread())\n                        .compose(RxProgress.bindToLifecycle(activity, R.string.deleting_comment))\n                        .`as`(AutoDisposeUtils.bindToLifecycle(this))\n                        .subscribe({ _ ->\n                            if (items.isNotEmpty()) {\n                                val commentPosition = findCommentPositionInItems(comment)\n                                if (commentPosition >= 0) {\n                                    issue = issue!!.toBuilder()\n                                            .comments(issue!!.comments()!! - 1)\n                                            .build()\n\n                                    items.removeAt(commentPosition)\n                                    updateList(issue, items)\n                                }\n                            } else {\n                                refreshIssue()\n                            }\n                        }, { e ->\n                            Log.d(TAG, \"Exception deleting comment on issue\", e)\n                            ToastUtils.show(activity, e.message)\n                        })\n            }\n        }\n    }\n\n    private fun updateStateItem(issue: Issue?) {\n        if (issue != null && stateItem != null) {\n            if (IssueState.Open == issue.state()) {\n                stateItem!!.setTitle(R.string.close)\n                stateItem!!.setIcon(R.drawable.ic_github_issue_closed_white_24dp)\n            } else {\n                stateItem!!.setTitle(R.string.reopen)\n                stateItem!!.setIcon(R.drawable.ic_github_issue_reopened_white_24dp)\n            }\n        }\n    }\n\n    override fun onPrepareOptionsMenu(menu: Menu) {\n        super.onPrepareOptionsMenu(menu)\n        val editItem = menu.findItem(R.id.m_edit)\n        val stateItem = menu.findItem(R.id.m_state)\n        if (editItem != null && stateItem != null) {\n            var isCreator = false\n            if (issue != null) {\n                isCreator = issue!!.user()!!.login() == AccountUtils.getLogin(activity)\n            }\n            editItem.isVisible = canWrite || isCreator\n            stateItem.isVisible = canWrite || isCreator\n        }\n        updateStateItem(issue)\n    }\n\n    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {\n        super.onCreateOptionsMenu(menu, inflater)\n        inflater.inflate(R.menu.fragment_issue_view, menu)\n        stateItem = menu.findItem(R.id.m_state)\n        updateStateItem(issue)\n    }\n\n    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {\n        if (RESULT_OK != resultCode || data == null) {\n            return\n        }\n\n        when (requestCode) {\n            ISSUE_EDIT -> {\n                val editedIssue = data.getParcelableExtra<Issue>(EXTRA_ISSUE)\n                bodyImageGetter.encode(editedIssue.id(), editedIssue.bodyHtml())\n                updateHeader(editedIssue)\n                return\n            }\n            COMMENT_CREATE -> {\n                val comment: GitHubComment? = data.getParcelableExtra(EXTRA_COMMENT)\n                if (comment != null) {\n                    items += comment\n                    issue = issue!!.toBuilder()\n                            .comments(issue!!.comments()!! + 1)\n                            .build()\n                    updateList(issue, items)\n                }\n                return\n            }\n            COMMENT_EDIT -> {\n                val comment = data.getParcelableExtra<GitHubComment>(EXTRA_COMMENT)\n                if (comment != null && items.isNotEmpty()) {\n                    val commentPosition = findCommentPositionInItems(comment)\n                    if (commentPosition >= 0) {\n                        commentImageGetter.removeFromCache(comment.id())\n                        replaceCommentInItems(commentPosition, comment)\n                        updateList(issue, items)\n                    }\n                } else {\n                    refreshIssue()\n                }\n            }\n        }\n    }\n\n    private fun shareIssue() {\n        val id = InfoUtils.createRepoId(repositoryId)\n        if (IssueUtils.isPullRequest(issue)) {\n            startActivity(ShareUtils.create(\"Pull Request \" + issueNumber\n                    + \" on \" + id, \"https://github.com/\" + id + \"/pull/\"\n                    + issueNumber))\n        } else {\n            startActivity(ShareUtils\n                    .create(\"Issue $issueNumber on $id\",\n                            \"https://github.com/\" + id + \"/issues/\"\n                                    + issueNumber))\n        }\n    }\n\n    private fun openPullRequestCommits() {\n        if (IssueUtils.isPullRequest(issue)) {\n            val pullRequest = issue!!.pullRequest()\n\n            val base = pullRequest!!.base()!!.sha()\n            val head = pullRequest.head()!!.sha()\n            val repo = pullRequest.base()!!.repo()\n            startActivity(CommitCompareViewActivity.createIntent(repo, base, head))\n        }\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        when (item.itemId) {\n            R.id.m_edit -> {\n                if (issue != null) {\n                    startActivityForResult(EditIssueActivity.createIntent(issue,\n                            repositoryId!!.owner()!!.login(), repositoryId!!.name(), user),\n                            ISSUE_EDIT)\n                }\n                return true\n            }\n            R.id.m_comment -> {\n                if (issue != null) {\n                    startActivityForResult(CreateCommentActivity.createIntent(\n                            repositoryId, issueNumber, user), COMMENT_CREATE)\n                }\n                return true\n            }\n            R.id.m_refresh -> {\n                refreshIssue()\n                return true\n            }\n            R.id.m_share -> {\n                if (issue != null) {\n                    shareIssue()\n                }\n                return true\n            }\n            R.id.m_state -> {\n                if (issue != null) {\n                    stateTask!!.confirm(IssueState.Open == issue!!.state())\n                }\n                return true\n            }\n            else -> return super.onOptionsItemSelected(item)\n        }\n    }\n\n    /**\n     * Finds the position of the given comment in the list of this issue's items.\n     *\n     * @param comment The comment to look for.\n     * @return The position of the comment in the list, or -1 if not found.\n     */\n    private fun findCommentPositionInItems(comment: GitHubComment): Int {\n        val id = comment.id()\n        return items.indexOfFirst {\n            if (it is GitHubComment) {\n                return@indexOfFirst it.id()!! == id\n            }\n            return@indexOfFirst false\n        }\n    }\n\n    /**\n     * Replaces a comment in the list by another\n     *\n     * @param commentPosition The position of the comment in the list\n     * @param comment         The comment to replace\n     * @return True if successfully removed, false otherwise.\n     */\n    private fun replaceCommentInItems(commentPosition: Int, comment: GitHubComment): Boolean {\n        val item = items[commentPosition]\n        if (item is GitHubComment) {\n            items[commentPosition] = comment\n            return true\n        }\n        return false\n    }\n\n    override fun onCommitsClicked() {\n        if (IssueUtils.isPullRequest(issue)) {\n            openPullRequestCommits()\n        }\n    }\n\n    override fun onStateClicked() {\n        if (issue != null) {\n            stateTask!!.confirm(IssueState.Open == issue!!.state())\n        }\n    }\n\n    override fun onMilestonesClicked() {\n        if (issue != null && canWrite) {\n            milestoneTask!!.prompt(issue!!.milestone())\n        }\n    }\n\n    override fun onAssigneesClicked() {\n        if (issue != null && canWrite) {\n            assigneeTask!!.prompt(issue!!.assignee())\n        }\n    }\n\n    override fun onLabelsClicked() {\n        if (issue != null && canWrite) {\n            labelsTask!!.prompt(issue!!.labels())\n        }\n    }\n\n    companion object {\n        private val TAG = \"IssueFragment\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/issue/IssueSearchActivity.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.issue;\n\nimport android.app.SearchManager;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.os.Bundle;\nimport android.view.Menu;\nimport android.view.MenuItem;\nimport androidx.appcompat.app.ActionBar;\nimport androidx.appcompat.widget.SearchView;\nimport androidx.core.view.MenuItemCompat;\nimport com.github.pockethub.android.R;\nimport com.github.pockethub.android.ui.base.BaseActivity;\nimport com.github.pockethub.android.ui.repo.RepositoryViewActivity;\nimport com.github.pockethub.android.util.InfoUtils;\nimport com.github.pockethub.android.util.ToastUtils;\nimport com.meisolsson.githubsdk.model.Repository;\n\nimport static android.app.SearchManager.APP_DATA;\nimport static android.app.SearchManager.QUERY;\nimport static android.content.Intent.*;\nimport static com.github.pockethub.android.Intents.EXTRA_REPOSITORY;\n\n/**\n * Activity to search issues\n */\npublic class IssueSearchActivity extends BaseActivity {\n\n    private Repository repository;\n\n    private SearchIssueListFragment issueFragment;\n\n    private String lastQuery;\n\n    private SearchView searchView;\n\n    @Override\n    public boolean onCreateOptionsMenu(Menu options) {\n        getMenuInflater().inflate(R.menu.activity_search, options);\n\n        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);\n        MenuItem searchItem = options.findItem(R.id.m_search);\n        searchView = (SearchView) MenuItemCompat.getActionView(searchItem);\n        searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));\n\n        Bundle args = new Bundle();\n        args.putParcelable(EXTRA_REPOSITORY, repository);\n        searchView.setAppSearchData(args);\n        return true;\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(MenuItem item) {\n        switch (item.getItemId()) {\n            case R.id.m_search:\n                searchView.post(() -> searchView.setQuery(lastQuery, false));\n                return true;\n            case R.id.m_clear:\n                IssueSearchSuggestionsProvider.clear(this);\n                ToastUtils.show(this, R.string.search_history_cleared);\n                return true;\n            case android.R.id.home:\n                Intent intent = RepositoryViewActivity.Companion.createIntent(repository);\n                intent.addFlags(FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGLE_TOP);\n                startActivity(intent);\n                return true;\n            default:\n                return super.onOptionsItemSelected(item);\n        }\n    }\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_issue_search);\n\n        ActionBar actionBar = getSupportActionBar();\n        Bundle appData = getIntent().getBundleExtra(APP_DATA);\n        if (appData != null) {\n            repository = appData.getParcelable(EXTRA_REPOSITORY);\n            if (repository != null) {\n                actionBar.setSubtitle(InfoUtils.createRepoId(repository));\n                actionBar.setDisplayHomeAsUpEnabled(true);\n            }\n        }\n\n        issueFragment = (SearchIssueListFragment) getSupportFragmentManager()\n            .findFragmentById(R.id.list);\n\n        handleIntent(getIntent());\n    }\n\n    @Override\n    protected void onNewIntent(Intent intent) {\n        setIntent(intent);\n        handleIntent(intent);\n        issueFragment.pagedListFetcher.refresh();\n    }\n\n    private void handleIntent(Intent intent) {\n        if (ACTION_SEARCH.equals(intent.getAction())) {\n            search(intent.getStringExtra(QUERY));\n        }\n    }\n\n    private void search(final String query) {\n        lastQuery = query;\n        getSupportActionBar().setTitle(query);\n        IssueSearchSuggestionsProvider.save(this, query);\n        issueFragment.setQuery(query);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/issue/IssueSearchSuggestionsProvider.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.issue;\n\nimport android.content.Context;\nimport android.content.SearchRecentSuggestionsProvider;\nimport android.provider.SearchRecentSuggestions;\n\nimport com.github.pockethub.android.BuildConfig;\n\n/**\n * Suggestions provider for recently searched for issue queries\n */\npublic class IssueSearchSuggestionsProvider extends\n        SearchRecentSuggestionsProvider {\n\n    private static final String AUTHORITY = BuildConfig.PROVIDER_AUTHORITY_SEARCH_SUGGEST_ISSUES;\n\n    /**\n     * Save query to history\n     *\n     * @param context\n     * @param query\n     */\n    public static void save(Context context, String query) {\n        suggestions(context).saveRecentQuery(query, null);\n    }\n\n    /**\n     * Clear query history\n     *\n     * @param context\n     */\n    public static void clear(Context context) {\n        suggestions(context).clearHistory();\n    }\n\n    private static SearchRecentSuggestions suggestions(Context context) {\n        return new SearchRecentSuggestions(context, AUTHORITY,\n                DATABASE_MODE_QUERIES);\n    }\n\n    /**\n     * Create suggestions provider for searched for issue queries\n     */\n    public IssueSearchSuggestionsProvider() {\n        setupSuggestions(AUTHORITY, DATABASE_MODE_QUERIES);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/issue/IssuesFragment.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.issue\n\nimport android.app.Activity.RESULT_OK\nimport android.app.SearchManager\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.Menu\nimport android.view.MenuInflater\nimport android.view.MenuItem\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.appcompat.widget.SearchView\nimport com.github.pockethub.android.Intents.EXTRA_ISSUE\nimport com.github.pockethub.android.Intents.EXTRA_ISSUE_FILTER\nimport com.github.pockethub.android.Intents.EXTRA_REPOSITORY\nimport com.github.pockethub.android.ui.helpers.ItemListHandler\nimport com.github.pockethub.android.ui.helpers.PagedListFetcher\nimport com.github.pockethub.android.ui.helpers.PagedScrollListener\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.RequestCodes.ISSUE_CREATE\nimport com.github.pockethub.android.RequestCodes.ISSUE_FILTER_EDIT\nimport com.github.pockethub.android.RequestCodes.ISSUE_VIEW\nimport com.github.pockethub.android.core.issue.IssueFilter\nimport com.github.pockethub.android.core.issue.IssueStore\nimport com.github.pockethub.android.persistence.AccountDataManager\nimport com.github.pockethub.android.ui.base.BaseFragment\nimport com.github.pockethub.android.ui.item.issue.IssueFilterHeaderItem\nimport com.github.pockethub.android.ui.item.issue.IssueItem\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.github.pockethub.android.util.ToastUtils\nimport com.meisolsson.githubsdk.model.Issue\nimport com.meisolsson.githubsdk.model.Page\nimport com.meisolsson.githubsdk.model.Repository\nimport com.meisolsson.githubsdk.service.issues.IssueService\nimport com.xwray.groupie.Item\nimport com.xwray.groupie.OnItemClickListener\nimport io.reactivex.Single\nimport kotlinx.android.synthetic.main.fragment_item_list.view.*\nimport retrofit2.Response\nimport java.util.*\nimport javax.inject.Inject\n\n/**\n * Fragment to display a list of issues\n */\nclass IssuesFragment : BaseFragment() {\n\n    @Inject\n    lateinit var cache: AccountDataManager\n\n    @Inject\n    lateinit var store: IssueStore\n\n    @Inject\n    lateinit var avatars: AvatarLoader\n\n    @Inject\n    lateinit var service: IssueService\n\n    private lateinit var pagedListFetcher: PagedListFetcher<Issue>\n\n    private lateinit var itemListHandler: ItemListHandler\n\n    private var filter: IssueFilter? = null\n    private var repository: Repository? = null\n\n    val errorMessage= R.string.error_issues_load\n\n    override fun onAttach(context: Context) {\n        super.onAttach(context)\n\n        val intent = activity?.intent\n        filter = intent?.getParcelableExtra(EXTRA_ISSUE_FILTER)\n        repository = intent?.getParcelableExtra(EXTRA_REPOSITORY)\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        if (filter == null) {\n            filter = IssueFilter(repository, UUID.randomUUID().toString())\n        }\n    }\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? {\n        return inflater.inflate(R.layout.fragment_item_list, container, false)\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        setHasOptionsMenu(true);\n        itemListHandler = ItemListHandler(\n            view.list,\n            view.empty,\n            lifecycle,\n            activity,\n            OnItemClickListener(this::onItemClick)\n        )\n\n        pagedListFetcher = PagedListFetcher(\n            view.swipe_item,\n            lifecycle,\n            itemListHandler,\n            { t -> ToastUtils.show(activity, errorMessage) },\n            this::loadData,\n            this::createItem\n        )\n\n        view.list.addOnScrollListener(\n            PagedScrollListener(itemListHandler.mainSection, pagedListFetcher)\n        )\n        itemListHandler.setEmptyText(R.string.no_issues)\n        itemListHandler.mainSection.setHeader(IssueFilterHeaderItem(avatars, filter!!))\n    }\n\n    private fun onItemClick(item: Item<*>, view: View) {\n        if (item is IssueItem) {\n            // Remove one since we have a header\n            val position = itemListHandler.getItemPosition(item) - 1\n            val issues = itemListHandler.items\n                .filterIsInstance<IssueItem>()\n                .map { it.issue }\n\n            startActivityForResult(IssuesViewActivity.createIntent(issues, repository!!, position), ISSUE_VIEW)\n        } else if (item is IssueFilterHeaderItem) {\n            startActivityForResult(EditIssuesFilterActivity.createIntent(filter!!), ISSUE_FILTER_EDIT)\n        }\n    }\n\n    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {\n        super.onCreateOptionsMenu(menu, inflater)\n        inflater.inflate(R.menu.fragment_issues, menu)\n\n        val searchManager = activity!!.getSystemService(Context.SEARCH_SERVICE) as SearchManager\n        val searchItem = menu.findItem(R.id.m_search)\n        val searchView = searchItem.actionView as SearchView\n        searchView.setSearchableInfo(searchManager.getSearchableInfo(activity!!.componentName))\n\n        val args = Bundle()\n        args.putParcelable(EXTRA_REPOSITORY, repository)\n        searchView.setAppSearchData(args)\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        if (!isAdded) {\n            return false\n        }\n        when (item.itemId) {\n            R.id.m_refresh -> {\n                pagedListFetcher.refresh()\n                return true\n            }\n            R.id.create_issue -> {\n                startActivityForResult(EditIssueActivity.createIntent(repository), ISSUE_CREATE)\n                return true\n            }\n            R.id.m_filter -> {\n                startActivityForResult(EditIssuesFilterActivity.createIntent(filter!!), ISSUE_FILTER_EDIT)\n                return true\n            }\n            R.id.m_bookmark -> {\n                cache.addIssueFilter(filter)\n                    .subscribe(\n                        { ToastUtils.show(activity, R.string.message_filter_saved) },\n                        { ToastUtils.show(activity, R.string.message_filter_save_failed) }\n                    )\n                return true\n            }\n            else -> return super.onOptionsItemSelected(item)\n        }\n    }\n\n    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {\n        if (resultCode == RESULT_OK && requestCode == ISSUE_FILTER_EDIT && data != null) {\n            val newFilter = data.getParcelableExtra<IssueFilter>(EXTRA_ISSUE_FILTER)\n            if (filter != newFilter) {\n                filter = newFilter\n                itemListHandler.mainSection.setHeader(IssueFilterHeaderItem(avatars, filter!!))\n                pagedListFetcher.refresh()\n                return\n            }\n        }\n\n        if (requestCode == ISSUE_VIEW) {\n            pagedListFetcher.refresh()\n            return\n        }\n\n        if (requestCode == ISSUE_CREATE && resultCode == RESULT_OK) {\n            val created = data!!.getParcelableExtra<Issue>(EXTRA_ISSUE)\n            pagedListFetcher.refresh()\n            startActivityForResult(\n                IssuesViewActivity.createIntent(created, repository!!),\n                ISSUE_VIEW\n            )\n            return\n        }\n\n        super.onActivityResult(requestCode, resultCode, data)\n    }\n\n    private fun loadData(page: Int): Single<Response<Page<Issue>>> {\n        return service.getRepositoryIssues(\n            repository!!.owner()!!.login(),\n            repository!!.name(),\n            filter!!.toFilterMap(),\n            page.toLong()\n        )\n    }\n\n    private fun createItem(item: Issue) = IssueItem(avatars, item)\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/issue/IssuesPagerAdapter.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.issue;\n\nimport android.os.Bundle;\nimport androidx.fragment.app.Fragment;\nimport androidx.appcompat.app.AppCompatActivity;\nimport android.util.SparseArray;\nimport android.view.ViewGroup;\n\nimport com.meisolsson.githubsdk.model.Issue;\nimport com.meisolsson.githubsdk.model.Repository;\nimport com.meisolsson.githubsdk.model.User;\nimport com.github.pockethub.android.core.issue.IssueStore;\nimport com.github.pockethub.android.ui.base.FragmentStatePagerAdapter;\n\nimport java.util.List;\n\nimport static com.github.pockethub.android.Intents.*;\n\n\n/**\n * Adapter to page through an {@link Issue} array\n */\npublic class IssuesPagerAdapter extends FragmentStatePagerAdapter {\n\n    private final Repository repo;\n\n    private final List<Repository> repos;\n\n    private final int[] issues;\n\n    private final SparseArray<IssueFragment> fragments = new SparseArray<>();\n\n    private final IssueStore store;\n\n    private boolean canWrite;\n\n    /**\n     * @param activity\n     * @param repoIds\n     * @param issueNumbers\n     * @param issueStore\n     * @param canWrite\n     */\n    public IssuesPagerAdapter(AppCompatActivity activity,\n            List<Repository> repoIds, int[] issueNumbers,\n            IssueStore issueStore, boolean canWrite) {\n        super(activity);\n\n        repos = repoIds;\n        repo = null;\n        issues = issueNumbers;\n        store = issueStore;\n        this.canWrite = canWrite;\n    }\n\n    /**\n     * @param activity\n     * @param repository\n     * @param issueNumbers\n     * @param canWrite\n     */\n    public IssuesPagerAdapter(AppCompatActivity activity,\n            Repository repository, int[] issueNumbers,\n            boolean canWrite) {\n        super(activity);\n\n        repos = null;\n        repo = repository;\n        issues = issueNumbers;\n        store = null;\n        this.canWrite = canWrite;\n    }\n\n    @Override\n    public Fragment getItem(int position) {\n        IssueFragment fragment = new IssueFragment();\n        Bundle args = new Bundle();\n        if (repo != null) {\n            args.putString(EXTRA_REPOSITORY_NAME, repo.name());\n            User owner = repo.owner();\n            args.putString(EXTRA_REPOSITORY_OWNER, owner.login());\n            args.putParcelable(EXTRA_USER, owner);\n        } else {\n            Repository repo = repos.get(position);\n            args.putString(EXTRA_REPOSITORY_NAME, repo.name());\n            args.putString(EXTRA_REPOSITORY_OWNER, repo.owner().login());\n            Issue issue = store.getIssue(repo, issues[position]);\n            if (issue != null && issue.user() != null) {\n                Repository fullRepo = issue.repository();\n                if (fullRepo != null && fullRepo.owner() != null) {\n                    args.putParcelable(EXTRA_USER, fullRepo.owner());\n                }\n            }\n        }\n        args.putInt(EXTRA_ISSUE_NUMBER, issues[position]);\n        args.putBoolean(EXTRA_CAN_WRITE_REPO, canWrite);\n        fragment.setArguments(args);\n        return fragment;\n    }\n\n    @Override\n    public void destroyItem(ViewGroup container, int position, Object object) {\n        super.destroyItem(container, position, object);\n\n        fragments.remove(position);\n    }\n\n    @Override\n    public Object instantiateItem(ViewGroup container, int position) {\n        Object fragment = super.instantiateItem(container, position);\n        if (fragment instanceof IssueFragment) {\n            fragments.put(position, (IssueFragment) fragment);\n        }\n        return fragment;\n    }\n\n    @Override\n    public int getCount() {\n        return issues.length;\n    }\n\n    /**\n     * Deliver dialog result to fragment at given position\n     *\n     * @param position\n     * @param requestCode\n     * @param resultCode\n     * @param arguments\n     * @return this adapter\n     */\n    public IssuesPagerAdapter onDialogResult(int position, int requestCode,\n            int resultCode, Bundle arguments) {\n        IssueFragment fragment = fragments.get(position);\n        if (fragment != null) {\n            fragment.onDialogResult(requestCode, resultCode, arguments);\n        }\n        return this;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/issue/IssuesViewActivity.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.issue\n\nimport android.content.Intent\nimport android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP\nimport android.content.Intent.FLAG_ACTIVITY_SINGLE_TOP\nimport android.os.Bundle\nimport android.view.MenuItem\nimport com.github.pockethub.android.Intents.Builder\nimport com.github.pockethub.android.Intents.EXTRA_ISSUE_NUMBERS\nimport com.github.pockethub.android.Intents.EXTRA_POSITION\nimport com.github.pockethub.android.Intents.EXTRA_REPOSITORIES\nimport com.github.pockethub.android.Intents.EXTRA_REPOSITORY\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.core.issue.IssueStore\nimport com.github.pockethub.android.core.issue.IssueUtils\nimport com.github.pockethub.android.rx.AutoDisposeUtils\nimport com.github.pockethub.android.ui.DialogResultListener\nimport com.github.pockethub.android.ui.base.BaseActivity\nimport com.github.pockethub.android.ui.helpers.PagerHandler\nimport com.github.pockethub.android.ui.repo.RepositoryViewActivity\nimport com.github.pockethub.android.ui.user.UriLauncherActivity\nimport com.github.pockethub.android.util.InfoUtils\nimport com.meisolsson.githubsdk.core.ServiceGenerator\nimport com.meisolsson.githubsdk.model.Issue\nimport com.meisolsson.githubsdk.model.Repository\nimport com.meisolsson.githubsdk.model.User\nimport com.meisolsson.githubsdk.service.repositories.RepositoryService\nimport io.reactivex.android.schedulers.AndroidSchedulers\nimport io.reactivex.schedulers.Schedulers\nimport kotlinx.android.synthetic.main.activity_pager.*\nimport java.util.ArrayList\nimport javax.inject.Inject\n\n/**\n * Activity to display a collection of issues or pull requests in a pager\n */\nclass IssuesViewActivity : BaseActivity(), DialogResultListener {\n\n    @Inject\n    lateinit var store: IssueStore\n\n    private var issueNumbers: IntArray? = null\n\n    private var pullRequests: BooleanArray? = null\n\n    private var repoIds: ArrayList<Repository>? = null\n\n    private var repo: Repository? = null\n\n    private var user: User? = null\n\n    private var canWrite: Boolean = false\n\n    private var pagerHandler: PagerHandler<IssuesPagerAdapter>? = null\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_pager)\n\n        issueNumbers = intent.getIntArrayExtra(EXTRA_ISSUE_NUMBERS)\n        pullRequests = intent.getBooleanArrayExtra(EXTRA_PULL_REQUESTS)\n        repoIds = intent.getParcelableArrayListExtra(EXTRA_REPOSITORIES)\n        repo = intent.getParcelableExtra(EXTRA_REPOSITORY)\n\n        val actionBar = supportActionBar!!\n        actionBar.setDisplayHomeAsUpEnabled(true)\n        if (repo != null) {\n            actionBar.subtitle = InfoUtils.createRepoId(repo!!)\n            user = repo!!.owner()\n        }\n\n        // Load avatar if single issue and user is currently unset or missing\n        // avatar URL\n        if (repo == null) {\n            val temp = if (repo != null) repo else repoIds!![0]\n            ServiceGenerator.createService(this, RepositoryService::class.java)\n                .getRepository(temp!!.owner()!!.login(), temp.name())\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .`as`(AutoDisposeUtils.bindToLifecycle(this))\n                .subscribe { response -> repositoryLoaded(response.body()!!) }\n        } else {\n            repositoryLoaded(repo!!)\n        }\n    }\n\n    override fun onDestroy() {\n        super.onDestroy()\n        lifecycle.removeObserver(pagerHandler!!)\n    }\n\n    private fun repositoryLoaded(repo: Repository) {\n        val permission = repo.permissions()\n        canWrite = permission != null && (permission.admin()!! || permission.push()!!)\n\n        invalidateOptionsMenu()\n        configurePager()\n    }\n\n    private fun configurePager() {\n        val initialPosition = intent.getIntExtra(EXTRA_POSITION, -1)\n\n        val adapter = if (repo != null) {\n            IssuesPagerAdapter(this, repo, issueNumbers, canWrite)\n        } else {\n            IssuesPagerAdapter(this, repoIds, issueNumbers, store, canWrite)\n        }\n\n        pagerHandler = PagerHandler(this, vp_pages, adapter)\n        pagerHandler!!.onPagedChanged = this::onPageChange\n        lifecycle.addObserver(pagerHandler!!)\n        vp_pages.scheduleSetItem(initialPosition, pagerHandler)\n    }\n\n    private fun updateTitle(position: Int) {\n        val number = issueNumbers!![position]\n        val pullRequest = pullRequests!![position]\n\n        supportActionBar!!.title = if (pullRequest) {\n            getString(R.string.pull_request_title) + number\n        } else {\n            getString(R.string.issue_title) + number\n        }\n    }\n\n    private fun onPageChange(position: Int) {\n        if (repo != null) {\n            updateTitle(position)\n            return\n        }\n\n        if (repoIds == null) {\n            return\n        }\n\n        val actionBar = supportActionBar!!\n        repo = repoIds!![position]\n        if (repo != null) {\n            updateTitle(position)\n            actionBar.subtitle = InfoUtils.createRepoId(repo!!)\n            val issue = store.getIssue(repo, issueNumbers!![position])\n            if (issue != null) {\n                val fullRepo = issue.repository()\n                if (fullRepo?.owner() != null) {\n                    user = fullRepo.owner()\n                } else {\n                    actionBar.setLogo(null)\n                }\n            } else {\n                actionBar.setLogo(null)\n            }\n        } else {\n            actionBar.subtitle = null\n            actionBar.setLogo(null)\n        }\n    }\n\n    override fun onDialogResult(requestCode: Int, resultCode: Int, arguments: Bundle) {\n        pagerHandler!!.adapter\n            .onDialogResult(vp_pages.currentItem, requestCode, resultCode, arguments)\n    }\n\n    override fun startActivity(intent: Intent) {\n        val converted = UriLauncherActivity.convert(intent)\n        if (converted != null) {\n            super.startActivity(converted)\n        } else {\n            super.startActivity(intent)\n        }\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        when (item.itemId) {\n            android.R.id.home -> {\n                var repository = repo\n                if (repository == null) {\n                    val position = vp_pages.currentItem\n                    val repoId = repoIds!![position]\n                    val issue = store.getIssue(repoId,\n                        issueNumbers!![position])\n                    if (issue != null) {\n                        repository = issue.repository()\n                    }\n                }\n                if (repository != null) {\n                    val intent = RepositoryViewActivity.createIntent(repository)\n                    intent.addFlags(FLAG_ACTIVITY_CLEAR_TOP or FLAG_ACTIVITY_SINGLE_TOP)\n                    startActivity(intent)\n                }\n                return true\n            }\n            else -> return super.onOptionsItemSelected(item)\n        }\n    }\n\n    companion object {\n\n        private val EXTRA_PULL_REQUESTS = \"pullRequests\"\n\n        /**\n         * Create an intent to show a single issue\n         *\n         * @param issue\n         * @return intent\n         */\n        fun createIntent(issue: Issue): Intent {\n            return createIntent(listOf(issue), 0)\n        }\n\n        /**\n         * Create an intent to show issue\n         *\n         * @param issue\n         * @param repository\n         * @return intent\n         */\n        fun createIntent(issue: Issue,\n            repository: Repository): Intent {\n            return createIntent(listOf(issue), repository, 0)\n        }\n\n        /**\n         * Create an intent to show issues with an initial selected issue\n         *\n         * @param issues\n         * @param repository\n         * @param position\n         * @return intent\n         */\n        fun createIntent(issues: Collection<Issue>,\n            repository: Repository, position: Int): Intent {\n            val numbers = IntArray(issues.size)\n            val pullRequests = BooleanArray(issues.size)\n            for ((index, issue) in issues.withIndex()) {\n                numbers[index] = issue.number()!!\n                pullRequests[index] = IssueUtils.isPullRequest(issue)\n            }\n            return Builder(\"issues.VIEW\").add(EXTRA_ISSUE_NUMBERS, numbers)\n                .add(EXTRA_REPOSITORY, repository)\n                .add(EXTRA_POSITION, position)\n                .add(EXTRA_PULL_REQUESTS, pullRequests).toIntent()\n        }\n\n        /**\n         * Create an intent to show issues with an initial selected issue\n         *\n         * @param issues\n         * @param position\n         * @return intent\n         */\n        fun createIntent(issues: Collection<Issue>,\n            position: Int): Intent {\n            val count = issues.size\n            val numbers = IntArray(count)\n            val pullRequests = BooleanArray(count)\n            val repos = ArrayList<Repository>(count)\n            for ((index, issue) in issues.withIndex()) {\n                numbers[index] = issue.number()!!\n                pullRequests[index] = IssueUtils.isPullRequest(issue)\n\n                var repoId: Repository? = null\n                val issueRepo = issue.repository()\n                if (issueRepo != null) {\n                    val owner = issueRepo.owner()\n                    if (owner != null) {\n                        repoId = InfoUtils.createRepoFromData(owner.login(), issueRepo.name())\n                    }\n                }\n                if (repoId == null) {\n                    repoId = InfoUtils.createRepoFromUrl(issue.htmlUrl())\n                }\n                repos.add(repoId!!)\n            }\n\n            val builder = Builder(\"issues.VIEW\")\n            builder.add(EXTRA_ISSUE_NUMBERS, numbers)\n            builder.add(EXTRA_REPOSITORIES, repos)\n            builder.add(EXTRA_POSITION, position)\n            builder.add(EXTRA_PULL_REQUESTS, pullRequests)\n            return builder.toIntent()\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/issue/LabelDrawableSpan.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.issue\n\nimport android.content.res.Resources\nimport android.graphics.Canvas\nimport android.graphics.Color\nimport android.graphics.Color.WHITE\nimport android.graphics.Paint\nimport android.graphics.Rect\nimport android.graphics.Typeface.DEFAULT_BOLD\nimport android.graphics.drawable.Drawable\nimport android.graphics.drawable.GradientDrawable\nimport android.graphics.drawable.LayerDrawable\nimport android.graphics.drawable.PaintDrawable\nimport android.text.style.DynamicDrawableSpan\nimport android.widget.TextView\nimport androidx.core.text.buildSpannedString\nimport androidx.core.text.inSpans\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.util.ServiceUtils\nimport com.meisolsson.githubsdk.model.Label\nimport java.lang.Integer.MIN_VALUE\nimport java.lang.String.CASE_INSENSITIVE_ORDER\nimport java.util.*\nimport java.util.Locale.US\n\n\n/**\n * Span that draws a [Label]\n *\n * @constructor Create background span for label\n */\nclass LabelDrawableSpan(private val resources: Resources, private val textSize: Float, color: String, private val paddingLeft: Float, private val textHeight: Float, private val bounds: Rect, private val name: String) : DynamicDrawableSpan() {\n\n    private val color = Color.parseColor(\"#$color\")\n\n    /**\n     * @constructor Create drawable for labels\n     */\n    private class LabelDrawable(private val paddingLeft: Float, private val textHeight: Float, bounds: Rect, resources: Resources, textSize: Float, private val name: String, bg: Int) : PaintDrawable() {\n\n        private val height = bounds.height().toFloat()\n\n        private val textColor: Int\n\n        private val layers: LayerDrawable\n\n        init {\n            val hsv = FloatArray(3)\n            Color.colorToHSV(bg, hsv)\n            if (hsv[2] > 0.6 && hsv[1] < 0.4 || hsv[2] > 0.7 && hsv[0] > 40 && hsv[0] < 200) {\n                hsv[2] = 0.4f\n                textColor = Color.HSVToColor(hsv)\n            } else {\n                textColor = WHITE\n            }\n\n            layers = resources.getDrawable(R.drawable.label_background) as LayerDrawable\n            ((layers\n                    .findDrawableByLayerId(R.id.item_outer_layer) as LayerDrawable)\n                    .findDrawableByLayerId(R.id.item_outer) as GradientDrawable).setColor(bg)\n            ((layers\n                    .findDrawableByLayerId(R.id.item_inner_layer) as LayerDrawable)\n                    .findDrawableByLayerId(R.id.item_inner) as GradientDrawable).setColor(bg)\n            (layers.findDrawableByLayerId(R.id.item_bg) as GradientDrawable)\n                    .setColor(bg)\n\n            paint.apply {\n                isAntiAlias = true\n                color = resources.getColor(android.R.color.transparent)\n                typeface = DEFAULT_BOLD\n                this.textSize = textSize\n            }\n\n            layers.bounds = bounds\n            setBounds(bounds)\n        }\n\n        override fun draw(canvas: Canvas) {\n            super.draw(canvas)\n\n            layers.draw(canvas)\n\n            val paint = paint\n            val original = paint.color\n\n            paint.color = textColor\n            canvas.drawText(name, paddingLeft, height - (height - textHeight) / 2, paint)\n\n            paint.color = original\n        }\n    }\n\n    override fun getDrawable(): Drawable =\n            LabelDrawable(paddingLeft, textHeight, bounds, resources, textSize, name, color)\n\n    companion object {\n\n        /**\n         * Set text on view to be given labels\n         *\n         * @param view\n         * @param labels\n         */\n        @JvmStatic\n        fun setText(view: TextView, labels: Collection<Label>) {\n            val sortedLabels = labels.toTypedArray()\n            Arrays.sort(sortedLabels) { lhs, rhs -> CASE_INSENSITIVE_ORDER.compare(lhs.name(), rhs.name()) }\n            setText(view, sortedLabels)\n        }\n\n        /**\n         * Set text on view to be given label\n         *\n         * @param view\n         * @param label\n         */\n        @JvmStatic\n        fun setText(view: TextView, label: Label) {\n            setText(view, arrayOf(label))\n        }\n\n        private fun setText(view: TextView, labels: Array<Label>) {\n            val resources = view.resources\n            val paddingTop = resources.getDimension(R.dimen.label_padding_top)\n            val paddingLeft = resources.getDimension(R.dimen.label_padding_left)\n            val paddingRight = resources.getDimension(R.dimen.label_padding_right)\n            val paddingBottom = resources.getDimension(R.dimen.label_padding_bottom)\n\n            val p = Paint()\n            p.typeface = DEFAULT_BOLD\n            p.textSize = view.textSize\n\n            val textBounds = Rect()\n            val names = arrayOfNulls<String>(labels.size)\n            val nameWidths = IntArray(labels.size)\n            var textHeight = MIN_VALUE\n            for (i in labels.indices) {\n                val name = labels[i].name()!!.toUpperCase(US)\n                textBounds.setEmpty()\n                p.getTextBounds(name, 0, name.length, textBounds)\n                names[i] = name\n                textHeight = Math.max(textBounds.height(), textHeight)\n                nameWidths[i] = textBounds.width()\n            }\n\n            val textSize = view.textSize\n            view.text = buildSpannedString {\n                for (i in labels.indices) {\n                    val bounds = Rect()\n                    bounds.right = Math.round(nameWidths[i].toFloat() + paddingLeft + paddingRight + 0.5f)\n                    bounds.bottom = Math.round(textHeight.toFloat() + paddingTop + paddingBottom + 0.5f)\n\n                    inSpans(LabelDrawableSpan(resources, textSize, labels[i].color()!!, paddingLeft, textHeight.toFloat(), bounds, names[i]!!)) {\n                        append('\\uFFFC')\n                    }\n\n                    if (i + 1 < labels.size) {\n                        append(' ')\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/issue/LabelsDialog.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.issue;\n\nimport android.util.Log;\n\nimport com.github.pockethub.android.core.GitHubRequest;\nimport com.github.pockethub.android.rx.RxProgress;\nimport com.github.pockethub.android.util.RxPageUtil;\nimport com.meisolsson.githubsdk.core.ServiceGenerator;\nimport com.meisolsson.githubsdk.model.Label;\nimport com.meisolsson.githubsdk.model.Page;\nimport com.meisolsson.githubsdk.model.Repository;\nimport com.github.pockethub.android.R;\nimport com.github.pockethub.android.ui.base.BaseActivity;\nimport com.github.pockethub.android.util.ToastUtils;\nimport com.meisolsson.githubsdk.service.issues.IssueLabelService;\n\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Set;\n\nimport io.reactivex.Observable;\nimport io.reactivex.Single;\nimport retrofit2.Response;\n\nimport static java.lang.String.CASE_INSENSITIVE_ORDER;\n\n/**\n * Dialog helper to display a list of possibly selected issue labels\n */\npublic class LabelsDialog {\n\n    private static final String TAG = \"LabelsDialog\";\n\n    private final int requestCode;\n\n    private final BaseActivity activity;\n\n    private final Single<List<Label>> labelsSingle;\n\n    /**\n     * Create dialog helper to display labels\n     *\n     * @param activity\n     * @param requestCode\n     * @param repository\n     */\n    public LabelsDialog(final BaseActivity activity,\n            final int requestCode, final Repository repository) {\n        this.activity = activity;\n        this.requestCode = requestCode;\n\n        GitHubRequest<Response<Page<Label>>> gitHubRequest = page -> ServiceGenerator\n                .createService(activity, IssueLabelService.class)\n                .getRepositoryLabels(repository.owner().login(), repository.name(), page);\n\n        labelsSingle = RxPageUtil.getAllPages(gitHubRequest, 1)\n                .flatMap(page -> Observable.fromIterable(page.items()))\n                .toSortedList((o1, o2) -> CASE_INSENSITIVE_ORDER.compare(o1.name(), o2.name()))\n                .compose(RxProgress.bindToLifecycle(activity, R.string.loading_labels))\n                .cache();\n    }\n\n    /**\n     * Show dialog with given labels selected\n     *\n     * @param selectedLabels\n     */\n    public void show(Collection<Label> selectedLabels) {\n        labelsSingle.subscribe(labels -> {\n            final boolean[] checked = new boolean[labels.size()];\n            if (selectedLabels != null && !selectedLabels.isEmpty()) {\n                Set<String> selectedNames = new HashSet<>();\n                for (Label label : selectedLabels) {\n                    selectedNames.add(label.name());\n                }\n                for (int i = 0; i < checked.length; i++) {\n                    if (selectedNames.contains(labels.get(i).name())) {\n                        checked[i] = true;\n                    }\n                }\n            }\n            LabelsDialogFragment.show(activity, requestCode,\n                    activity.getString(R.string.select_labels), null, new ArrayList<>(labels), checked);\n        }, error -> {\n            Log.e(TAG, \"Exception loading labels\", error);\n            ToastUtils.show(activity, R.string.error_labels_load);\n        });\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/issue/LabelsDialogFragment.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.issue;\n\nimport android.app.Dialog;\nimport android.os.Bundle;\nimport androidx.annotation.NonNull;\nimport android.view.View;\n\nimport com.github.pockethub.android.R;\nimport com.github.pockethub.android.ui.base.BaseActivity;\nimport com.github.pockethub.android.ui.base.DialogFragmentHelper;\nimport com.github.pockethub.android.ui.item.dialog.LabelDialogItem;\nimport com.meisolsson.githubsdk.model.Label;\nimport com.xwray.groupie.GroupAdapter;\nimport com.xwray.groupie.Item;\nimport com.xwray.groupie.OnItemClickListener;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\n\nimport static android.app.Activity.RESULT_OK;\n\n/**\n * Dialog fragment to present labels where one or more can be selected\n */\npublic class LabelsDialogFragment extends DialogFragmentHelper implements OnItemClickListener {\n\n    /**\n     * Arguments key for the selected items\n     */\n    public static final String ARG_SELECTED = \"selected\";\n\n    private static final String ARG_CHOICES = \"choices\";\n\n    private static final String ARG_SELECTED_CHOICES = \"selectedChoices\";\n\n    private static final String TAG = \"multi_choice_dialog\";\n\n    boolean[] selectedChoices;\n    private GroupAdapter adapter;\n\n    /**\n     * Get selected labels from result bundle\n     *\n     * @param arguments\n     * @return selected labels\n     */\n    @SuppressWarnings(\"unchecked\")\n    public static ArrayList<Label> getSelected(Bundle arguments) {\n        return arguments.getParcelableArrayList(ARG_SELECTED);\n    }\n\n    /**\n     * Confirm message and deliver callback to given activity\n     *\n     * @param activity\n     * @param requestCode\n     * @param title\n     * @param message\n     * @param choices\n     * @param selectedChoices\n     */\n    public static void show(final BaseActivity activity, final int requestCode,\n                            final String title, final String message,\n                            final ArrayList<Label> choices, final boolean[] selectedChoices) {\n        Bundle arguments = createArguments(title, message, requestCode);\n        arguments.putParcelableArrayList(ARG_CHOICES, choices);\n        arguments.putBooleanArray(ARG_SELECTED_CHOICES, selectedChoices);\n        show(activity, new LabelsDialogFragment(), arguments, TAG);\n    }\n\n    @NonNull\n    @Override\n    public Dialog onCreateDialog(final Bundle savedInstanceState) {\n        selectedChoices = getArguments().getBooleanArray(ARG_SELECTED_CHOICES);\n\n        ArrayList<Label> choices = getChoices();\n        List<String> selected = new ArrayList<>();\n        if (selectedChoices != null) {\n            for (int i = 0; i < choices.size(); i++) {\n                if (selectedChoices[i]) {\n                    selected.add(choices.get(i).name());\n                }\n            }\n        }\n\n        adapter = new GroupAdapter();\n        for (Label label : getChoices()) {\n            adapter.add(new LabelDialogItem(label, selected.contains(label.name())));\n        }\n        adapter.setOnItemClickListener(this);\n\n        return createDialogBuilder()\n                .adapter(adapter, null)\n                .negativeText(R.string.cancel)\n                .neutralText(R.string.clear)\n                .positiveText(R.string.apply)\n                .onNeutral((dialog, which) -> {\n                    Arrays.fill(getArguments().getBooleanArray(ARG_SELECTED_CHOICES), false);\n                    onResult(RESULT_OK);\n                })\n                .onPositive((dialog, which) -> onResult(RESULT_OK))\n                .build();\n    }\n\n    @SuppressWarnings(\"unchecked\")\n    private ArrayList<Label> getChoices() {\n        return getArguments().getParcelableArrayList(ARG_CHOICES);\n    }\n\n    @Override\n    protected void onResult(int resultCode) {\n        Bundle arguments = getArguments();\n        ArrayList<Label> selected = new ArrayList<>();\n        ArrayList<Label> choices = getChoices();\n\n        if (selectedChoices != null) {\n            for (int i = 0; i < selectedChoices.length; i++) {\n                if (selectedChoices[i]) {\n                    selected.add(choices.get(i));\n                }\n            }\n        }\n        arguments.putParcelableArrayList(ARG_SELECTED, selected);\n\n        super.onResult(resultCode);\n        dismiss();\n    }\n\n    @Override\n    public void onItemClick(@NonNull Item item, @NonNull View view) {\n        if (item instanceof LabelDialogItem) {\n            LabelDialogItem labelDialogItem = (LabelDialogItem) item;\n\n            labelDialogItem.toggleSelected();\n            selectedChoices[adapter.getAdapterPosition(item)] = labelDialogItem.isSelected();\n            item.notifyChanged();\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/issue/MilestoneDialog.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.issue;\n\nimport android.util.Log;\n\nimport com.github.pockethub.android.R;\nimport com.github.pockethub.android.core.GitHubRequest;\nimport com.github.pockethub.android.rx.RxProgress;\nimport com.github.pockethub.android.ui.base.BaseActivity;\nimport com.github.pockethub.android.util.RxPageUtil;\nimport com.github.pockethub.android.util.ToastUtils;\nimport com.meisolsson.githubsdk.core.ServiceGenerator;\nimport com.meisolsson.githubsdk.model.Milestone;\nimport com.meisolsson.githubsdk.model.Page;\nimport com.meisolsson.githubsdk.model.Repository;\nimport com.meisolsson.githubsdk.service.issues.IssueMilestoneService;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport io.reactivex.Observable;\nimport io.reactivex.Single;\nimport retrofit2.Response;\n\nimport static java.lang.String.CASE_INSENSITIVE_ORDER;\n\n/**\n * Dialog helper to display a list of milestones to select one from\n */\npublic class MilestoneDialog {\n\n    private static final String TAG = \"MilestoneDialog\";\n\n    private final int requestCode;\n\n    private final BaseActivity activity;\n\n    private final Single<List<Milestone>> milestoneSingle;\n\n    /**\n     * Create dialog helper to display milestones\n     *\n     * @param activity\n     * @param requestCode\n     * @param repository\n     */\n    public MilestoneDialog(final BaseActivity activity,\n            final int requestCode, final Repository repository) {\n        this.activity = activity;\n        this.requestCode = requestCode;\n\n        GitHubRequest<Response<Page<Milestone>>> gitHubRequest = page -> ServiceGenerator\n                .createService(activity, IssueMilestoneService.class)\n                .getRepositoryMilestones(repository.owner().login(), repository.name(),\n                        \"open\", page);\n\n        milestoneSingle = RxPageUtil.getAllPages(gitHubRequest, 1)\n                .flatMap(page -> Observable.fromIterable(page.items()))\n                .toSortedList((m1, m2) -> CASE_INSENSITIVE_ORDER.compare(m1.title(), m2.title()))\n                .compose(RxProgress.bindToLifecycle(activity, R.string.loading_milestones))\n                .cache();\n    }\n\n    /**\n     * Show dialog with given milestone selected\n     *\n     * @param selectedMilestone\n     */\n    public void show(Milestone selectedMilestone) {\n        milestoneSingle.subscribe(milestones -> {\n            int checked = -1;\n            if (selectedMilestone != null) {\n                for (int i = 0; i < milestones.size(); i++) {\n                    if (selectedMilestone.number() == milestones.get(i).number()) {\n                        checked = i;\n                        break;\n                    }\n                }\n            }\n            MilestoneDialogFragment.show(activity, requestCode,\n                    activity.getString(R.string.select_milestone), null,\n                    new ArrayList<>(milestones), checked);\n        }, error -> {\n            Log.e(TAG, \"Exception loading milestones\", error);\n            ToastUtils.show(activity, R.string.error_milestones_load);\n        });\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/issue/MilestoneDialogFragment.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.issue\n\nimport android.app.Activity.RESULT_OK\nimport android.app.Dialog\nimport android.os.Bundle\nimport android.view.View\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.ui.base.BaseActivity\nimport com.github.pockethub.android.ui.SingleChoiceDialogFragment\nimport com.github.pockethub.android.ui.item.dialog.MilestoneDialogItem\nimport com.meisolsson.githubsdk.model.Milestone\nimport com.xwray.groupie.GroupAdapter\nimport com.xwray.groupie.Item\nimport com.xwray.groupie.ViewHolder\n\n/**\n * Dialog fragment to select an issue milestone\n */\nclass MilestoneDialogFragment : SingleChoiceDialogFragment() {\n\n    companion object {\n\n        /**\n         * Get selected milestone from results bundle\n         */\n        @JvmStatic\n        fun getSelected(arguments: Bundle): Milestone? {\n            return arguments.getParcelable(SingleChoiceDialogFragment.ARG_SELECTED)\n        }\n\n        /**\n         * Confirm message and deliver callback to given activity\n         */\n        @JvmStatic\n        fun show(activity: BaseActivity, requestCode: Int, title: String, message: String?, choices: ArrayList<Milestone>, selectedChoice: Int) {\n            SingleChoiceDialogFragment.show(activity, requestCode, title, message, choices, selectedChoice, MilestoneDialogFragment())\n        }\n    }\n\n    private val choices: List<Milestone>\n        get() = arguments!!.getParcelableArrayList(SingleChoiceDialogFragment.ARG_CHOICES)!!\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        val selected = arguments!!.getInt(SingleChoiceDialogFragment.ARG_SELECTED_CHOICE)\n\n        val adapter = GroupAdapter<ViewHolder>()\n        val items = choices.map { ref -> MilestoneDialogItem(ref, selected) }\n        adapter.addAll(items)\n        adapter.setOnItemClickListener(this)\n\n        return createDialogBuilder()\n                .adapter(adapter, null)\n                .negativeText(R.string.cancel)\n                .neutralText(R.string.clear)\n                .onNeutral { _, _ -> onResult(RESULT_OK) }\n                .build()\n    }\n\n    override fun onItemClick(item: Item<*>, view: View) {\n        super.onItemClick(item, view)\n        if (item is MilestoneDialogItem) {\n            arguments!!.putParcelable(SingleChoiceDialogFragment.ARG_SELECTED, item.milestone)\n            onResult(RESULT_OK)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/issue/SearchIssueListFragment.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.issue\n\nimport android.app.SearchManager.APP_DATA\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport com.github.pockethub.android.Intents.EXTRA_REPOSITORY\nimport com.github.pockethub.android.ui.helpers.ItemListHandler\nimport com.github.pockethub.android.ui.helpers.PagedListFetcher\nimport com.github.pockethub.android.ui.helpers.PagedScrollListener\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.ui.base.BaseFragment\nimport com.github.pockethub.android.ui.item.issue.IssueItem\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.github.pockethub.android.util.InfoUtils\nimport com.github.pockethub.android.util.ToastUtils\nimport com.meisolsson.githubsdk.model.Issue\nimport com.meisolsson.githubsdk.model.Page\nimport com.meisolsson.githubsdk.model.Repository\nimport com.meisolsson.githubsdk.service.search.SearchService\nimport com.xwray.groupie.Item\nimport com.xwray.groupie.OnItemClickListener\nimport io.reactivex.Single\nimport kotlinx.android.synthetic.main.fragment_item_list.view.*\nimport retrofit2.Response\nimport javax.inject.Inject\n\n/**\n * Fragment to display a list of [Issue] instances\n */\nclass SearchIssueListFragment : BaseFragment() {\n\n    @Inject\n    protected lateinit var service: SearchService\n\n    @Inject\n    protected lateinit var avatars: AvatarLoader\n\n    lateinit var pagedListFetcher: PagedListFetcher<Issue>\n\n    private lateinit var itemListHandler: ItemListHandler\n\n    private var repository: Repository? = null\n\n    private var query: String? = null\n\n    protected val errorMessage: Int\n        get() = R.string.error_issues_load\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        val appData = activity!!.intent.getBundleExtra(APP_DATA)\n        if (appData != null) {\n            repository = appData.getParcelable(EXTRA_REPOSITORY)\n        }\n    }\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? {\n        return inflater.inflate(R.layout.fragment_item_list, container, false)\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        itemListHandler = ItemListHandler(\n            view.list,\n            view.empty,\n            lifecycle,\n            activity,\n            OnItemClickListener(this::onItemClick)\n        )\n\n        pagedListFetcher = PagedListFetcher(\n            view.swipe_item,\n            lifecycle,\n            itemListHandler,\n            { t -> ToastUtils.show(activity, errorMessage) },\n            this::loadData,\n            this::createItem\n        )\n\n        view.list.addOnScrollListener(\n            PagedScrollListener(itemListHandler.mainSection, pagedListFetcher)\n        )\n        itemListHandler.setEmptyText(R.string.no_issues)\n    }\n    /**\n     * @param query\n     * @return this fragment\n     */\n    fun setQuery(query: String): SearchIssueListFragment {\n        this.query = query\n        return this\n    }\n\n    fun onItemClick(item: Item<*>, view: View) {\n        if (item is IssueItem) {\n            val searchIssue = item.issue\n            startActivity(IssuesViewActivity.createIntent(searchIssue, repository!!))\n        }\n    }\n\n    private fun loadData(page: Int): Single<Response<Page<Issue>>> {\n        val searchQuery = query + \"+repo:\" + InfoUtils.createRepoId(repository!!)\n        return service.searchIssues(searchQuery, null, null, page.toLong())\n            .map { response ->\n                val issueSearchPage = response.body()!!\n\n                Response.success(Page.builder<Issue>()\n                    .first(issueSearchPage.first())\n                    .last(issueSearchPage.last())\n                    .next(issueSearchPage.next())\n                    .prev(issueSearchPage.prev())\n                    .items(issueSearchPage.items())\n                    .build())\n            }\n    }\n\n    private fun createItem(item: Issue): Item<*> {\n        return IssueItem(avatars, item, false)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/ContributorItem.kt",
    "content": "package com.github.pockethub.android.ui.item\n\nimport android.widget.TextView\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.meisolsson.githubsdk.model.User\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\n\nclass ContributorItem(avatarLoader: AvatarLoader, user: User) : UserItem(avatarLoader, user) {\n\n    override fun getLayout() = R.layout.contributor_item\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        super.bind(holder, position)\n        val contributions = holder.root.findViewById<TextView>(R.id.tv_contributions)\n\n        val res = holder.root.resources\n        val text = res.getString(R.string.contributions, user.contributions())\n\n        contributions.text = text\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/GitHubCommentItem.kt",
    "content": "package com.github.pockethub.android.ui.item\n\nimport android.view.View\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.ui.comment.DeleteCommentListener\nimport com.github.pockethub.android.ui.comment.EditCommentListener\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.github.pockethub.android.util.HttpImageGetter\nimport com.github.pockethub.android.util.TimeUtils\nimport com.meisolsson.githubsdk.model.GitHubComment\nimport com.xwray.groupie.kotlinandroidextensions.Item\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\nimport kotlinx.android.synthetic.main.comment.*\n\nclass GitHubCommentItem(\n        private val avatarLoader: AvatarLoader,\n        private val imageGetter: HttpImageGetter,\n        private val editCommentListener: EditCommentListener?,\n        private val deleteCommentListener: DeleteCommentListener?,\n        private val username: String,\n        private val canWrite: Boolean,\n        val gitHubComment: GitHubComment\n) : Item(gitHubComment.id()!!) {\n\n    override fun getLayout() = R.layout.comment_item\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        imageGetter.bind(holder.tv_comment_body, gitHubComment.body(), gitHubComment.id())\n        avatarLoader.bind(holder.iv_avatar, gitHubComment.user())\n\n        holder.tv_comment_author.text = gitHubComment.user()!!.login()\n        holder.tv_comment_date.text = TimeUtils.getRelativeTime(gitHubComment.updatedAt())\n\n        val canEdit = (canWrite || gitHubComment.user()!!.login() == username) &&\n                editCommentListener != null\n\n        val canDelete = (canWrite || gitHubComment.user()!!.login() == username) &&\n                deleteCommentListener != null\n\n        if (canDelete) {\n            holder.iv_delete.visibility = View.VISIBLE\n            holder.iv_delete.setOnClickListener { _ ->\n                deleteCommentListener!!.onDeleteComment(gitHubComment)\n            }\n        } else {\n            holder.iv_delete.visibility = View.INVISIBLE\n        }\n\n        if (canEdit) {\n            holder.iv_edit.visibility = View.VISIBLE\n            holder.iv_edit.setOnClickListener { _ ->\n                editCommentListener!!.onEditComment(gitHubComment)\n            }\n        } else {\n            holder.iv_edit.visibility = View.INVISIBLE\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/LoadingItem.kt",
    "content": "package com.github.pockethub.android.ui.item\n\nimport com.github.pockethub.android.R\nimport com.xwray.groupie.kotlinandroidextensions.Item\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\n\nclass LoadingItem : Item() {\n\n    override fun getLayout() = R.layout.loading_item\n\n    override fun bind(holder: ViewHolder, position: Int) {}\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/TextItem.kt",
    "content": "package com.github.pockethub.android.ui.item\n\nimport androidx.annotation.IdRes\nimport androidx.annotation.LayoutRes\nimport android.widget.TextView\nimport com.xwray.groupie.kotlinandroidextensions.Item\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\n\nclass TextItem(\n        @param:LayoutRes private val layoutId: Int,\n        @param:IdRes private val textViewId: Int,\n        private val text: CharSequence\n) : Item(text.hashCode().toLong()) {\n\n    override fun getLayout() = layoutId\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        val textView = holder.root.findViewById<TextView>(textViewId)\n        textView.text = text\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/UserItem.kt",
    "content": "package com.github.pockethub.android.ui.item\n\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.meisolsson.githubsdk.model.User\nimport com.xwray.groupie.kotlinandroidextensions.Item\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\nimport kotlinx.android.synthetic.main.user_item.*\n\nopen class UserItem(private val avatarLoader: AvatarLoader, val user: User) : Item(user.id()!!) {\n\n    override fun getLayout() = R.layout.user_item\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        avatarLoader.bind(holder.iv_avatar, user)\n        holder.tv_login.text = user.login()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/code/BlobItem.kt",
    "content": "package com.github.pockethub.android.ui.item.code\n\nimport android.content.Context\nimport android.text.format.Formatter\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.core.code.FullTree\nimport com.xwray.groupie.kotlinandroidextensions.Item\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\nimport kotlinx.android.synthetic.main.blob_item.*\n\nclass BlobItem(\n        private val context: Context,\n        val file: FullTree.Entry\n) : Item(file.entry.sha()!!.hashCode().toLong()) {\n\n    override fun getLayout() = R.layout.blob_item\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        holder.tv_file.text = file.name\n        holder.tv_size.text = Formatter.formatFileSize(context, file.entry.size()!!.toLong())\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/code/FolderItem.kt",
    "content": "package com.github.pockethub.android.ui.item.code\n\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.core.code.FullTree\nimport com.github.pockethub.android.core.commit.CommitUtils\nimport com.xwray.groupie.kotlinandroidextensions.Item\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\nimport kotlinx.android.synthetic.main.folder_item.*\n\nclass FolderItem(val folder: FullTree.Folder) : Item(folder.entry.sha()!!.hashCode().toLong()) {\n\n    override fun getLayout() = R.layout.folder_item\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        holder.tv_folder.text = CommitUtils.getName(folder.name)\n        holder.tv_folders.text = folder.folders.size.toString()\n        holder.tv_files.text = folder.files.size.toString()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/code/PathHeaderItem.kt",
    "content": "package com.github.pockethub.android.ui.item.code\n\nimport com.github.pockethub.android.R\nimport com.xwray.groupie.kotlinandroidextensions.Item\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\nimport kotlinx.android.synthetic.main.path_item.*\n\nclass PathHeaderItem(private val path: CharSequence) : Item(path.hashCode().toLong()) {\n\n    override fun getLayout() = R.layout.path_item\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        holder.tv_path.text = path\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/commit/CommitCommentItem.kt",
    "content": "package com.github.pockethub.android.ui.item.commit\n\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.github.pockethub.android.util.HttpImageGetter\nimport com.github.pockethub.android.util.TimeUtils\nimport com.meisolsson.githubsdk.model.git.GitComment\nimport com.xwray.groupie.kotlinandroidextensions.Item\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\nimport kotlinx.android.synthetic.main.comment.*\n\nclass CommitCommentItem @JvmOverloads constructor(\n        private val avatarLoader: AvatarLoader,\n        private val imageGetter: HttpImageGetter,\n        val comment: GitComment,\n        private val isLineComment: Boolean = false\n) : Item(comment.id()!!) {\n\n    override fun getLayout() = if (isLineComment) {\n        R.layout.diff_comment_item\n    } else {\n        R.layout.commit_comment_item\n    }\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        avatarLoader.bind(holder.iv_avatar, comment.user())\n        holder.tv_comment_author.text = comment.user()!!.login()\n        holder.tv_comment_date.text = TimeUtils.getRelativeTime(comment.updatedAt())\n        imageGetter.bind(holder.tv_comment_body, comment.bodyHtml(), comment.id())\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/commit/CommitFileHeaderItem.kt",
    "content": "package com.github.pockethub.android.ui.item.commit\n\nimport android.content.Context\nimport android.view.View\nimport androidx.core.text.buildSpannedString\nimport androidx.core.text.color\nimport com.github.pockethub.android.R\nimport com.meisolsson.githubsdk.model.GitHubFile\nimport com.xwray.groupie.kotlinandroidextensions.Item\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\nimport kotlinx.android.synthetic.main.commit_diff_file_header.*\nimport java.text.NumberFormat\n\nclass CommitFileHeaderItem(\n        context: Context,\n        val file: GitHubFile\n) : Item(file.sha()!!.hashCode().toLong()) {\n\n    private val addTextColor = context.resources.getColor(R.color.diff_add_text)\n    private val removeTextColor = context.resources.getColor(R.color.diff_remove_text)\n\n    override fun getLayout() = R.layout.commit_diff_file_header\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        val path = file.filename()\n\n        val lastSlash = path!!.lastIndexOf('/')\n        if (lastSlash != -1) {\n            holder.tv_name.text = path.substring(lastSlash + 1)\n            holder.tv_folder.text = path.substring(0, lastSlash + 1)\n            holder.tv_folder.visibility = View.VISIBLE\n        } else {\n            holder.tv_name.text = path\n            holder.tv_folder.visibility = View.GONE\n        }\n\n        val numberFormat = NumberFormat.getIntegerInstance()\n\n        holder.tv_stats.text = buildSpannedString {\n            color(addTextColor) {\n                append(\"+${numberFormat.format(file.additions())}\")\n            }\n            append(\"   \")\n            color(removeTextColor) {\n                append(\"-${numberFormat.format(file.deletions())}\")\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/commit/CommitFileLineItem.kt",
    "content": "package com.github.pockethub.android.ui.item.commit\n\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.ui.commit.DiffStyler\nimport com.xwray.groupie.kotlinandroidextensions.Item\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\nimport kotlinx.android.synthetic.main.commit_diff_line.*\n\nclass CommitFileLineItem(\n        private val diffStyler: DiffStyler,\n        val line: CharSequence\n) : Item(line.hashCode().toLong()) {\n\n    override fun getLayout() = R.layout.commit_diff_line\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        holder.tv_diff.text = line\n        diffStyler.updateColors(line, holder.tv_diff)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/commit/CommitHeaderItem.kt",
    "content": "package com.github.pockethub.android.ui.item.commit\n\nimport android.content.Context\nimport android.view.View\nimport androidx.core.text.buildSpannedString\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.util.android.text.append\nimport com.github.pockethub.android.core.commit.CommitUtils\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.meisolsson.githubsdk.model.Commit\nimport com.xwray.groupie.kotlinandroidextensions.Item\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\nimport kotlinx.android.synthetic.main.commit_header.*\n\nclass CommitHeaderItem(\n        private val avatarLoader: AvatarLoader,\n        private val context: Context,\n        val commit: Commit\n) : Item(commit.sha()!!.hashCode().toLong()) {\n\n    override fun getLayout() = R.layout.commit_header\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        holder.tv_commit_message.text = commit.commit()!!.message()\n\n        val commitAuthor = CommitUtils.getAuthor(commit)\n        val commitCommitter = CommitUtils.getCommitter(commit)\n\n        if (commitAuthor != null) {\n            CommitUtils.bindAuthor(commit, avatarLoader, holder.iv_author)\n            holder.tv_author.text = commitAuthor\n            holder.tv_author_date.text = buildSpannedString {\n                append(context.getString(R.string.authored))\n\n                val commitAuthorDate = CommitUtils.getAuthorDate(commit)\n                if (commitAuthorDate != null) {\n                    append(' ')\n                    append(commitAuthorDate)\n                }\n            }\n            holder.ll_author.visibility = View.VISIBLE\n        } else {\n            holder.ll_author.visibility = View.GONE\n        }\n\n        if (isDifferentCommitter(commitAuthor, commitCommitter)) {\n            CommitUtils.bindCommitter(commit, avatarLoader, holder.iv_committer)\n            holder.tv_committer.text = commitCommitter\n            holder.tv_commit_date.text = buildSpannedString {\n                append(context.getString(R.string.committed))\n\n                val commitCommitterDate = CommitUtils.getCommitterDate(commit)\n                if (commitCommitterDate != null) {\n                    append(' ')\n                    append(commitCommitterDate)\n                }\n            }\n            holder.ll_committer.visibility = View.VISIBLE\n        } else {\n            holder.ll_committer.visibility = View.GONE\n        }\n    }\n\n    private fun isDifferentCommitter(author: String?, committer: String?): Boolean {\n        return committer != null && committer != author\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/commit/CommitItem.kt",
    "content": "package com.github.pockethub.android.ui.item.commit\n\nimport androidx.core.text.bold\nimport androidx.core.text.buildSpannedString\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.core.commit.CommitUtils\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.meisolsson.githubsdk.model.Commit\nimport com.xwray.groupie.kotlinandroidextensions.Item\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\nimport kotlinx.android.synthetic.main.commit_item.*\n\nclass CommitItem(\n        private val avatarLoader: AvatarLoader,\n        val commit: Commit\n) : Item(commit.sha()!!.hashCode().toLong()) {\n\n    override fun getLayout() = R.layout.commit_item\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        holder.tv_commit_id.text = CommitUtils.abbreviate(commit.sha())\n\n        holder.tv_commit_author.text = buildSpannedString {\n            bold {\n                append(CommitUtils.getAuthor(commit))\n            }\n            append(\" ${CommitUtils.getAuthorDate(commit)}\")\n        }\n\n        CommitUtils.bindAuthor(commit, avatarLoader, holder.iv_avatar)\n        holder.tv_commit_message.text = commit.commit()!!.message()\n        holder.tv_commit_comments.text = CommitUtils.getCommentCount(commit)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/commit/CommitParentItem.kt",
    "content": "package com.github.pockethub.android.ui.item.commit\n\nimport android.content.Context\nimport androidx.core.text.buildSpannedString\nimport androidx.core.text.underline\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.util.android.text.monospace\nimport com.github.pockethub.android.core.commit.CommitUtils\nimport com.meisolsson.githubsdk.model.Commit\nimport com.xwray.groupie.kotlinandroidextensions.Item\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\nimport kotlinx.android.synthetic.main.commit_parent_item.*\n\nclass CommitParentItem(\n        private val context: Context,\n        val commit: Commit\n) : Item(commit.sha()!!.hashCode().toLong()) {\n\n    override fun getLayout() = R.layout.commit_parent_item\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        holder.tv_commit_id.text = buildSpannedString {\n            underline {\n                append(context.getString(R.string.parent_prefix))\n                monospace {\n                    append(CommitUtils.abbreviate(commit.sha()))\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/dialog/AssigneeDialogItem.kt",
    "content": "package com.github.pockethub.android.ui.item.dialog\n\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.meisolsson.githubsdk.model.User\nimport com.xwray.groupie.kotlinandroidextensions.Item\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\nimport kotlinx.android.synthetic.main.collaborator_item.*\n\nclass AssigneeDialogItem(\n        private val avatarLoader: AvatarLoader,\n        val user: User,\n        private val selected: Int\n) : Item(user.id()!!) {\n\n    override fun getLayout() = R.layout.collaborator_item\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        holder.tv_login.text = user.login()\n        holder.rb_selected.isChecked = selected == position\n        avatarLoader.bind(holder.iv_avatar, user)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/dialog/LabelDialogItem.kt",
    "content": "package com.github.pockethub.android.ui.item.dialog\n\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.ui.issue.LabelDrawableSpan\nimport com.meisolsson.githubsdk.model.Label\nimport com.xwray.groupie.kotlinandroidextensions.Item\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\nimport kotlinx.android.synthetic.main.label_item.*\n\nclass LabelDialogItem(\n        val label: Label,\n        selected: Boolean\n) : Item(label.name()!!.hashCode().toLong()) {\n\n    var isSelected: Boolean = selected\n        private set\n\n    override fun getLayout() = R.layout.label_item\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        LabelDrawableSpan.setText(holder.tv_label_name, label)\n        holder.cb_selected.isChecked = isSelected\n    }\n\n    fun toggleSelected() {\n        isSelected = !isSelected\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/dialog/MilestoneDialogItem.kt",
    "content": "package com.github.pockethub.android.ui.item.dialog\n\nimport android.text.TextUtils\nimport android.view.View\nimport com.github.pockethub.android.R\nimport com.meisolsson.githubsdk.model.Milestone\nimport com.xwray.groupie.kotlinandroidextensions.Item\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\nimport kotlinx.android.synthetic.main.milestone_item.*\n\nclass MilestoneDialogItem(\n        val milestone: Milestone,\n        private val selected: Int\n) : Item(milestone.id()!!) {\n\n    override fun getLayout() = R.layout.milestone_item\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        holder.tv_milestone_title.text = milestone.title()\n\n        val description = milestone.description()\n        if (!TextUtils.isEmpty(description)) {\n            holder.tv_milestone_description.text = description\n            holder.tv_milestone_description.visibility = View.VISIBLE\n        } else {\n            holder.tv_milestone_description.visibility = View.GONE\n        }\n\n        holder.rb_selected.isChecked = selected == position\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/dialog/RefDialogItem.kt",
    "content": "package com.github.pockethub.android.ui.item.dialog\n\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.core.ref.RefUtils\nimport com.meisolsson.githubsdk.model.git.GitReference\nimport com.xwray.groupie.kotlinandroidextensions.Item\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\nimport kotlinx.android.synthetic.main.ref_item.*\n\nclass RefDialogItem(\n        val gitReference: GitReference,\n        private val selected: Int\n) : Item(gitReference.ref()!!.hashCode().toLong()) {\n\n    override fun getLayout() = R.layout.ref_item\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        if (RefUtils.isTag(gitReference)) {\n            holder.tv_ref_icon.setText(R.string.icon_tag)\n        } else {\n            holder.tv_ref_icon.setText(R.string.icon_fork)\n        }\n        holder.tv_ref.text = RefUtils.getName(gitReference)\n        holder.rb_selected.isChecked = selected == position\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/gist/GistFileItem.kt",
    "content": "package com.github.pockethub.android.ui.item.gist\n\nimport com.github.pockethub.android.R\nimport com.meisolsson.githubsdk.model.GistFile\nimport com.xwray.groupie.kotlinandroidextensions.Item\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\nimport kotlinx.android.synthetic.main.gist_file_item.*\n\nclass GistFileItem(val gistFile: GistFile) : Item(gistFile.filename()!!.hashCode().toLong()) {\n\n    override fun getLayout() = R.layout.gist_file_item\n\n    override fun bind(holer: ViewHolder, position: Int) {\n        holer.tv_file.text = gistFile.filename()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/gist/GistHeaderItem.kt",
    "content": "package com.github.pockethub.android.ui.item.gist\n\nimport android.content.Context\nimport android.text.TextUtils\nimport android.view.View.GONE\nimport android.view.View.VISIBLE\nimport androidx.core.text.buildSpannedString\nimport com.github.pockethub.android.R\nimport com.meisolsson.githubsdk.model.Gist\nimport com.xwray.groupie.kotlinandroidextensions.Item\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\nimport kotlinx.android.synthetic.main.gist_header.*\n\nclass GistHeaderItem(\n        private val context: Context,\n        val gist: Gist\n) : Item(gist.id()!!.hashCode().toLong()) {\n\n    override fun getLayout() = R.layout.gist_header\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        val createdAt = gist.createdAt()\n        if (createdAt != null) {\n            holder.tv_gist_creation.text = buildSpannedString {\n                append(\"${context.getString(R.string.prefix_created)}$createdAt\")\n            }\n            holder.tv_gist_creation.visibility = VISIBLE\n        } else {\n            holder.tv_gist_creation.visibility = GONE\n        }\n\n        val updatedAt = gist.updatedAt()\n        if (updatedAt != null && updatedAt != createdAt) {\n            holder.tv_gist_updated.text = buildSpannedString {\n                append(\"${context.getString(R.string.prefix_updated)}$updatedAt\")\n            }\n            holder.tv_gist_updated.visibility = VISIBLE\n        } else {\n            holder.tv_gist_updated.visibility = GONE\n        }\n\n        val desc = gist.description()\n        if (!TextUtils.isEmpty(desc)) {\n            holder.tv_gist_description.text = desc\n        } else {\n            holder.tv_gist_description.setText(R.string.no_description_given)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/gist/GistItem.kt",
    "content": "package com.github.pockethub.android.ui.item.gist\n\nimport android.text.TextUtils\nimport androidx.core.text.bold\nimport androidx.core.text.buildSpannedString\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.util.android.text.append\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.meisolsson.githubsdk.model.Gist\nimport com.xwray.groupie.kotlinandroidextensions.Item\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\nimport kotlinx.android.synthetic.main.gist_item.*\n\nclass GistItem(\n        private val avatarLoader: AvatarLoader,\n        val gist: Gist\n) : Item(gist.id()!!.hashCode().toLong()) {\n\n    override fun getLayout() = R.layout.gist_item\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        val description = gist.description()\n        if (!TextUtils.isEmpty(description)) {\n            holder.tv_gist_title.text = description\n        } else {\n            holder.tv_gist_title.setText(R.string.no_description_given)\n        }\n\n        val user = gist.owner()\n        avatarLoader.bind(holder.iv_avatar, user)\n\n        holder.tv_gist_author.text = buildSpannedString {\n            if (user != null) {\n                bold {\n                    append(user.login())\n                }\n            } else {\n                val res = holder.root.resources\n                bold {\n                    append(res.getString(R.string.anonymous))\n                }\n            }\n            append(' ')\n            append(gist.createdAt()!!)\n        }\n\n        holder.tv_gist_comments.text = gist.comments().toString()\n        holder.tv_gist_files.text = gist.files()!!.size.toString()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/issue/IssueDashboardItem.kt",
    "content": "package com.github.pockethub.android.ui.item.issue\n\nimport android.widget.TextView\n\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.github.pockethub.android.util.InfoUtils\nimport com.meisolsson.githubsdk.model.Issue\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\n\nclass IssueDashboardItem(\n        avatarLoader: AvatarLoader,\n        issue: Issue\n) : IssueItem(avatarLoader, issue) {\n\n    override fun getLayout() = R.layout.dashboard_issue_item\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        super.bind(holder, position)\n        val textView = holder.root.findViewById<TextView>(R.id.tv_issue_repo_name)\n        textView.text = InfoUtils.createRepoId(issue.repository())\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/issue/IssueEventItem.kt",
    "content": "package com.github.pockethub.android.ui.item.issue\n\nimport android.content.Context\nimport android.text.Html\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.ui.view.OcticonTextView\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.github.pockethub.android.util.TimeUtils\nimport com.meisolsson.githubsdk.model.Issue\nimport com.meisolsson.githubsdk.model.IssueEvent\nimport com.meisolsson.githubsdk.model.IssueEventType.*\nimport com.xwray.groupie.kotlinandroidextensions.Item\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\nimport kotlinx.android.synthetic.main.comment_event.*\nimport kotlinx.android.synthetic.main.comment_event.view.*\n\nclass IssueEventItem(\n        private val avatarLoader: AvatarLoader,\n        private val context: Context,\n        private val issue: Issue,\n        val issueEvent: IssueEvent\n) : Item(issueEvent.id()!!.toLong()) {\n\n    override fun getLayout(): Int = R.layout.comment_event_item\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        var message = String.format(\n                \"<b>%s</b> %s\",\n                issueEvent.actor()!!.login(),\n                issueEvent.event()\n        )\n        avatarLoader.bind(holder.itemView.iv_avatar, issueEvent.actor())\n\n        val eventType = issueEvent.event()\n\n        when (eventType) {\n            Assigned, Unassigned -> {\n                holder.tv_event.text = OcticonTextView.ICON_PERSON\n                holder.tv_event.setTextColor(context.resources.getColor(R.color.text_description))\n            }\n            Labeled, Unlabeled -> {\n                holder.tv_event.text = OcticonTextView.ICON_TAG\n                holder.tv_event.setTextColor(context.resources.getColor(R.color.text_description))\n            }\n            Referenced -> {\n                holder.tv_event.text = OcticonTextView.ICON_BOOKMARK\n                holder.tv_event.setTextColor(context.resources.getColor(R.color.text_description))\n            }\n            Milestoned, Demilestoned -> {\n                holder.tv_event.text = OcticonTextView.ICON_MILESTONE\n                holder.tv_event.setTextColor(context.resources.getColor(R.color.text_description))\n            }\n            Closed -> {\n                holder.tv_event.text = OcticonTextView.ICON_ISSUE_CLOSE\n                holder.tv_event.setTextColor(context.resources.getColor(R.color.issue_event_closed))\n            }\n            Reopened -> {\n                holder.tv_event.text = OcticonTextView.ICON_ISSUE_REOPEN\n                holder.tv_event.setTextColor(\n                        context.resources.getColor(R.color.issue_event_reopened)\n                )\n            }\n            Renamed -> {\n                holder.tv_event.text = OcticonTextView.ICON_EDIT\n                holder.tv_event.setTextColor(context.resources.getColor(R.color.text_description))\n            }\n            Merged -> {\n                message += String.format(\n                        \" commit <b>%s</b> into <tt>%s</tt> from <tt>%s</tt>\",\n                        issueEvent.commitId()!!.substring(0, 6),\n                        issue.pullRequest()!!.base()!!.ref(),\n                        issue.pullRequest()!!.head()!!.ref()\n                )\n                holder.tv_event.text = OcticonTextView.ICON_MERGE\n                holder.tv_event.setTextColor(context.resources.getColor(R.color.issue_event_merged))\n            }\n            Locked -> {\n                holder.tv_event.text = OcticonTextView.ICON_LOCK\n                holder.tv_event.setTextColor(\n                        context.resources.getColor(R.color.issue_event_lock))\n            }\n            Unlocked -> {\n                holder.tv_event.text = OcticonTextView.ICON_KEY\n                holder.tv_event.setTextColor(\n                        context.resources.getColor(R.color.issue_event_lock))\n            }\n        }\n\n        message += \" \" + TimeUtils.getRelativeTime(issueEvent.createdAt())\n        holder.tv_event.text = Html.fromHtml(message)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/issue/IssueFilterHeaderItem.kt",
    "content": "package com.github.pockethub.android.ui.item.issue\n\nimport android.view.View\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.core.issue.IssueFilter\nimport com.github.pockethub.android.ui.issue.LabelDrawableSpan\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.xwray.groupie.kotlinandroidextensions.Item\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\nimport kotlinx.android.synthetic.main.issues_filter_details.*\n\nclass IssueFilterHeaderItem(\n        private val avatarLoader: AvatarLoader,\n        val issueFilter: IssueFilter\n) : Item(issueFilter.hashCode().toLong()) {\n\n    override fun getLayout() = R.layout.issues_filter_header\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        if (issueFilter.isOpen) {\n            holder.tv_filter_state.setText(R.string.open_issues)\n        } else {\n            holder.tv_filter_state.setText(R.string.closed_issues)\n        }\n\n        val labels = issueFilter.labels\n        if (labels != null && !labels.isEmpty()) {\n            LabelDrawableSpan.setText(holder.tv_filter_labels, labels)\n            holder.tv_filter_labels.visibility = View.VISIBLE\n        } else {\n            holder.tv_filter_labels.visibility = View.GONE\n        }\n\n        val milestone = issueFilter.milestone\n        if (milestone != null) {\n            holder.tv_filter_milestone.text = milestone.title()\n            holder.tv_filter_milestone.visibility = View.VISIBLE\n        } else {\n            holder.tv_filter_milestone.visibility = View.GONE\n        }\n\n        val assignee = issueFilter.assignee\n        if (assignee != null) {\n            avatarLoader.bind(holder.iv_assignee_avatar, assignee)\n            holder.tv_filter_assignee.text = assignee.login()\n            holder.tv_filter_assignee.visibility = View.VISIBLE\n        } else {\n            holder.ll_assignee.visibility = View.GONE\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/issue/IssueFilterItem.kt",
    "content": "package com.github.pockethub.android.ui.item.issue\n\nimport android.view.View\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.core.issue.IssueFilter\nimport com.github.pockethub.android.ui.issue.LabelDrawableSpan\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.github.pockethub.android.util.InfoUtils\nimport com.xwray.groupie.kotlinandroidextensions.Item\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\nimport kotlinx.android.synthetic.main.issues_filter_details.*\nimport kotlinx.android.synthetic.main.issues_filter_item.*\n\nclass IssueFilterItem(\n        private val avatarLoader: AvatarLoader,\n        val issueFilter: IssueFilter\n) : Item(issueFilter.hashCode().toLong()) {\n\n    override fun getLayout() = R.layout.issues_filter_item\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        avatarLoader.bind(holder.iv_avatar, issueFilter.repository.owner())\n\n        holder.tv_repo_name.text = InfoUtils.createRepoId(issueFilter.repository)\n\n        if (issueFilter.isOpen) {\n            holder.tv_filter_state.setText(R.string.open_issues)\n        } else {\n            holder.tv_filter_state.setText(R.string.closed_issues)\n        }\n\n        val labels = issueFilter.labels\n        if (labels != null && !labels.isEmpty()) {\n            LabelDrawableSpan.setText(holder.tv_filter_labels, labels)\n            holder.tv_filter_labels.visibility = View.VISIBLE\n        } else {\n            holder.tv_filter_labels.visibility = View.GONE\n        }\n\n        val milestone = issueFilter.milestone\n        if (milestone != null) {\n            holder.tv_filter_milestone.text = milestone.title()\n            holder.tv_filter_milestone.visibility = View.VISIBLE\n        } else {\n            holder.tv_filter_milestone.visibility = View.GONE\n        }\n\n        val assignee = issueFilter.assignee\n        if (assignee != null) {\n            avatarLoader.bind(holder.iv_assignee_avatar, assignee)\n            holder.tv_filter_assignee.text = assignee.login()\n            holder.tv_filter_assignee.visibility = View.VISIBLE\n        } else {\n            holder.ll_assignee.visibility = View.GONE\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/issue/IssueHeaderItem.kt",
    "content": "package com.github.pockethub.android.ui.item.issue\n\nimport android.content.Context\nimport android.text.TextUtils\nimport android.view.View.GONE\nimport android.view.View.VISIBLE\nimport android.widget.LinearLayout\nimport androidx.core.text.bold\nimport androidx.core.text.buildSpannedString\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.util.android.text.append\nimport com.github.pockethub.android.core.issue.IssueUtils\nimport com.github.pockethub.android.ui.issue.LabelDrawableSpan\nimport com.github.pockethub.android.ui.view.OcticonTextView.ICON_COMMIT\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.github.pockethub.android.util.HttpImageGetter\nimport com.meisolsson.githubsdk.model.Issue\nimport com.meisolsson.githubsdk.model.IssueState\nimport com.xwray.groupie.kotlinandroidextensions.Item\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\nimport kotlinx.android.synthetic.main.issue_header.*\nimport kotlinx.android.synthetic.main.milestone.*\n\nclass IssueHeaderItem(\n        private val avatarLoader: AvatarLoader,\n        private val imageGetter: HttpImageGetter,\n        private val context: Context,\n        private val actionListener: OnIssueHeaderActionListener,\n        val issue: Issue\n) : Item(issue.id()!!) {\n\n    override fun getLayout() = R.layout.issue_header\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        holder.tv_issue_title.text = issue.title()\n\n        val body = issue.bodyHtml()\n        if (!TextUtils.isEmpty(body)) {\n            imageGetter.bind(holder.tv_issue_body, body, issue.id())\n        } else {\n            holder.tv_issue_body.setText(R.string.no_description_given)\n        }\n\n        holder.tv_issue_author.text = issue.user()!!.login()\n\n        holder.tv_issue_creation_date.text = buildSpannedString {\n            append(\"${context.getString(R.string.prefix_opened)}${issue.createdAt()}\")\n        }\n\n        avatarLoader.bind(holder.iv_avatar, issue.user())\n\n        if (IssueUtils.isPullRequest(issue) &&\n                issue.pullRequest()!!.commits() != null &&\n                issue.pullRequest()!!.commits()!! > 0\n        ) {\n            holder.ll_issue_commits.visibility = VISIBLE\n\n            holder.tv_commit_icon.text = ICON_COMMIT\n\n            val commits = context.getString(\n                    R.string.pull_request_commits,\n                    issue.pullRequest()!!.commits()\n            )\n            holder.tv_pull_request_commits.text = commits\n        } else {\n            holder.ll_issue_commits.visibility = GONE\n        }\n\n        val open = IssueState.Open == issue.state()\n        if (!open) {\n            holder.tv_state.text = buildSpannedString {\n                bold {\n                    append(context.getString(R.string.closed))\n                }\n                val closedAt = issue.closedAt()\n                if (closedAt != null) {\n                    append(' ')\n                    append(closedAt)\n                }\n            }\n            holder.tv_state.visibility = VISIBLE\n        } else {\n            holder.tv_state.visibility = GONE\n        }\n\n        val assignee = issue.assignee()\n        if (assignee != null) {\n            holder.tv_assignee_name.text = buildSpannedString {\n                bold {\n                    append(assignee.login())\n                }\n                append(\" ${context.getString(R.string.assigned)}\")\n            }\n            holder.iv_assignee_avatar.visibility = VISIBLE\n            avatarLoader.bind(holder.iv_assignee_avatar, assignee)\n        } else {\n            holder.iv_assignee_avatar.visibility = GONE\n            holder.tv_assignee_name.setText(R.string.unassigned)\n        }\n\n        val labels = issue.labels()\n        if (!labels.isNullOrEmpty()) {\n            LabelDrawableSpan.setText(holder.tv_labels, labels)\n            holder.tv_labels.visibility = VISIBLE\n        } else {\n            holder.tv_labels.visibility = GONE\n        }\n\n        if (issue.milestone() != null) {\n            val milestone = issue.milestone()\n            holder.tv_milestone.text = buildSpannedString {\n                append(\"${context.getString(R.string.milestone_prefix)} \")\n                bold {\n                    append(milestone!!.title())\n                }\n            }\n            val closed = milestone!!.closedIssues()!!.toFloat()\n            val total = closed + milestone.openIssues()!!\n            if (total > 0) {\n                (holder.v_closed.layoutParams as LinearLayout.LayoutParams).weight = closed / total\n\n                holder.v_closed.visibility = VISIBLE\n            } else {\n                holder.v_closed.visibility = GONE\n            }\n            holder.ll_milestone.visibility = VISIBLE\n        } else {\n            holder.ll_milestone.visibility = GONE\n        }\n\n        holder.ll_issue_commits.setOnClickListener { _ -> actionListener.onCommitsClicked() }\n        holder.tv_state.setOnClickListener { _ -> actionListener.onStateClicked() }\n        holder.ll_milestone.setOnClickListener { _ -> actionListener.onMilestonesClicked() }\n        holder.ll_assignee.setOnClickListener { _ -> actionListener.onAssigneesClicked() }\n        holder.tv_labels.setOnClickListener { _ -> actionListener.onLabelsClicked() }\n\n    }\n\n    interface OnIssueHeaderActionListener {\n\n        fun onCommitsClicked()\n\n        fun onStateClicked()\n\n        fun onMilestonesClicked()\n\n        fun onAssigneesClicked()\n\n        fun onLabelsClicked()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/issue/IssueItem.kt",
    "content": "package com.github.pockethub.android.ui.item.issue\n\nimport android.graphics.Color\nimport android.text.TextUtils\nimport android.view.View\nimport androidx.core.text.bold\nimport androidx.core.text.buildSpannedString\nimport androidx.core.text.strikeThrough\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.core.issue.IssueUtils\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.github.pockethub.android.util.android.text.append\nimport com.meisolsson.githubsdk.model.Issue\nimport com.meisolsson.githubsdk.model.IssueState\nimport com.xwray.groupie.kotlinandroidextensions.Item\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\nimport kotlinx.android.synthetic.main.issue_details.*\nimport kotlinx.android.synthetic.main.issue_number.*\nimport kotlinx.android.synthetic.main.repo_issue_item.*\n\nopen class IssueItem @JvmOverloads constructor(\n        private val avatarLoader: AvatarLoader,\n        val issue: Issue,\n        private val showLabels: Boolean = true\n) : Item(issue.id()!!) {\n\n    override fun getLayout() = R.layout.repo_issue_item\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        val labels = issue.labels()\n        val labelViews = listOf(\n                holder.v_label0,\n                holder.v_label1,\n                holder.v_label2,\n                holder.v_label3,\n                holder.v_label4,\n                holder.v_label5,\n                holder.v_label6,\n                holder.v_label7\n        )\n        if (showLabels && labels != null && !labels.isEmpty()) {\n            labelViews.forEachIndexed { i, labelView ->\n                if (i >= 0 && i < labels.size) {\n                    val label = labels[i]\n                    if (!TextUtils.isEmpty(label.color())) {\n                        labelView.setBackgroundColor(Color.parseColor('#' + label.color()!!))\n                        labelView.visibility = View.VISIBLE\n                        return@forEachIndexed\n                    }\n                }\n\n                labelView.visibility = View.GONE\n            }\n        } else {\n            labelViews.forEach { it.visibility = View.GONE }\n        }\n\n        holder.tv_issue_number.text = buildSpannedString {\n            if (IssueState.Closed == issue.state()) {\n                strikeThrough {\n                    append(issue.number().toString())\n                }\n            } else {\n                append(issue.number().toString())\n            }\n        }\n\n        avatarLoader.bind(holder.iv_avatar, issue.user())\n\n        if (IssueUtils.isPullRequest(issue)) {\n            holder.tv_pull_request_icon.visibility = View.VISIBLE\n        } else {\n            holder.tv_pull_request_icon.visibility = View.GONE\n        }\n\n        holder.tv_issue_title.text = issue.title()\n        holder.tv_issue_comments.text = issue.comments().toString()\n\n        holder.tv_issue_creation.text = buildSpannedString {\n            bold {\n                append(issue.user()!!.login())\n            }\n            append(' ')\n            append(issue.createdAt()!!)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/news/CommitCommentEventItem.kt",
    "content": "package com.github.pockethub.android.ui.item.news\n\nimport android.text.SpannableStringBuilder\nimport android.text.TextUtils\nimport android.view.View\nimport androidx.core.text.buildSpannedString\nimport com.github.pockethub.android.util.android.text.monospace\nimport com.github.pockethub.android.ui.view.OcticonTextView\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.meisolsson.githubsdk.model.GitHubEvent\nimport com.meisolsson.githubsdk.model.git.GitComment\nimport com.meisolsson.githubsdk.model.payload.CommitCommentPayload\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\nimport kotlinx.android.synthetic.main.news_item.*\n\nclass CommitCommentEventItem(\n        avatarLoader: AvatarLoader,\n        gitHubEvent: GitHubEvent\n) : NewsItem(avatarLoader, gitHubEvent) {\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        super.bind(holder, position)\n        holder.tv_event_icon.text = OcticonTextView.ICON_COMMENT\n\n        holder.tv_event.text = buildSpannedString {\n            val context = holder.root.context\n            boldActor(context, this, gitHubEvent)\n            append(\" commented on \")\n            boldRepo(context, this, gitHubEvent)\n        }\n\n        val details = buildSpannedString {\n            val payload = gitHubEvent.payload() as CommitCommentPayload?\n            appendCommitComment(this, payload?.comment())\n        }\n\n        if (TextUtils.isEmpty(details)) {\n            holder.tv_event_details.visibility = View.GONE\n        } else {\n            holder.tv_event_details.visibility = View.VISIBLE\n            holder.tv_event_details.text = details\n        }\n    }\n\n    private fun appendCommitComment(details: SpannableStringBuilder, comment: GitComment?) {\n        if (comment == null) {\n            return\n        }\n\n        var id: String? = comment.commitId()\n        if (!TextUtils.isEmpty(id)) {\n            if (id!!.length > 10) {\n                id = id.substring(0, 10)\n            }\n            appendText(details, \"Comment in\")\n            details.append(' ')\n            details.monospace {\n                append(id)\n            }\n            details.append(\":\\n\")\n        }\n        appendText(details, comment.body())\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/news/CreateEventItem.kt",
    "content": "package com.github.pockethub.android.ui.item.news\n\nimport android.view.View\nimport androidx.core.text.buildSpannedString\nimport com.github.pockethub.android.ui.view.OcticonTextView\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.meisolsson.githubsdk.model.GitHubEvent\nimport com.meisolsson.githubsdk.model.payload.CreatePayload\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\nimport kotlinx.android.synthetic.main.news_item.*\n\nclass CreateEventItem(\n        avatarLoader: AvatarLoader,\n        gitHubEvent: GitHubEvent\n) : NewsItem(avatarLoader, gitHubEvent) {\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        super.bind(holder, position)\n        holder.tv_event_icon.text = OcticonTextView.ICON_CREATE\n        holder.tv_event.text = buildSpannedString {\n            val context = holder.root.context\n            boldActor(context, this, gitHubEvent)\n            val payload = gitHubEvent.payload() as CreatePayload?\n\n            val refType: String? = payload?.refType()?.name?.toLowerCase()\n            append(\" created $refType \")\n\n            if (\"repository\" != refType) {\n                append(\"${payload?.ref()} at \")\n                boldRepo(context, this, gitHubEvent)\n            } else {\n                boldRepoName(context, this, gitHubEvent)\n            }\n        }\n        holder.tv_event_details.visibility = View.GONE\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/news/DeleteEventItem.kt",
    "content": "package com.github.pockethub.android.ui.item.news\n\nimport android.view.View\nimport androidx.core.text.buildSpannedString\nimport com.github.pockethub.android.ui.view.OcticonTextView\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.meisolsson.githubsdk.model.GitHubEvent\nimport com.meisolsson.githubsdk.model.payload.DeletePayload\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\nimport kotlinx.android.synthetic.main.news_item.*\n\nclass DeleteEventItem(\n        avatarLoader: AvatarLoader,\n        gitHubEvent: GitHubEvent\n) : NewsItem(avatarLoader, gitHubEvent) {\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        super.bind(holder, position)\n        holder.tv_event_icon.text = OcticonTextView.ICON_DELETE\n        holder.tv_event.text = buildSpannedString {\n            val context = holder.root.context\n            boldActor(context, this, gitHubEvent)\n            val payload = gitHubEvent.payload() as DeletePayload?\n            append(\" deleted ${payload?.refType()?.name?.toLowerCase()} ${payload?.ref()} at \")\n            boldRepo(context, this, gitHubEvent)\n        }\n        holder.tv_event_details.visibility = View.GONE\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/news/FollowEventItem.kt",
    "content": "package com.github.pockethub.android.ui.item.news\n\nimport android.view.View\nimport androidx.core.text.buildSpannedString\nimport com.github.pockethub.android.ui.view.OcticonTextView\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.meisolsson.githubsdk.model.GitHubEvent\nimport com.meisolsson.githubsdk.model.payload.FollowPayload\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\nimport kotlinx.android.synthetic.main.news_item.*\n\nclass FollowEventItem(\n        avatarLoader: AvatarLoader,\n        gitHubEvent: GitHubEvent\n) : NewsItem(avatarLoader, gitHubEvent) {\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        super.bind(holder, position)\n        holder.tv_event_icon.text = OcticonTextView.ICON_FOLLOW\n        holder.tv_event.text = buildSpannedString {\n            val context = holder.root.context\n            boldActor(context, this, gitHubEvent)\n            append(\" started following \")\n            boldUser(context, this, (gitHubEvent.payload() as FollowPayload?)?.target())\n        }\n        holder.tv_event_details.visibility = View.GONE\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/news/ForkEventItem.kt",
    "content": "package com.github.pockethub.android.ui.item.news\n\nimport android.view.View\nimport androidx.core.text.buildSpannedString\nimport com.github.pockethub.android.ui.view.OcticonTextView\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.meisolsson.githubsdk.model.GitHubEvent\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\nimport kotlinx.android.synthetic.main.news_item.*\n\nclass ForkEventItem(\n        avatarLoader: AvatarLoader,\n        gitHubEvent: GitHubEvent\n) : NewsItem(avatarLoader, gitHubEvent) {\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        super.bind(holder, position)\n        holder.tv_event_icon.text = OcticonTextView.ICON_FORK\n        holder.tv_event.text = buildSpannedString {\n            val context = holder.root.context\n            boldActor(context, this, gitHubEvent)\n            append(\" forked repository \")\n            boldRepo(context, this, gitHubEvent)\n        }\n        holder.tv_event_details.visibility = View.GONE\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/news/GistEventItem.kt",
    "content": "package com.github.pockethub.android.ui.item.news\n\nimport android.view.View\nimport androidx.core.text.buildSpannedString\nimport com.github.pockethub.android.ui.view.OcticonTextView\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.meisolsson.githubsdk.model.GitHubEvent\nimport com.meisolsson.githubsdk.model.payload.GistPayload\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\nimport kotlinx.android.synthetic.main.news_item.*\n\nclass GistEventItem(\n        avatarLoader: AvatarLoader,\n        gitHubEvent: GitHubEvent\n) : NewsItem(avatarLoader, gitHubEvent) {\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        super.bind(holder, position)\n        holder.tv_event_icon.text = OcticonTextView.ICON_GIST\n        holder.tv_event.text = buildSpannedString {\n            boldActor(holder.root.context, this, gitHubEvent)\n\n            val payload = gitHubEvent.payload() as GistPayload?\n            val action = payload?.action()\n            val status: String? = when (action) {\n                GistPayload.Action.Created -> \"created\"\n                GistPayload.Action.Updated -> \"updated\"\n                else -> action?.name\n            }\n\n            append(\" $status Gist ${payload?.gist()?.id()}\")\n        }\n        holder.tv_event_details.visibility = View.GONE\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/news/GollumEventItem.kt",
    "content": "package com.github.pockethub.android.ui.item.news\n\nimport android.view.View\nimport androidx.core.text.buildSpannedString\nimport com.github.pockethub.android.ui.view.OcticonTextView\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.meisolsson.githubsdk.model.GitHubEvent\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\nimport kotlinx.android.synthetic.main.news_item.*\n\nclass GollumEventItem(\n        avatarLoader: AvatarLoader,\n        gitHubEvent: GitHubEvent\n) : NewsItem(avatarLoader, gitHubEvent) {\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        super.bind(holder, position)\n        holder.tv_event_icon.text = OcticonTextView.ICON_WIKI\n        holder.tv_event.text = buildSpannedString {\n            val context = holder.root.context\n            boldActor(context, this, gitHubEvent)\n            append(\" updated the wiki in \")\n            boldRepo(context, this, gitHubEvent)\n        }\n        holder.tv_event_details.visibility = View.GONE\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/news/IssueCommentEventItem.kt",
    "content": "package com.github.pockethub.android.ui.item.news\n\nimport android.text.SpannableStringBuilder\nimport android.text.TextUtils\nimport android.view.View\nimport androidx.core.text.bold\nimport androidx.core.text.buildSpannedString\nimport com.github.pockethub.android.core.issue.IssueUtils\nimport com.github.pockethub.android.ui.issue.IssuesViewActivity\nimport com.github.pockethub.android.ui.view.OcticonTextView\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.github.pockethub.android.util.ConvertUtils\nimport com.github.pockethub.android.util.android.text.clickable\nimport com.meisolsson.githubsdk.model.GitHubComment\nimport com.meisolsson.githubsdk.model.GitHubEvent\nimport com.meisolsson.githubsdk.model.payload.IssueCommentPayload\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\nimport kotlinx.android.synthetic.main.news_item.*\n\nclass IssueCommentEventItem(\n        avatarLoader: AvatarLoader,\n        gitHubEvent: GitHubEvent\n) : NewsItem(avatarLoader, gitHubEvent) {\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        super.bind(holder, position)\n        holder.tv_event_icon.text = OcticonTextView.ICON_ISSUE_COMMENT\n\n        val payload = gitHubEvent.payload() as IssueCommentPayload?\n\n        val details = buildSpannedString {\n            appendComment(this, payload?.comment())\n        }\n\n        if (TextUtils.isEmpty(details)) {\n            holder.tv_event_details.visibility = View.GONE\n        } else {\n            holder.tv_event_details.visibility = View.VISIBLE\n            holder.tv_event_details.text = details\n        }\n\n        holder.tv_event.text = buildSpannedString {\n            val context = holder.root.context\n            boldActor(context, this, gitHubEvent)\n            append(\" commented on \")\n            bold {\n                val issue = payload?.issue()\n                clickable(onClick = {\n                    val repository = ConvertUtils.eventRepoToRepo(gitHubEvent.repo())\n                    context.startActivity(IssuesViewActivity.createIntent(issue!!, repository))\n                }) {\n                    append(\"${if (IssueUtils.isPullRequest(issue)) {\n                        \"pull request\"\n                    } else {\n                        \"issue\"\n                    }} ${issue?.number()}\")\n                }\n            }\n            append(\" on \")\n            boldRepo(context, this, gitHubEvent)\n        }\n    }\n\n    private fun appendComment(details: SpannableStringBuilder, comment: GitHubComment?) {\n        appendText(details, comment?.body())\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/news/IssuesEventItem.kt",
    "content": "package com.github.pockethub.android.ui.item.news\n\nimport android.text.TextUtils\nimport android.view.View\nimport androidx.core.text.bold\nimport androidx.core.text.buildSpannedString\nimport com.github.pockethub.android.ui.issue.IssuesViewActivity\nimport com.github.pockethub.android.ui.view.OcticonTextView\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.github.pockethub.android.util.ConvertUtils\nimport com.github.pockethub.android.util.android.text.clickable\nimport com.meisolsson.githubsdk.model.GitHubEvent\nimport com.meisolsson.githubsdk.model.payload.IssuesPayload\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\nimport kotlinx.android.synthetic.main.news_item.*\n\nclass IssuesEventItem(\n        avatarLoader: AvatarLoader,\n        gitHubEvent: GitHubEvent\n) : NewsItem(avatarLoader, gitHubEvent) {\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        super.bind(holder, position)\n        val payload = gitHubEvent.payload() as IssuesPayload?\n        val action = payload?.action()\n\n        if (action != null) {\n            holder.tv_event_icon.visibility = View.VISIBLE\n            when (action) {\n                IssuesPayload.Action.Opened ->\n                    holder.tv_event_icon.text = OcticonTextView.ICON_ISSUE_OPEN\n                IssuesPayload.Action.Reopened ->\n                    holder.tv_event_icon.text = OcticonTextView.ICON_ISSUE_REOPEN\n                IssuesPayload.Action.Closed ->\n                    holder.tv_event_icon.text = OcticonTextView.ICON_ISSUE_CLOSE\n                else -> holder.tv_event_icon.visibility = View.GONE\n            }\n        }\n\n        val issue = payload?.issue()\n\n        val details = buildSpannedString {\n            appendText(this, issue?.title())\n        }\n\n        if (TextUtils.isEmpty(details)) {\n            holder.tv_event_details.visibility = View.GONE\n        } else {\n            holder.tv_event_details.visibility = View.VISIBLE\n            holder.tv_event_details.text = details\n        }\n\n        holder.tv_event.text = buildSpannedString {\n            val context = holder.root.context\n            boldActor(context, this, gitHubEvent)\n            append(\" ${action?.name?.toLowerCase()} \")\n            bold {\n                clickable(onClick = {\n                    val repository = ConvertUtils.eventRepoToRepo(gitHubEvent.repo())\n                    context.startActivity(IssuesViewActivity.createIntent(issue!!, repository))\n                }) {\n                    append(\"issue \" + issue?.number())\n                }\n            }\n            append(\" on \")\n            boldRepo(context, this, gitHubEvent)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/news/MemberEventItem.kt",
    "content": "package com.github.pockethub.android.ui.item.news\n\nimport android.view.View\nimport androidx.core.text.buildSpannedString\nimport com.github.pockethub.android.ui.view.OcticonTextView\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.meisolsson.githubsdk.model.GitHubEvent\nimport com.meisolsson.githubsdk.model.payload.MemberPayload\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\nimport kotlinx.android.synthetic.main.news_item.*\n\nclass MemberEventItem(\n        avatarLoader: AvatarLoader,\n        gitHubEvent: GitHubEvent\n) : NewsItem(avatarLoader, gitHubEvent) {\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        super.bind(holder, position)\n        holder.tv_event_icon.text = OcticonTextView.ICON_ADD_MEMBER\n        holder.tv_event.text = buildSpannedString {\n            val context = holder.root.context\n            val payload = gitHubEvent.payload() as MemberPayload?\n            boldActor(context, this, gitHubEvent)\n            append(\" added \")\n            boldUser(context, this, payload?.member())\n            append(\" as a collaborator to \")\n            boldRepo(context, this, gitHubEvent)\n        }\n        holder.tv_event_details.visibility = View.GONE\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/news/NewsItem.kt",
    "content": "package com.github.pockethub.android.ui.item.news\n\nimport android.content.Context\nimport android.text.SpannableStringBuilder\nimport android.text.TextUtils\nimport android.util.Log\nimport androidx.core.text.bold\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.ui.repo.RepositoryViewActivity\nimport com.github.pockethub.android.ui.user.UserViewActivity\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.github.pockethub.android.util.ConvertUtils\nimport com.github.pockethub.android.util.TimeUtils\nimport com.github.pockethub.android.util.android.text.clickable\nimport com.meisolsson.githubsdk.model.GitHubEvent\nimport com.meisolsson.githubsdk.model.GitHubEventType.CommitCommentEvent\nimport com.meisolsson.githubsdk.model.GitHubEventType.CreateEvent\nimport com.meisolsson.githubsdk.model.GitHubEventType.DeleteEvent\nimport com.meisolsson.githubsdk.model.GitHubEventType.DownloadEvent\nimport com.meisolsson.githubsdk.model.GitHubEventType.FollowEvent\nimport com.meisolsson.githubsdk.model.GitHubEventType.ForkEvent\nimport com.meisolsson.githubsdk.model.GitHubEventType.GistEvent\nimport com.meisolsson.githubsdk.model.GitHubEventType.GollumEvent\nimport com.meisolsson.githubsdk.model.GitHubEventType.IssueCommentEvent\nimport com.meisolsson.githubsdk.model.GitHubEventType.IssuesEvent\nimport com.meisolsson.githubsdk.model.GitHubEventType.MemberEvent\nimport com.meisolsson.githubsdk.model.GitHubEventType.PublicEvent\nimport com.meisolsson.githubsdk.model.GitHubEventType.PullRequestEvent\nimport com.meisolsson.githubsdk.model.GitHubEventType.PullRequestReviewCommentEvent\nimport com.meisolsson.githubsdk.model.GitHubEventType.PushEvent\nimport com.meisolsson.githubsdk.model.GitHubEventType.ReleaseEvent\nimport com.meisolsson.githubsdk.model.GitHubEventType.TeamAddEvent\nimport com.meisolsson.githubsdk.model.GitHubEventType.WatchEvent\nimport com.meisolsson.githubsdk.model.User\nimport com.xwray.groupie.kotlinandroidextensions.Item\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\nimport kotlinx.android.synthetic.main.news_item.*\n\nopen class NewsItem(\n        private val avatarLoader: AvatarLoader,\n        val gitHubEvent: GitHubEvent\n) : Item(gitHubEvent.id()!!.hashCode().toLong()) {\n\n    override fun getLayout(): Int = R.layout.news_item\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        avatarLoader.bind(holder.iv_avatar, gitHubEvent.actor())\n        holder.iv_avatar.setOnClickListener {\n            val context = holder.root.context\n            val user = gitHubEvent.actor()!!\n            context.startActivity(UserViewActivity.createIntent(user))\n        }\n        holder.tv_event_date.text = TimeUtils.getRelativeTime(gitHubEvent.createdAt())\n    }\n\n    protected fun boldActor(context: Context, text: SpannableStringBuilder, event: GitHubEvent?) =\n            boldUser(context, text, event?.actor())\n\n    protected fun boldUser(context: Context, text: SpannableStringBuilder, user: User?) {\n        text.bold {\n            clickable(onClick = {\n                context.startActivity(UserViewActivity.createIntent(user!!))\n            }) {\n                append(user!!.login())\n            }\n        }\n    }\n\n    protected fun boldRepo(context: Context, text: SpannableStringBuilder, event: GitHubEvent?) {\n        text.bold {\n            val eventRepo = event?.repo()!!\n            clickable(onClick = {\n                val repository = ConvertUtils.eventRepoToRepo(eventRepo)\n                context.startActivity(RepositoryViewActivity.createIntent(repository))\n            }) {\n                append(eventRepo.repoWithUserName())\n            }\n        }\n    }\n\n    protected fun boldRepoName(\n            context: Context,\n            text: SpannableStringBuilder,\n            event: GitHubEvent?\n    ) {\n        val repo = event?.repo()\n        val name = repo?.repoWithUserName()\n        if (!TextUtils.isEmpty(name)) {\n            val slash: Int = name!!.indexOf('/')\n            if (slash != -1 && slash + 1 < name.length) {\n                text.bold {\n                    clickable(onClick = {\n                        val repository = ConvertUtils.eventRepoToRepo(repo)\n                        context.startActivity(RepositoryViewActivity.createIntent(repository))\n                    }) {\n                        append(name.substring(slash + 1))\n                    }\n                }\n            }\n        }\n    }\n\n    protected fun appendText(text: SpannableStringBuilder, toAppend: String?) {\n        var textToAppend: String? = toAppend ?: return\n        textToAppend = textToAppend!!.trim { it <= ' ' }\n        if (textToAppend.isEmpty()) {\n            return\n        }\n\n        text.append(textToAppend)\n    }\n\n    companion object {\n\n        /**\n         * Create a instance of the [NewsItem] corresponding to the event type.\n         *\n         * @param avatars Avatar image loader\n         * @param item Event item\n         * @return Subclass of [NewsItem] corresponding to the event type\n         */\n        @JvmStatic\n        fun createNewsItem(avatars: AvatarLoader, item: GitHubEvent): NewsItem? =\n                when (item.type()) {\n                    CommitCommentEvent -> CommitCommentEventItem(avatars, item)\n                    CreateEvent -> CreateEventItem(avatars, item)\n                    DeleteEvent -> DeleteEventItem(avatars, item)\n                    DownloadEvent, ReleaseEvent -> ReleaseEventItem(avatars, item)\n                    FollowEvent -> FollowEventItem(avatars, item)\n                    ForkEvent -> ForkEventItem(avatars, item)\n                    GistEvent -> GistEventItem(avatars, item)\n                    GollumEvent -> GollumEventItem(avatars, item)\n                    IssueCommentEvent -> IssueCommentEventItem(avatars, item)\n                    IssuesEvent -> IssuesEventItem(avatars, item)\n                    MemberEvent -> MemberEventItem(avatars, item)\n                    PublicEvent -> PublicEventItem(avatars, item)\n                    PullRequestEvent -> PullRequestEventItem(avatars, item)\n                    PullRequestReviewCommentEvent ->\n                        PullRequestReviewCommentEventItem(avatars, item)\n                    PushEvent -> PushEventItem(avatars, item)\n                    TeamAddEvent -> TeamAddEventItem(avatars, item)\n                    WatchEvent -> WatchEventItem(avatars, item)\n                    else -> {\n                        Log.d(\"NewsItem\", \"Event type not allowed: \" + item.type()!!)\n                        null\n                    }\n                }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/news/PublicEventItem.kt",
    "content": "package com.github.pockethub.android.ui.item.news\n\nimport android.view.View\nimport androidx.core.text.buildSpannedString\nimport com.github.pockethub.android.ui.view.OcticonTextView\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.meisolsson.githubsdk.model.GitHubEvent\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\nimport kotlinx.android.synthetic.main.news_item.*\n\nclass PublicEventItem(\n        avatarLoader: AvatarLoader,\n        gitHubEvent: GitHubEvent\n) : NewsItem(avatarLoader, gitHubEvent) {\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        super.bind(holder, position)\n        holder.tv_event_icon.text = OcticonTextView.ICON_PUBLIC\n        holder.tv_event.text = buildSpannedString {\n            val context = holder.root.context\n            boldActor(context, this, gitHubEvent)\n            append(\" open sourced repository \")\n            boldRepo(context, this, gitHubEvent)\n        }\n        holder.tv_event_details.visibility = View.GONE\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/news/PullRequestEventItem.kt",
    "content": "package com.github.pockethub.android.ui.item.news\n\nimport android.text.TextUtils\nimport android.view.View\nimport androidx.core.text.bold\nimport androidx.core.text.buildSpannedString\nimport com.github.pockethub.android.core.issue.IssueEventMatcher\nimport com.github.pockethub.android.ui.issue.IssuesViewActivity\nimport com.github.pockethub.android.ui.view.OcticonTextView\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.github.pockethub.android.util.ConvertUtils\nimport com.github.pockethub.android.util.android.text.clickable\nimport com.meisolsson.githubsdk.model.GitHubEvent\nimport com.meisolsson.githubsdk.model.payload.PullRequestPayload\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\nimport kotlinx.android.synthetic.main.news_item.*\n\nclass PullRequestEventItem(\n        avatarLoader: AvatarLoader,\n        gitHubEvent: GitHubEvent\n) : NewsItem(avatarLoader, gitHubEvent) {\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        super.bind(holder, position)\n        holder.tv_event_icon.text = OcticonTextView.ICON_PULL_REQUEST\n\n        val payload = gitHubEvent.payload() as PullRequestPayload\n        val action = payload.action()\n\n        holder.tv_event.text = buildSpannedString {\n            val context = holder.root.context\n            boldActor(context, this, gitHubEvent)\n            if (PullRequestPayload.Action.Synchronized == action) {\n                append(\"updated\")\n            }\n            append(\" ${action?.name?.toLowerCase()} \")\n            bold {\n                clickable(onClick = {\n                    val issue = IssueEventMatcher.getIssue(gitHubEvent)\n                    val repository = ConvertUtils.eventRepoToRepo(gitHubEvent.repo())\n                    context.startActivity(IssuesViewActivity.createIntent(issue, repository))\n                }) {\n                    append(\"pull request \" + payload.number())\n                }\n            }\n            append(\" on \")\n            boldRepo(context, this, gitHubEvent)\n        }\n\n        val details = buildSpannedString {\n            if (PullRequestPayload.Action.Opened == action\n                    || PullRequestPayload.Action.Closed == action\n            ) {\n                val request = payload.pullRequest()\n                if (request != null) {\n                    val title: String? = request.title()\n                    if (!TextUtils.isEmpty(title)) {\n                        append(title)\n                    }\n                }\n            }\n        }\n\n        if (TextUtils.isEmpty(details)) {\n            holder.tv_event_details.visibility = View.GONE\n        } else {\n            holder.tv_event_details.visibility = View.VISIBLE\n            holder.tv_event_details.text = details\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/news/PullRequestReviewCommentEventItem.kt",
    "content": "package com.github.pockethub.android.ui.item.news\n\nimport android.text.SpannableStringBuilder\nimport android.text.TextUtils\nimport android.view.View\nimport androidx.core.text.buildSpannedString\nimport com.github.pockethub.android.util.android.text.monospace\nimport com.github.pockethub.android.ui.view.OcticonTextView\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.meisolsson.githubsdk.model.GitHubEvent\nimport com.meisolsson.githubsdk.model.ReviewComment\nimport com.meisolsson.githubsdk.model.payload.PullRequestReviewCommentPayload\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\nimport kotlinx.android.synthetic.main.news_item.*\n\nclass PullRequestReviewCommentEventItem(\n        avatarLoader: AvatarLoader,\n        gitHubEvent: GitHubEvent\n) : NewsItem(avatarLoader, gitHubEvent) {\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        super.bind(holder, position)\n        holder.tv_event_icon.text = OcticonTextView.ICON_COMMENT\n        holder.tv_event.text = buildSpannedString {\n            val context = holder.root.context\n            boldActor(context, this, gitHubEvent)\n            append(\" commented on \")\n            boldRepo(context, this, gitHubEvent)\n        }\n\n        val details = buildSpannedString {\n            val payload = gitHubEvent.payload() as PullRequestReviewCommentPayload?\n            appendReviewComment(this, payload?.comment())\n        }\n\n        if (TextUtils.isEmpty(details)) {\n            holder.tv_event_details.visibility = View.GONE\n        } else {\n            holder.tv_event_details.visibility = View.VISIBLE\n            holder.tv_event_details.text = details\n        }\n    }\n\n    private fun appendReviewComment(details: SpannableStringBuilder, comment: ReviewComment?) {\n        if (comment == null) {\n            return\n        }\n\n        var id: String? = comment.commitId()\n        if (!TextUtils.isEmpty(id)) {\n            if (id!!.length > 10) {\n                id = id.substring(0, 10)\n            }\n            appendText(details, \"Comment in\")\n            details.append(' ')\n            details.monospace {\n                append(id)\n            }\n            details.append(':').append('\\n')\n        }\n        appendText(details, comment.body())\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/news/PushEventItem.kt",
    "content": "package com.github.pockethub.android.ui.item.news\n\nimport android.text.TextUtils\nimport android.view.View\nimport androidx.core.text.bold\nimport androidx.core.text.buildSpannedString\nimport com.github.pockethub.android.util.android.text.monospace\nimport com.github.pockethub.android.ui.view.OcticonTextView\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.meisolsson.githubsdk.model.GitHubEvent\nimport com.meisolsson.githubsdk.model.payload.PushPayload\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\nimport kotlinx.android.synthetic.main.news_item.*\nimport java.text.NumberFormat\n\nclass PushEventItem(\n        avatarLoader: AvatarLoader,\n        gitHubEvent: GitHubEvent\n) : NewsItem(avatarLoader, gitHubEvent) {\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        super.bind(holder, position)\n        holder.tv_event_icon.text = OcticonTextView.ICON_PUSH\n\n        val payload = gitHubEvent.payload() as PushPayload?\n\n        holder.tv_event.text = buildSpannedString {\n            val context = holder.root.context\n            boldActor(context, this, gitHubEvent)\n            append(\" pushed to \")\n            var ref = payload?.ref()\n            if (ref!!.startsWith(\"refs/heads/\")) {\n                ref = ref.substring(11)\n            }\n            bold {\n                append(ref)\n            }\n            append(\" at \")\n            boldRepo(context, this, gitHubEvent)\n        }\n\n        val details = buildSpannedString {\n            val commits = payload?.commits()\n            val size = commits!!.size\n            if (size > 0) {\n                if (size != 1) {\n                    val numberFormat = NumberFormat.getIntegerInstance()\n                    append(numberFormat.format(size.toLong())).append(\" new commits\")\n                } else {\n                    append(\"1 new commit\")\n                }\n\n                val max = 3\n                var appended = 0\n                for (commit in commits) {\n\n                    val sha = commit.sha()\n\n                    append('\\n')\n                    monospace {\n                        if (sha!!.length > 7) {\n                            append(sha.substring(0, 7))\n                        } else {\n                            append(sha)\n                        }\n                    }\n\n                    val message = commit.message()\n                    if (!TextUtils.isEmpty(message)) {\n                        append(' ')\n                        val newline = message!!.indexOf('\\n')\n                        if (newline > 0) {\n                            append(message.subSequence(0, newline))\n                        } else {\n                            append(message)\n                        }\n                    }\n\n                    appended++\n                    if (appended == max) {\n                        break\n                    }\n                }\n            }\n        }\n\n        if (TextUtils.isEmpty(details)) {\n            holder.tv_event_details.visibility = View.GONE\n        } else {\n            holder.tv_event_details.visibility = View.VISIBLE\n            holder.tv_event_details.text = details\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/news/ReleaseEventItem.kt",
    "content": "package com.github.pockethub.android.ui.item.news\n\nimport android.text.TextUtils\nimport android.view.View\nimport androidx.core.text.buildSpannedString\nimport com.github.pockethub.android.ui.view.OcticonTextView\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.meisolsson.githubsdk.model.GitHubEvent\nimport com.meisolsson.githubsdk.model.Release\nimport com.meisolsson.githubsdk.model.payload.ReleasePayload\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\nimport kotlinx.android.synthetic.main.news_item.*\n\nclass ReleaseEventItem(\n        avatarLoader: AvatarLoader,\n        gitHubEvent: GitHubEvent\n) : NewsItem(avatarLoader, gitHubEvent) {\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        super.bind(holder, position)\n        holder.tv_event_icon.text = OcticonTextView.ICON_UPLOAD\n        holder.tv_event.text = buildSpannedString {\n            val context = holder.root.context\n            boldActor(context, this, gitHubEvent)\n            append(\" uploaded a file to \")\n            boldRepo(context, this, gitHubEvent)\n        }\n\n        val details = buildSpannedString {\n            val payload = gitHubEvent.payload() as ReleasePayload?\n            val download: Release? = payload?.release()\n            appendText(this, download?.name())\n        }\n        if (TextUtils.isEmpty(details)) {\n            holder.tv_event_details.visibility = View.GONE\n        } else {\n            holder.tv_event_details.visibility = View.VISIBLE\n            holder.tv_event_details.text = details\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/news/TeamAddEventItem.kt",
    "content": "package com.github.pockethub.android.ui.item.news\n\nimport android.view.View\nimport androidx.core.text.bold\nimport androidx.core.text.buildSpannedString\nimport com.github.pockethub.android.ui.user.UserViewActivity\nimport com.github.pockethub.android.ui.view.OcticonTextView\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.github.pockethub.android.util.android.text.clickable\nimport com.meisolsson.githubsdk.model.GitHubEvent\nimport com.meisolsson.githubsdk.model.payload.TeamAddPayload\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\nimport kotlinx.android.synthetic.main.news_item.*\n\nclass TeamAddEventItem(\n        avatarLoader: AvatarLoader,\n        gitHubEvent: GitHubEvent\n) : NewsItem(avatarLoader, gitHubEvent) {\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        super.bind(holder, position)\n        holder.tv_event_icon.text = OcticonTextView.ICON_ADD_MEMBER\n        holder.tv_event.text = buildSpannedString {\n            val context = holder.root.context\n            boldActor(context, this, gitHubEvent)\n            append(\" added \")\n\n            val payload = gitHubEvent.payload() as TeamAddPayload?\n            val repo = payload?.repository()\n            val repoName = repo?.name()\n            if (repoName != null) {\n                bold {\n                    clickable(onClick = {\n                        val user = gitHubEvent.actor()!!\n                        context.startActivity(UserViewActivity.createIntent(user))\n                    }) {\n                        append(repoName)\n                    }\n                }\n            }\n\n            append(\" to team\")\n\n            val team = payload?.team()\n            val teamName = team?.name()\n            if (teamName != null) {\n                append(' ')\n                bold {\n                    append(teamName)\n                }\n            }\n        }\n        holder.tv_event_details.visibility = View.GONE\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/news/WatchEventItem.kt",
    "content": "package com.github.pockethub.android.ui.item.news\n\nimport android.view.View\nimport androidx.core.text.buildSpannedString\nimport com.github.pockethub.android.ui.view.OcticonTextView\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.meisolsson.githubsdk.model.GitHubEvent\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\nimport kotlinx.android.synthetic.main.news_item.*\n\nclass WatchEventItem(\n        avatarLoader: AvatarLoader,\n        gitHubEvent: GitHubEvent\n) : NewsItem(avatarLoader, gitHubEvent) {\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        super.bind(holder, position)\n        holder.tv_event_icon.text = OcticonTextView.ICON_STAR\n        holder.tv_event.text = buildSpannedString {\n            val context = holder.root.context\n            boldActor(context, this, gitHubEvent)\n            append(\" starred \")\n            boldRepo(context, this, gitHubEvent)\n        }\n        holder.tv_event_details.visibility = View.GONE\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/notification/NotificationHeaderItem.kt",
    "content": "package com.github.pockethub.android.ui.item.notification\n\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.ui.notification.NotificationListFragment\nimport com.meisolsson.githubsdk.model.Repository\nimport com.xwray.groupie.kotlinandroidextensions.Item\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\nimport kotlinx.android.synthetic.main.notification_item_header.*\n\nclass NotificationHeaderItem(\n        val repository: Repository,\n        private val notificationReadListener: NotificationListFragment\n) : Item(repository.id()!!) {\n\n    override fun getLayout() = R.layout.notification_item_header\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        holder.tv_name.text = repository.fullName()\n\n        holder.tv_notifications_read_icon.text = \"\\uf03a\"\n        if (!holder.tv_notifications_read_icon.hasOnClickListeners()) {\n            holder.tv_notifications_read_icon.setOnClickListener { _ ->\n                notificationReadListener.readNotifications(repository)\n            }\n        }\n    }\n\n    override fun isClickable() = false\n\n    override fun isLongClickable() = false\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/notification/NotificationItem.kt",
    "content": "package com.github.pockethub.android.ui.item.notification\n\nimport android.view.View\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.ui.notification.NotificationListFragment\nimport com.github.pockethub.android.ui.view.OcticonTextView\nimport com.github.pockethub.android.util.TimeUtils\nimport com.meisolsson.githubsdk.model.NotificationThread\nimport com.xwray.groupie.kotlinandroidextensions.Item\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\nimport kotlinx.android.synthetic.main.notification_item.*\n\nclass NotificationItem(\n        val notificationThread: NotificationThread,\n        private val notificationReadListener: NotificationListFragment\n) : Item(notificationThread.id()!!.hashCode().toLong()) {\n\n    override fun getLayout() = R.layout.notification_item\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        val type = notificationThread.subject()!!.type()\n        when (type) {\n            \"Issue\" -> holder.tv_notification_icon.text = OcticonTextView.ICON_ISSUE_OPEN\n            \"Release\" -> holder.tv_notification_icon.text = OcticonTextView.ICON_TAG\n            else -> holder.tv_notification_icon.text = OcticonTextView.ICON_PULL_REQUEST\n        }\n\n        holder.tv_notification_title.text = notificationThread.subject()!!.title()\n        holder.tv_notification_date.text = TimeUtils.getRelativeTime(notificationThread.updatedAt())\n\n        holder.tv_notification_read_icon.text = OcticonTextView.ICON_READ\n        holder.tv_notification_read_icon.visibility = if (notificationThread.unread()!!) {\n            View.VISIBLE\n        } else {\n            View.GONE\n        }\n\n        if (!holder.tv_notification_read_icon.hasOnClickListeners()) {\n            holder.tv_notification_read_icon.setOnClickListener { _ ->\n                notificationReadListener.readNotification(notificationThread)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/repository/RepositoryHeaderItem.kt",
    "content": "package com.github.pockethub.android.ui.item.repository\n\nimport com.github.pockethub.android.R\nimport com.xwray.groupie.kotlinandroidextensions.Item\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\nimport kotlinx.android.synthetic.main.repo_header_item.*\n\nclass RepositoryHeaderItem(private val id: String) : Item(id.hashCode().toLong()) {\n\n    override fun getLayout() = R.layout.repo_header_item\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        holder.tv_header.text = id\n    }\n\n    override fun isClickable() = false\n\n    override fun isLongClickable() = false\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/item/repository/RepositoryItem.kt",
    "content": "package com.github.pockethub.android.ui.item.repository\n\nimport android.text.TextUtils\nimport android.view.View\nimport androidx.core.text.bold\nimport androidx.core.text.buildSpannedString\nimport androidx.core.text.color\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.ui.view.OcticonTextView.ICON_FORK\nimport com.github.pockethub.android.ui.view.OcticonTextView.ICON_MIRROR_PRIVATE\nimport com.github.pockethub.android.ui.view.OcticonTextView.ICON_MIRROR_PUBLIC\nimport com.github.pockethub.android.ui.view.OcticonTextView.ICON_PRIVATE\nimport com.github.pockethub.android.ui.view.OcticonTextView.ICON_PUBLIC\nimport com.meisolsson.githubsdk.model.Repository\nimport com.meisolsson.githubsdk.model.User\nimport com.xwray.groupie.kotlinandroidextensions.Item\nimport com.xwray.groupie.kotlinandroidextensions.ViewHolder\nimport kotlinx.android.synthetic.main.repo_details.*\nimport kotlinx.android.synthetic.main.user_repo_item.*\n\nclass RepositoryItem(val repo: Repository, private val user: User?) : Item(repo.id()!!) {\n\n    private var descriptionColor = -1\n\n    override fun getId() = repo.id()!!\n\n    override fun getLayout() = R.layout.user_repo_item\n\n    override fun bind(holder: ViewHolder, position: Int) {\n        if (descriptionColor == -1) {\n            descriptionColor = holder.root.resources.getColor(R.color.text_description)\n        }\n\n        holder.tv_repo_name.text = buildSpannedString {\n            if (user == null) {\n                append(repo.owner()!!.login()).append('/')\n            } else {\n                if (user.login() != repo.owner()!!.login()) {\n                    color(descriptionColor) {\n                        append(\"${repo.owner()!!.login()}/\")\n                    }\n                }\n            }\n\n            bold {\n                append(repo.name())\n            }\n        }\n\n        if (TextUtils.isEmpty(repo.mirrorUrl())) {\n            when {\n                repo.isPrivate!! -> holder.tv_repo_icon.text = ICON_PRIVATE\n                repo.isFork!! -> holder.tv_repo_icon.text = ICON_FORK\n                else -> holder.tv_repo_icon.text = ICON_PUBLIC\n            }\n        } else {\n            if (repo.isPrivate!!) {\n                holder.tv_repo_icon.text = ICON_MIRROR_PRIVATE\n            } else {\n                holder.tv_repo_icon.text = ICON_MIRROR_PUBLIC\n            }\n        }\n\n        if (!TextUtils.isEmpty(repo.description())) {\n            holder.tv_repo_description.text = repo.description()\n            holder.tv_repo_description.visibility = View.VISIBLE\n        } else {\n            holder.tv_repo_description.visibility = View.GONE\n        }\n\n        if (!TextUtils.isEmpty(repo.language())) {\n            holder.tv_language.text = repo.language()\n            holder.tv_language.visibility = View.VISIBLE\n        } else {\n            holder.tv_language.visibility = View.GONE\n        }\n\n        holder.tv_watchers.text = repo.watchersCount().toString()\n        holder.tv_forks.text = repo.forksCount().toString()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/notification/NotificationActivity.kt",
    "content": "package com.github.pockethub.android.ui.notification\n\nimport android.os.Bundle\nimport android.view.MenuItem\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.ui.base.BaseActivity\nimport com.github.pockethub.android.ui.helpers.PagerHandler\nimport kotlinx.android.synthetic.main.pager_with_tabs.*\n\nclass NotificationActivity : BaseActivity() {\n\n    private var pagerHandler: PagerHandler<NotificationPagerAdapter>? = null\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.pager_with_tabs)\n\n        val actionBar = supportActionBar!!\n        actionBar.setDisplayHomeAsUpEnabled(true)\n\n        configurePager()\n    }\n\n    fun configurePager() {\n        val adapter = NotificationPagerAdapter(this)\n        pagerHandler = PagerHandler(this, vp_pages, adapter)\n        lifecycle.addObserver(pagerHandler!!)\n        pagerHandler!!.tabs = sliding_tabs_layout\n    }\n\n    override fun onDestroy() {\n        super.onDestroy()\n        lifecycle.removeObserver(pagerHandler!!)\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        return when (item.itemId) {\n            android.R.id.home -> {\n                finish()\n                true\n            }\n            else -> super.onOptionsItemSelected(item)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/notification/NotificationListFragment.kt",
    "content": "package com.github.pockethub.android.ui.notification\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport com.github.pockethub.android.ui.helpers.ItemListHandler\nimport com.github.pockethub.android.ui.helpers.ListFetcher\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.core.issue.IssueUriMatcher\nimport com.github.pockethub.android.rx.AutoDisposeUtils\nimport com.github.pockethub.android.ui.base.BaseFragment\nimport com.github.pockethub.android.ui.issue.IssuesViewActivity\nimport com.github.pockethub.android.ui.item.notification.NotificationHeaderItem\nimport com.github.pockethub.android.ui.item.notification.NotificationItem\nimport com.github.pockethub.android.util.ToastUtils\nimport com.meisolsson.githubsdk.core.ServiceGenerator\nimport com.meisolsson.githubsdk.model.NotificationThread\nimport com.meisolsson.githubsdk.model.Page\nimport com.meisolsson.githubsdk.model.Repository\nimport com.meisolsson.githubsdk.model.request.NotificationReadRequest\nimport com.meisolsson.githubsdk.service.activity.NotificationService\nimport com.xwray.groupie.Item\nimport com.xwray.groupie.OnItemClickListener\nimport io.reactivex.Observable\nimport io.reactivex.Single\nimport io.reactivex.android.schedulers.AndroidSchedulers\nimport io.reactivex.schedulers.Schedulers\nimport kotlinx.android.synthetic.main.fragment_item_list.view.*\nimport java.util.HashMap\nimport javax.inject.Inject\n\n// NotificationThread\nclass NotificationListFragment : BaseFragment(), NotificationReadListener {\n\n    @Inject\n    protected lateinit var notificationService: NotificationService\n\n    private lateinit var listFetcher: ListFetcher<NotificationThread>\n\n    private lateinit var itemListHandler: ItemListHandler\n\n    /**\n     * Filters for the request to GitHub.\n     */\n    private val filters = HashMap<String, Any>()\n\n    protected val errorMessage: Int\n        get() = R.string.error_notifications_load\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        if (arguments!!.containsKey(EXTRA_FILTER)) {\n            filters[arguments!!.getString(EXTRA_FILTER)] = true\n        }\n    }\n\n    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {\n        return inflater.inflate(R.layout.fragment_item_list, container, false)\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        itemListHandler = ItemListHandler(\n            view.list,\n            view.empty,\n            lifecycle,\n            activity,\n            OnItemClickListener(this::onItemClick))\n\n        listFetcher = ListFetcher(\n            view.swipe_item,\n            lifecycle,\n            itemListHandler,\n            { t -> ToastUtils.show(activity, errorMessage) },\n            this::loadData,\n            this::createItem\n        )\n\n        listFetcher.onDataLoaded = this::onDataLoaded\n    }\n\n    private fun loadData(forceRefresh: Boolean): Single<List<NotificationThread>> {\n        return getPageAndNext(1)\n            .flatMap { page -> Observable.fromIterable(page.items()) }\n            .toList()\n    }\n\n    private fun onDataLoaded(newItems: MutableList<Item<*>>): MutableList<Item<*>> {\n        updateHeaders(newItems)\n        return newItems\n    }\n\n    private fun updateHeaders(notifications: MutableList<Item<*>>) {\n        notifications.sortWith(Comparator { i1, i2 ->\n            val r1 = (i1 as NotificationItem).notificationThread.repository()\n            val r2 = (i2 as NotificationItem).notificationThread.repository()\n            r1!!.fullName()!!.compareTo(r2!!.fullName()!!, ignoreCase = true)\n        })\n\n        var repoFound: Repository? = null\n        for (i in notifications.indices) {\n            val item = notifications[i] as NotificationItem\n            val thread = item.notificationThread\n            val fullName = thread.repository()!!.fullName()\n\n            if (repoFound == null || fullName != repoFound.fullName()) {\n                notifications.add(i, NotificationHeaderItem(thread.repository()!!, this))\n            }\n\n            repoFound = thread.repository()\n        }\n    }\n\n    private fun createItem(item: NotificationThread): Item<*> {\n        return NotificationItem(item, this)\n    }\n\n    private fun getPageAndNext(i: Int): Observable<Page<NotificationThread>> {\n        return notificationService\n            .getNotifications(filters, i.toLong())\n            .subscribeOn(Schedulers.io())\n            .observeOn(AndroidSchedulers.mainThread())\n            .flatMapObservable { response ->\n                val page = response.body()!!\n                if (page.next() == null) {\n                    return@flatMapObservable notificationService\n                        .getNotifications(filters, i.toLong())\n                        .subscribeOn(Schedulers.io())\n                        .observeOn(AndroidSchedulers.mainThread())\n                        .flatMapObservable { Observable.just(page) }\n                }\n\n                return@flatMapObservable Observable.just(page)\n                    .concatWith(getPageAndNext(page.next()!!))\n            }\n    }\n\n    override fun readNotification(thread: NotificationThread) {\n        ServiceGenerator.createService(activity, NotificationService::class.java)\n            .markNotificationRead(thread.id())\n            .subscribeOn(Schedulers.io())\n            .observeOn(AndroidSchedulers.mainThread())\n            .`as`(AutoDisposeUtils.bindToLifecycle(this))\n            .subscribe({ listFetcher.forceRefresh() }, { e -> e.printStackTrace()})\n    }\n\n    override fun readNotifications(repository: Repository?) {\n        ServiceGenerator.createService(activity, NotificationService::class.java)\n            .markAllRepositoryNotificationsRead(repository!!.owner()!!.login(),\n                repository.name(), NotificationReadRequest.builder().build())\n            .subscribeOn(Schedulers.io())\n            .observeOn(AndroidSchedulers.mainThread())\n            .`as`(AutoDisposeUtils.bindToLifecycle(this))\n            .subscribe({ listFetcher.forceRefresh() }, { e -> e.printStackTrace()})\n    }\n\n    fun onItemClick(item: Item<*>, view: View) {\n        if (item is NotificationItem) {\n            val thread = item.notificationThread\n            val url = thread.subject()!!.url()\n\n            val issue = IssueUriMatcher.getApiIssue(url)\n            if (issue != null) {\n                val intent = IssuesViewActivity.createIntent(issue, thread.repository()!!)\n                startActivity(intent)\n            } else {\n                ToastUtils.show(activity, R.string.releases_not_yet_in_app)\n            }\n        }\n    }\n\n    companion object {\n        const val EXTRA_FILTER = \"filter\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/notification/NotificationPagerAdapter.java",
    "content": "package com.github.pockethub.android.ui.notification;\n\nimport android.os.Bundle;\nimport androidx.fragment.app.Fragment;\nimport androidx.appcompat.app.AppCompatActivity;\n\nimport com.github.pockethub.android.R;\nimport com.github.pockethub.android.ui.base.FragmentPagerAdapter;\n\nclass NotificationPagerAdapter extends FragmentPagerAdapter {\n\n    private final AppCompatActivity activity;\n\n    public NotificationPagerAdapter(AppCompatActivity activity) {\n        super(activity);\n        this.activity = activity;\n    }\n\n    @Override\n    public Fragment getItem(int position) {\n        Fragment fragment = new NotificationListFragment();\n        Bundle args = new Bundle();\n        switch (position) {\n            case 0:\n                break;\n            case 1:\n                args.putString(NotificationListFragment.EXTRA_FILTER, \"participating\");\n                break;\n            case 2:\n                args.putString(NotificationListFragment.EXTRA_FILTER, \"all\");\n                break;\n            default:\n                throw new IllegalStateException(\"Item doesn't exist\");\n        }\n\n        fragment.setArguments(args);\n        return fragment;\n    }\n\n    @Override\n    public CharSequence getPageTitle(int position) {\n        switch (position) {\n            case 0:\n                return activity.getString(R.string.tab_unread);\n            case 1:\n                return activity.getString(R.string.tab_participating);\n            case 2:\n                return activity.getString(R.string.tab_all);\n            default:\n                throw new IllegalStateException(\"Title doesn't exist\");\n        }\n    }\n\n    @Override\n    public int getCount() {\n        return 3;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/notification/NotificationReadListener.java",
    "content": "package com.github.pockethub.android.ui.notification;\n\nimport androidx.annotation.NonNull;\nimport androidx.annotation.Nullable;\n\nimport com.meisolsson.githubsdk.model.NotificationThread;\nimport com.meisolsson.githubsdk.model.Repository;\n\n/**\n * Created by savio on 2017-03-22.\n */\n\npublic interface NotificationReadListener {\n\n    void readNotification(@NonNull NotificationThread thread);\n\n    void readNotifications(@Nullable Repository repository);\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/ref/BranchFileViewActivity.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.ref\n\nimport android.content.Intent\nimport android.os.Bundle\nimport android.text.TextUtils\nimport android.util.Base64\nimport android.util.Log\nimport android.view.Menu\nimport android.view.MenuItem\nimport android.view.View\nimport androidx.core.content.edit\nimport com.github.pockethub.android.Intents.*\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.core.commit.CommitUtils\nimport com.github.pockethub.android.rx.AutoDisposeUtils\nimport com.github.pockethub.android.ui.base.BaseActivity\nimport com.github.pockethub.android.util.MarkdownLoader\nimport com.github.pockethub.android.util.*\nimport com.meisolsson.githubsdk.core.ServiceGenerator\nimport com.meisolsson.githubsdk.model.Repository\nimport com.meisolsson.githubsdk.model.git.GitBlob\nimport com.meisolsson.githubsdk.service.git.GitService\nimport io.reactivex.android.schedulers.AndroidSchedulers\nimport io.reactivex.schedulers.Schedulers\n\nimport javax.inject.Inject\nimport com.github.pockethub.android.util.PreferenceUtils.RENDER_MARKDOWN\nimport com.github.pockethub.android.util.PreferenceUtils.WRAP\nimport kotlinx.android.synthetic.main.activity_commit_file_view.*\n\n/**\n * Activity to view a file on a branch\n */\nclass BranchFileViewActivity : BaseActivity() {\n\n    @Inject\n    lateinit var imageGetter: HttpImageGetter\n\n    private var repo: Repository? = null\n\n    private var sha: String? = null\n\n    private var path: String? = null\n\n    private var file: String? = null\n\n    private var branch: String? = null\n\n    private var isMarkdownFile: Boolean = false\n\n    private var renderedMarkdown: String? = null\n\n    private var blob: GitBlob? = null\n\n    private lateinit var editor: SourceEditor\n\n    private var markdownItem: MenuItem? = null\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_commit_file_view)\n\n        repo = intent.getParcelableExtra(EXTRA_REPOSITORY)\n        sha = intent.getStringExtra(EXTRA_BASE)\n        path = intent.getStringExtra(EXTRA_PATH)\n        branch = intent.getStringExtra(EXTRA_HEAD)\n\n        wv_code.settings.builtInZoomControls = true\n        wv_code.settings.useWideViewPort = true\n\n        file = CommitUtils.getName(path)\n        isMarkdownFile = MarkdownUtils.isMarkdown(file)\n        editor = SourceEditor(wv_code)\n        editor.wrap = PreferenceUtils.getCodePreferences(this).getBoolean(WRAP, false)\n\n        val actionBar = supportActionBar!!\n        actionBar.title = file\n        actionBar.subtitle = branch\n\n        loadContent()\n    }\n\n    override fun onCreateOptionsMenu(optionsMenu: Menu): Boolean {\n        menuInflater.inflate(R.menu.activity_file_view, optionsMenu)\n\n        val wrapItem = optionsMenu.findItem(R.id.m_wrap)\n        if (PreferenceUtils.getCodePreferences(this).getBoolean(WRAP, false)) {\n            wrapItem.setTitle(R.string.disable_wrapping)\n        } else {\n            wrapItem.setTitle(R.string.enable_wrapping)\n        }\n\n        markdownItem = optionsMenu.findItem(R.id.m_render_markdown)\n        if (isMarkdownFile) {\n            markdownItem!!.isEnabled = blob != null\n            markdownItem!!.isVisible = true\n            if (PreferenceUtils.getCodePreferences(this).getBoolean(\n                    RENDER_MARKDOWN, true)) {\n                markdownItem!!.setTitle(R.string.show_raw_markdown)\n            } else {\n                markdownItem!!.setTitle(R.string.render_markdown)\n            }\n        }\n\n        return true\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        when (item.itemId) {\n            R.id.m_wrap -> {\n                if (editor.wrap) {\n                    item.setTitle(R.string.enable_wrapping)\n                } else {\n                    item.setTitle(R.string.disable_wrapping)\n                }\n                editor.toggleWrap()\n                PreferenceUtils.getCodePreferences(this).edit {\n                    putBoolean(WRAP, editor.wrap)\n                }\n                return true\n            }\n\n            R.id.m_share -> {\n                shareFile()\n                return true\n            }\n\n            R.id.m_render_markdown -> {\n                if (editor.isMarkdown) {\n                    item.setTitle(R.string.render_markdown)\n                    editor.toggleMarkdown()\n                    editor.setSource(file, blob)\n                } else {\n                    item.setTitle(R.string.show_raw_markdown)\n                    editor.toggleMarkdown()\n                    if (renderedMarkdown != null) {\n                        editor.setSource(file, renderedMarkdown, false)\n                    } else {\n                        loadMarkdown()\n                    }\n                }\n                PreferenceUtils.getCodePreferences(this).edit {\n                    putBoolean(RENDER_MARKDOWN, editor.isMarkdown)\n                }\n                return true\n            }\n\n            else -> return super.onOptionsItemSelected(item)\n        }\n    }\n\n    private fun shareFile() {\n        val id = InfoUtils.createRepoId(repo!!)\n        startActivity(ShareUtils.create(\"$path at $branch on $id\",\n            \"https://github.com/\" + id + \"/blob/\" + branch + '/'.toString() + path))\n    }\n\n    private fun loadMarkdown() {\n        pb_loading.visibility = View.VISIBLE\n        wv_code.visibility = View.GONE\n\n        val markdown = String(Base64.decode(blob!!.content(), Base64.DEFAULT))\n        MarkdownLoader.load(this, markdown, repo, imageGetter, false)\n            .subscribeOn(Schedulers.io())\n            .observeOn(AndroidSchedulers.mainThread())\n            .subscribe({ rendered ->\n                pb_loading.visibility = View.GONE\n                wv_code.visibility = View.VISIBLE\n\n                if (!TextUtils.isEmpty(rendered)) {\n                    renderedMarkdown = rendered.toString()\n                    if (markdownItem != null) {\n                        markdownItem!!.isEnabled = true\n                    }\n                    editor!!.setMarkdown(true).setSource(file, renderedMarkdown, false)\n                }\n            }, { e -> ToastUtils.show(this, R.string.error_rendering_markdown) })\n    }\n\n    private fun loadContent() {\n        pb_loading.visibility = View.VISIBLE\n        wv_code.visibility = View.GONE\n\n        ServiceGenerator.createService(this, GitService::class.java)\n            .getGitBlob(repo!!.owner()!!.login(), repo!!.name(), sha)\n            .subscribeOn(Schedulers.io())\n            .observeOn(AndroidSchedulers.mainThread())\n            .`as`(AutoDisposeUtils.bindToLifecycle(this))\n            .subscribe({ response ->\n                blob = response.body()\n\n                if (markdownItem != null) {\n                    markdownItem!!.isEnabled = true\n                }\n\n                if (isMarkdownFile && PreferenceUtils.getCodePreferences(this).getBoolean(\n                        RENDER_MARKDOWN, true)) {\n                    loadMarkdown()\n                } else {\n                    pb_loading.visibility = View.GONE\n                    wv_code.visibility = View.VISIBLE\n\n                    editor.setMarkdown(false).setSource(file, blob)\n                }\n            }, { e ->\n                Log.d(TAG, \"Loading file contents failed\", e)\n\n                pb_loading.visibility = View.GONE\n                wv_code.visibility = View.VISIBLE\n                ToastUtils.show(this, R.string.error_file_load)\n            })\n    }\n\n    companion object {\n\n        private val TAG = \"BranchFileViewActivity\"\n\n        private val ARG_TEXT = \"text\"\n\n        private val ARG_REPO = \"repo\"\n\n        /**\n         * Create intent to show file in commit\n         *\n         * @param repository\n         * @param branch\n         * @param file\n         * @param blobSha\n         * @return intent\n         */\n        fun createIntent(repository: Repository, branch: String,\n            file: String, blobSha: String): Intent {\n            val builder = Builder(\"branch.file.VIEW\")\n            builder.repo(repository)\n            builder.add(EXTRA_BASE, blobSha)\n            builder.add(EXTRA_PATH, file)\n            builder.add(EXTRA_HEAD, branch)\n            return builder.toIntent()\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/ref/RefDialog.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.ref;\n\nimport android.util.Log;\n\nimport com.github.pockethub.android.R;\nimport com.github.pockethub.android.core.GitHubRequest;\nimport com.github.pockethub.android.core.ref.RefUtils;\nimport com.github.pockethub.android.rx.RxProgress;\nimport com.github.pockethub.android.ui.base.BaseActivity;\nimport com.github.pockethub.android.util.RxPageUtil;\nimport com.github.pockethub.android.util.ToastUtils;\nimport com.meisolsson.githubsdk.core.ServiceGenerator;\nimport com.meisolsson.githubsdk.model.Page;\nimport com.meisolsson.githubsdk.model.Repository;\nimport com.meisolsson.githubsdk.model.git.GitReference;\nimport com.meisolsson.githubsdk.service.git.GitService;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport io.reactivex.Observable;\nimport io.reactivex.Single;\nimport retrofit2.Response;\n\nimport static java.lang.String.CASE_INSENSITIVE_ORDER;\n\n/**\n * Dialog to select a branch or tag\n */\npublic class RefDialog {\n\n    private static final String TAG = \"RefDialog\";\n\n    private final int requestCode;\n\n    private final BaseActivity activity;\n\n    private final Single<List<GitReference>> refSingle;\n\n    /**\n     * Create dialog helper to display refs\n     *\n     * @param activity\n     * @param requestCode\n     * @param repository\n     */\n    public RefDialog(final BaseActivity activity,\n            final int requestCode, final Repository repository) {\n        this.activity = activity;\n        this.requestCode = requestCode;\n\n        GitHubRequest<Response<Page<GitReference>>> gitHubRequest = page -> ServiceGenerator\n                .createService(activity, GitService.class)\n                .getGitReferences(repository.owner().login(), repository.name(), page);\n\n        refSingle = RxPageUtil.getAllPages(gitHubRequest, 1)\n                .flatMap(page -> Observable.fromIterable(page.items()))\n                .filter(RefUtils::isValid)\n                .toSortedList((o1, o2) -> CASE_INSENSITIVE_ORDER.compare(o1.ref(), o2.ref()))\n                .compose(RxProgress.bindToLifecycle(activity, R.string.loading_refs))\n                .cache();\n    }\n\n    /**\n     * Show dialog with given reference selected\n     *\n     * @param selectedRef\n     */\n    public void show(GitReference selectedRef) {\n        refSingle.subscribe(refs -> {\n            int checked = -1;\n            if (selectedRef != null) {\n                String ref = selectedRef.ref();\n                for (int i = 0; i < refs.size(); i++) {\n                    String candidate = refs.get(i).ref();\n                    if (ref.equals(candidate) || ref.equals(RefUtils.getName(candidate))) {\n                        checked = i;\n                        break;\n                    }\n                }\n            }\n\n            RefDialogFragment.show(activity, requestCode,\n                    activity.getString(R.string.select_ref), null, new ArrayList<>(refs), checked);\n        }, e -> {\n            Log.d(TAG, \"Exception loading references\", e);\n            ToastUtils.show(activity, R.string.error_refs_load);\n        });\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/ref/RefDialogFragment.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.ref;\n\nimport android.app.Dialog;\nimport android.os.Bundle;\nimport androidx.annotation.NonNull;\nimport android.view.View;\n\nimport com.github.pockethub.android.R;\nimport com.github.pockethub.android.ui.base.BaseActivity;\nimport com.github.pockethub.android.ui.SingleChoiceDialogFragment;\nimport com.github.pockethub.android.ui.item.dialog.RefDialogItem;\nimport com.meisolsson.githubsdk.model.git.GitReference;\nimport com.xwray.groupie.GroupAdapter;\nimport com.xwray.groupie.Item;\n\nimport java.util.ArrayList;\n\nimport static android.app.Activity.RESULT_OK;\n\n/**\n * Dialog fragment to select a branch or tag\n */\npublic class RefDialogFragment extends SingleChoiceDialogFragment {\n\n    /**\n     * Get selected reference from results bundle\n     *\n     * @param arguments\n     * @return user\n     */\n    public static GitReference getSelected(Bundle arguments) {\n        return (GitReference) arguments.getParcelable(ARG_SELECTED);\n    }\n\n    /**\n     * Confirm message and deliver callback to given activity\n     *\n     * @param activity\n     * @param requestCode\n     * @param title\n     * @param message\n     * @param choices\n     * @param selectedChoice\n     */\n    public static void show(final BaseActivity activity, final int requestCode, final String title,\n                            final String message, ArrayList<GitReference> choices,\n                            final int selectedChoice) {\n        show(activity, requestCode, title, message, choices, selectedChoice,\n                new RefDialogFragment());\n    }\n\n    @NonNull\n    @Override\n    public Dialog onCreateDialog(final Bundle savedInstanceState) {\n        int selected = getArguments().getInt(ARG_SELECTED_CHOICE);\n\n        GroupAdapter adapter = new GroupAdapter();\n        for (GitReference ref : getChoices()) {\n            adapter.add(new RefDialogItem(ref, selected));\n        }\n        adapter.setOnItemClickListener(this);\n\n        return createDialogBuilder()\n                .adapter(adapter, null)\n                .negativeText(R.string.cancel)\n                .build();\n    }\n\n    @SuppressWarnings(\"unchecked\")\n    private ArrayList<GitReference> getChoices() {\n        return getArguments().getParcelableArrayList(ARG_CHOICES);\n    }\n\n\n    @Override\n    public void onItemClick(@NonNull Item item, @NonNull View view) {\n        super.onItemClick(item, view);\n        if (item instanceof RefDialogItem) {\n            getArguments().putParcelable(ARG_SELECTED, ((RefDialogItem) item).getGitReference());\n            onResult(RESULT_OK);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/repo/RecentRepositories.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.repo;\n\nimport android.content.Context;\nimport android.os.AsyncTask;\n\nimport com.github.pockethub.android.RequestReader;\nimport com.github.pockethub.android.RequestWriter;\nimport com.meisolsson.githubsdk.model.Repository;\nimport com.meisolsson.githubsdk.model.User;\n\nimport java.io.File;\nimport java.io.Serializable;\nimport java.util.Comparator;\nimport java.util.Iterator;\nimport java.util.LinkedHashSet;\n\nimport static java.lang.String.CASE_INSENSITIVE_ORDER;\n\n/**\n * Model class for the repositories recently selected under an organization\n */\npublic class RecentRepositories implements Comparator<Repository>, Serializable {\n\n    /**\n     * Number of repositories retained per organization\n     */\n    public static final int MAX_SIZE = 5;\n\n    private static final long serialVersionUID = 580345177644233739L;\n\n    private static final int VERSION = 2;\n\n    private static File getFile(final Context context, final User organization) {\n        return new File(context.getFilesDir(), \"recent-repos-\"\n                + organization.id() + \".ser\");\n    }\n\n    private LinkedHashSet<Long> ids;\n\n    private final File file;\n\n    private int id;\n\n    /**\n     * Create a recent repositories cache for the given organization\n     *\n     * @param context\n     * @param organization\n     */\n    public RecentRepositories(final Context context, final User organization) {\n        file = getFile(context, organization);\n        id = organization.id().intValue();\n    }\n\n    private void load() {\n        LinkedHashSet<Long> loaded = new RequestReader(file, VERSION).read();\n        if (loaded == null) {\n            loaded = new LinkedHashSet<>();\n        }\n        ids = loaded;\n        trim();\n    }\n\n    private void trim() {\n        Iterator<Long> iterator = ids.iterator();\n        while (iterator.hasNext() && ids.size() > MAX_SIZE) {\n            iterator.next();\n            iterator.remove();\n        }\n    }\n\n    /**\n     * Add repository to recent list\n     *\n     * @param repo\n     * @return this recent list\n     */\n    public RecentRepositories add(final Repository repo) {\n        return repo != null ? add(repo.id()) : this;\n    }\n\n    /**\n     * Add id to recent list\n     *\n     * @param id\n     * @return this recent list\n     */\n    public RecentRepositories add(final long id) {\n        if (ids == null) {\n            load();\n        }\n        ids.remove(id);\n        ids.add(id);\n        trim();\n        return this;\n    }\n\n    /**\n     * Remove repository from recent list\n     *\n     * @param repo\n     * @return this recent list\n     */\n    public RecentRepositories remove(final Repository repo) {\n        return repo != null ? remove(repo.id()) : this;\n    }\n\n    /**\n     * Remove id from recent list\n     *\n     * @param id\n     * @return this recent list\n     */\n    public RecentRepositories remove(final long id) {\n        if (ids == null) {\n            load();\n        }\n        ids.remove(id);\n        return this;\n    }\n\n    /**\n     * Persist recent list asynchronously on a background thread\n     *\n     * @return this recent list\n     */\n    public RecentRepositories saveAsync() {\n        if (ids != null) {\n            new AsyncTask<Void, Void, Void>() {\n\n                @Override\n                protected Void doInBackground(Void... params) {\n                    save();\n                    return null;\n                }\n            }.execute();\n        }\n        return this;\n    }\n\n    /**\n     * Persist recent list\n     *\n     * @return this recent list\n     */\n    public RecentRepositories save() {\n        final LinkedHashSet<Long> save = ids;\n        if (save != null) {\n            new RequestWriter(file, VERSION).write(save);\n        }\n        return this;\n    }\n\n    /**\n     * Is the given repository in the recent list?\n     *\n     * @param repository\n     * @return true if in recent list, false otherwise\n     */\n    public boolean contains(Repository repository) {\n        return repository != null && contains(repository.id());\n    }\n\n    /**\n     * Is the given repository id in the recent list\n     *\n     * @param id\n     * @return true if in recent list, false otherwise\n     */\n    public boolean contains(long id) {\n        if (ids == null) {\n            load();\n        }\n        return ids.contains(id);\n    }\n\n    @Override\n    public int compare(final Repository lhs, final Repository rhs) {\n        final boolean lRecent = contains(lhs);\n        final boolean rRecent = contains(rhs);\n        if (lRecent && !rRecent) {\n            return -1;\n        }\n        if (!lRecent && rRecent) {\n            return 1;\n        }\n\n        final int order = CASE_INSENSITIVE_ORDER.compare(lhs.name(),\n                rhs.name());\n        if (order == 0) {\n            if (id == lhs.owner().id()) {\n                return -1;\n            } else if (id == rhs.owner().id()) {\n                return 1;\n            } else {\n                return CASE_INSENSITIVE_ORDER.compare(\n                        lhs.owner().login(), rhs.owner().login());\n            }\n        } else {\n            return order;\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/repo/RepositoryContributorsActivity.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.repo;\n\nimport android.content.Intent;\nimport android.os.Bundle;\nimport androidx.appcompat.app.ActionBar;\nimport android.view.MenuItem;\n\nimport com.meisolsson.githubsdk.model.Repository;\nimport com.meisolsson.githubsdk.model.User;\nimport com.github.pockethub.android.Intents;\nimport com.github.pockethub.android.R;\nimport com.github.pockethub.android.ui.base.BaseActivity;\n\nimport static android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP;\nimport static android.content.Intent.FLAG_ACTIVITY_SINGLE_TOP;\nimport static com.github.pockethub.android.Intents.EXTRA_REPOSITORY;\n\n/**\n * Activity to view repository contributors\n */\npublic class RepositoryContributorsActivity extends BaseActivity {\n\n    /**\n     * Create intent for this activity\n     *\n     * @param repository\n     * @return intent\n     */\n    public static Intent createIntent(Repository repository) {\n        return new Intents.Builder(\"repo.contributors.VIEW\").repo(repository).toIntent();\n    }\n\n    private Repository repository;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_repo_contributors);\n\n        repository = getIntent().getParcelableExtra(EXTRA_REPOSITORY);\n\n        ActionBar actionBar = getSupportActionBar();\n        actionBar.setTitle(repository.name());\n        actionBar.setSubtitle(R.string.contributors);\n        actionBar.setDisplayHomeAsUpEnabled(true);\n\n        User owner = repository.owner();\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(MenuItem item) {\n        switch (item.getItemId()) {\n            case android.R.id.home:\n                Intent intent = RepositoryViewActivity.Companion.createIntent(repository);\n                intent.addFlags(FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGLE_TOP);\n                startActivity(intent);\n                return true;\n            default:\n                return super.onOptionsItemSelected(item);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/repo/RepositoryContributorsFragment.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.repo\n\nimport android.content.Context\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport com.github.pockethub.android.Intents.EXTRA_REPOSITORY\nimport com.github.pockethub.android.ui.helpers.ItemListHandler\nimport com.github.pockethub.android.ui.helpers.PagedListFetcher\nimport com.github.pockethub.android.ui.helpers.PagedScrollListener\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.rx.AutoDisposeUtils\nimport com.github.pockethub.android.ui.base.BaseFragment\nimport com.github.pockethub.android.ui.item.ContributorItem\nimport com.github.pockethub.android.ui.user.UserViewActivity\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.github.pockethub.android.util.ToastUtils\nimport com.meisolsson.githubsdk.core.ServiceGenerator\nimport com.meisolsson.githubsdk.model.Page\nimport com.meisolsson.githubsdk.model.Repository\nimport com.meisolsson.githubsdk.model.User\nimport com.meisolsson.githubsdk.service.repositories.RepositoryService\nimport com.meisolsson.githubsdk.service.users.UserService\nimport com.xwray.groupie.Item\nimport com.xwray.groupie.OnItemClickListener\nimport io.reactivex.Single\nimport io.reactivex.android.schedulers.AndroidSchedulers\nimport io.reactivex.schedulers.Schedulers\nimport kotlinx.android.synthetic.main.fragment_item_list.view.*\nimport retrofit2.Response\nimport javax.inject.Inject\n\n/**\n * Fragment to display a list of contributors for a specific repository\n */\nclass RepositoryContributorsFragment : BaseFragment() {\n\n    @Inject\n    protected lateinit var service: RepositoryService\n\n    /**\n     * Avatar loader\n     */\n    @Inject\n    protected lateinit var avatars: AvatarLoader\n\n    private lateinit var pagedListFetcher: PagedListFetcher<User>\n\n    private lateinit var itemListHandler: ItemListHandler\n\n    private var repo: Repository? = null\n\n    protected val errorMessage: Int\n        get() = R.string.error_contributors_load\n\n    override fun onAttach(context: Context) {\n        super.onAttach(context)\n\n        repo = activity?.intent?.getParcelableExtra(EXTRA_REPOSITORY)\n    }\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? {\n        return inflater.inflate(R.layout.fragment_item_list, container, false)\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        itemListHandler = ItemListHandler(\n            view.list,\n            view.empty,\n            lifecycle,\n            activity,\n            OnItemClickListener(this::onItemClick)\n        )\n\n        pagedListFetcher = PagedListFetcher(\n            view.swipe_item,\n            lifecycle,\n            itemListHandler,\n            { t -> ToastUtils.show(activity, errorMessage) },\n            this::loadData,\n            this::createItem\n        )\n\n        view.list.addOnScrollListener(\n            PagedScrollListener(itemListHandler.mainSection, pagedListFetcher)\n        )\n        itemListHandler.setEmptyText(R.string.no_contributors)\n    }\n\n    private fun loadData(page: Int): Single<Response<Page<User>>> {\n        return service.getContributors(repo!!.owner()!!.login(), repo!!.name(), page.toLong())\n    }\n\n    private fun createItem(item: User): Item<*> {\n        return ContributorItem(avatars, item)\n    }\n\n    fun onItemClick(item: Item<*>, view: View) {\n        if (item is ContributorItem) {\n            val contributor = item.user\n            ServiceGenerator.createService(context, UserService::class.java)\n                .getUser(contributor.login())\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .`as`(AutoDisposeUtils.bindToLifecycle(this))\n                .subscribe { response -> startActivity(UserViewActivity.createIntent(response.body()!!)) }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/repo/RepositoryListFragment.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.repo\n\nimport android.content.Intent\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport com.afollestad.materialdialogs.MaterialDialog\nimport com.github.pockethub.android.Intents.EXTRA_USER\nimport com.github.pockethub.android.ui.helpers.ItemListHandler\nimport com.github.pockethub.android.ui.helpers.ListFetcher\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.RequestCodes.REPOSITORY_VIEW\nimport com.github.pockethub.android.ResultCodes.RESOURCE_CHANGED\nimport com.github.pockethub.android.persistence.AccountDataManager\nimport com.github.pockethub.android.ui.base.BaseFragment\nimport com.github.pockethub.android.ui.item.repository.RepositoryHeaderItem\nimport com.github.pockethub.android.ui.item.repository.RepositoryItem\nimport com.github.pockethub.android.ui.user.OrganizationSelectionListener\nimport com.github.pockethub.android.ui.user.OrganizationSelectionProvider\nimport com.github.pockethub.android.ui.user.UserViewActivity\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.github.pockethub.android.util.InfoUtils\nimport com.github.pockethub.android.util.ToastUtils\nimport com.meisolsson.githubsdk.model.Repository\nimport com.meisolsson.githubsdk.model.User\nimport com.xwray.groupie.Item\nimport com.xwray.groupie.OnItemClickListener\nimport com.xwray.groupie.OnItemLongClickListener\nimport io.reactivex.Observable\nimport io.reactivex.Single\nimport kotlinx.android.synthetic.main.fragment_item_list.view.*\nimport kotlinx.android.synthetic.main.repo_dialog.view.*\nimport java.util.Locale.US\nimport java.util.concurrent.atomic.AtomicReference\nimport javax.inject.Inject\n\n/**\n * Fragment to display a list of [Repository] instances\n */\nclass RepositoryListFragment : BaseFragment(), OrganizationSelectionListener {\n\n    @Inject\n    protected lateinit var cache: AccountDataManager\n\n    @Inject\n    protected lateinit var avatars: AvatarLoader\n\n    private lateinit var itemListHandler: ItemListHandler\n\n    private lateinit var listFetcher: ListFetcher<Repository>\n\n    private val org = AtomicReference<User>()\n\n    private var recentRepos: RecentRepositories? = null\n\n    private val errorMessage: Int\n        get() = R.string.error_repos_load\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? {\n        return inflater.inflate(R.layout.fragment_item_list, container, false)\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        itemListHandler = ItemListHandler(\n            view.list,\n            view.empty,\n            lifecycle,\n            activity,\n            OnItemClickListener(this::onItemClick),\n            OnItemLongClickListener(this::onItemLongClick)\n        )\n\n        listFetcher = ListFetcher(\n            view.swipe_item,\n            lifecycle,\n            itemListHandler,\n            { t -> ToastUtils.show(activity, errorMessage) },\n            this::loadData,\n            this::createItem\n        )\n\n        listFetcher.onDataLoaded = this::onDataLoaded\n        itemListHandler.setEmptyText(R.string.no_repositories)\n    }\n\n    override fun onSaveInstanceState(outState: Bundle) {\n        super.onSaveInstanceState(outState)\n\n        val org = this.org.get()\n        if (org != null) {\n            outState.putParcelable(EXTRA_USER, org)\n        }\n    }\n\n    override fun onDetach() {\n        if (activity != null && activity is OrganizationSelectionProvider) {\n            val selectionProvider = activity as OrganizationSelectionProvider?\n            selectionProvider!!.removeListener(this)\n        }\n\n        super.onDetach()\n    }\n\n    override fun onOrganizationSelected(organization: User) {\n        val previousOrg = org.get()\n        val previousOrgId = if (previousOrg != null) previousOrg.id() else -1\n        org.set(organization)\n\n        if (recentRepos != null) {\n            recentRepos!!.saveAsync()\n        }\n\n        // Only hard refresh if view already created and org is changing\n        if (previousOrgId != organization.id()) {\n            val activity = activity\n            if (activity != null) {\n                recentRepos = RecentRepositories(activity, organization)\n            }\n\n            listFetcher.forceRefresh()\n        }\n    }\n\n    override fun onActivityCreated(savedInstanceState: Bundle?) {\n        val activity = activity\n        var currentOrg: User? = null\n\n        if (getActivity() is OrganizationSelectionProvider) {\n            currentOrg = (activity as OrganizationSelectionProvider).addListener(this)\n        }\n\n        if (arguments != null && arguments!!.containsKey(\"org\")) {\n            currentOrg = arguments!!.getParcelable(\"org\")\n        }\n\n        if (currentOrg == null && savedInstanceState != null) {\n            currentOrg = savedInstanceState.getParcelable(EXTRA_USER)\n        }\n\n        org.set(currentOrg)\n        if (currentOrg != null) {\n            recentRepos = RecentRepositories(activity, currentOrg)\n        }\n\n        super.onActivityCreated(savedInstanceState)\n    }\n\n    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {\n        // Refresh if the viewed repository was (un)starred\n        if (requestCode == REPOSITORY_VIEW && resultCode == RESOURCE_CHANGED) {\n            listFetcher.forceRefresh()\n            return\n        }\n\n        super.onActivityResult(requestCode, resultCode, data)\n    }\n\n    private fun onItemClick(item: Item<*>, view: View) {\n        if (item is RepositoryItem) {\n            val repo = item.repo\n            if (recentRepos != null) {\n                recentRepos!!.add(repo)\n            }\n\n            startActivityForResult(RepositoryViewActivity.createIntent(repo),\n                REPOSITORY_VIEW)\n        }\n    }\n\n    private fun onItemLongClick(item: Item<*>, view: View): Boolean {\n        if (!isAdded) {\n            return false\n        }\n\n        if (item is RepositoryItem) {\n            val repo = item.repo\n\n            val builder = MaterialDialog.Builder(activity!!).title(InfoUtils.createRepoId(repo))\n            val dialogHolder = arrayOfNulls<MaterialDialog>(1)\n\n            val dialogView = layoutInflater.inflate(R.layout.repo_dialog, null)\n\n            val owner = repo.owner()\n            avatars.bind(dialogView.iv_owner_avatar, owner)\n            dialogView.tv_owner_name.text = getString(R.string.navigate_to_user, owner!!.login())\n            dialogView.ll_owner_area.setOnClickListener { v1 ->\n                dialogHolder[0]!!.dismiss()\n                viewUser(owner)\n            }\n\n            if (recentRepos != null && recentRepos!!.contains(repo)) {\n                dialogView.divider.visibility = View.VISIBLE\n                val recentRepoArea = dialogView.ll_recent_repo_area\n                recentRepoArea.visibility = View.VISIBLE\n                recentRepoArea.setOnClickListener { v1 ->\n                    dialogHolder[0]!!.dismiss()\n                    recentRepos!!.remove(repo)\n                    listFetcher.refresh()\n                }\n            }\n\n            builder.customView(dialogView, false)\n            val dialog = builder.build()\n            dialogHolder[0] = dialog\n            dialog.setCanceledOnTouchOutside(true)\n            dialog.show()\n\n            return true\n        }\n\n        return false\n    }\n\n    private fun viewUser(user: User) {\n        if (org.get().id() !== user.id()) {\n            startActivity(UserViewActivity.createIntent(user))\n        }\n    }\n\n    override fun onStop() {\n        super.onStop()\n\n        if (recentRepos != null) {\n            recentRepos!!.saveAsync()\n        }\n    }\n\n    private fun updateHeaders(repos: MutableList<Item<*>>) {\n        if (repos.isEmpty()) {\n            return\n        }\n\n        // Add recent header if at least one recent repository\n        val first = (repos[0] as RepositoryItem).repo\n        if (recentRepos!!.contains(first)) {\n            repos.add(0, RepositoryHeaderItem(getString(R.string.recently_viewed)))\n        }\n\n        // Advance past all recent repositories\n        var index = 0\n        while (index < repos.size) {\n            val item = repos[index]\n            if (item is RepositoryItem) {\n                val repository = item.repo\n                if (!recentRepos!!.contains(repository.id()!!)) {\n                    break\n                }\n            }\n            index++\n        }\n\n        if (index >= repos.size) {\n            return\n        }\n\n        // Register header for first character\n        var current = (repos[index] as RepositoryItem).repo\n        var start = Character.toLowerCase(current.name()!![0])\n        repos.add(index, RepositoryHeaderItem(Character.toString(start).toUpperCase(US)))\n\n        index += 1\n        while (index < repos.size) {\n            current = (repos[index] as RepositoryItem).repo\n            val repoStart = Character.toLowerCase(current.name()!![0])\n            if (repoStart <= start) {\n                index++\n                continue\n            }\n\n            repos.add(index, RepositoryHeaderItem(Character.toString(repoStart).toUpperCase(US)))\n            start = repoStart\n            index++\n        }\n    }\n\n    private fun loadData(forceRefresh: Boolean): Single<List<Repository>> {\n        val org = this.org.get() ?: return Single.just(emptyList())\n\n        return Single.fromCallable { cache.getRepos(org, forceRefresh) }\n            .flatMap { repos ->\n                Observable.fromIterable(repos)\n                    .sorted(recentRepos!!)\n                    .toList()\n            }\n    }\n\n    private fun createItem(item: Repository): Item<*> {\n        return RepositoryItem(item, org.get())\n    }\n\n    protected fun onDataLoaded(newItems: MutableList<Item<*>>): MutableList<Item<*>> {\n        updateHeaders(newItems)\n        return newItems\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/repo/RepositoryNewsFragment.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.repo;\n\nimport android.content.Context;\n\nimport com.meisolsson.githubsdk.core.ServiceGenerator;\nimport com.meisolsson.githubsdk.model.GitHubEvent;\nimport com.meisolsson.githubsdk.model.Issue;\nimport com.meisolsson.githubsdk.model.Page;\nimport com.meisolsson.githubsdk.model.Repository;\nimport com.meisolsson.githubsdk.model.User;\nimport com.github.pockethub.android.core.user.UserEventMatcher.UserPair;\nimport com.github.pockethub.android.ui.NewsFragment;\nimport com.github.pockethub.android.ui.issue.IssuesViewActivity;\nimport com.github.pockethub.android.ui.user.UserViewActivity;\nimport com.github.pockethub.android.util.InfoUtils;\nimport com.meisolsson.githubsdk.service.activity.EventService;\n\nimport io.reactivex.Single;\nimport retrofit2.Response;\n\nimport static com.github.pockethub.android.Intents.EXTRA_REPOSITORY;\n\n/**\n * Fragment to display a news feed for a specific repository\n */\npublic class RepositoryNewsFragment extends NewsFragment {\n\n    EventService service = ServiceGenerator.createService(getActivity(), EventService.class);\n\n    private Repository repo;\n\n    @Override\n    public void onAttach(Context context) {\n        super.onAttach(context);\n\n        repo = requireActivity().getIntent().getParcelableExtra(EXTRA_REPOSITORY);\n    }\n\n    @Override\n    protected Single<Response<Page<GitHubEvent>>> loadData(int page) {\n        return service.getRepositoryEvents(repo.owner().login(), repo.name(), page);\n    }\n\n    /**\n     * Start an activity to view the given repository\n     *\n     * @param repository\n     */\n    @Override\n    protected void viewRepository(Repository repository) {\n        if (!InfoUtils.createRepoId(repo).equals(InfoUtils.createRepoId(repository))) {\n            super.viewRepository(repository);\n        }\n    }\n\n    @Override\n    protected void viewIssue(Issue issue, Repository repository) {\n        startActivity(IssuesViewActivity.Companion.createIntent(issue, repo));\n    }\n\n    @Override\n    protected boolean viewUser(User user) {\n        if (repo.owner().id() != user.id()) {\n            startActivity(UserViewActivity.Companion.createIntent(user));\n            return true;\n        }\n        return false;\n    }\n\n    @Override\n    protected void viewUser(UserPair users) {\n        if (!viewUser(users.from)) {\n            viewUser(users.to);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/repo/RepositoryPagerAdapter.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.repo;\n\nimport android.content.res.Resources;\nimport android.os.Bundle;\nimport androidx.fragment.app.Fragment;\nimport androidx.appcompat.app.AppCompatActivity;\n\nimport com.github.pockethub.android.R;\nimport com.github.pockethub.android.ui.base.FragmentPagerAdapter;\nimport com.github.pockethub.android.ui.code.RepositoryCodeFragment;\nimport com.github.pockethub.android.ui.commit.CommitListFragment;\nimport com.github.pockethub.android.ui.issue.IssuesFragment;\n\n/**\n * Adapter to view a repository's various pages\n */\npublic class RepositoryPagerAdapter extends FragmentPagerAdapter {\n\n    private final Resources resources;\n\n    private final boolean hasIssues;\n\n    private final boolean hasReadme;\n\n    private RepositoryCodeFragment codeFragment;\n\n    private CommitListFragment commitsFragment;\n\n    /**\n     * Create repository pager adapter\n     *\n     * @param activity\n     * @param hasIssues\n     */\n    public RepositoryPagerAdapter(AppCompatActivity activity,\n                                  boolean hasIssues, boolean hasReadme) {\n        super(activity);\n\n        resources = activity.getResources();\n        this.hasReadme = hasReadme;\n        this.hasIssues = hasIssues;\n    }\n\n    @Override\n    public CharSequence getPageTitle(int position) {\n        position = hasReadme ? position : position + 1;\n\n        switch (position) {\n            case 0:\n                return resources.getString(R.string.tab_readme);\n            case 1:\n                return resources.getString(R.string.tab_news);\n            case 2:\n                return resources.getString(R.string.tab_code);\n            case 3:\n                return resources.getString(R.string.tab_commits);\n            case 4:\n                return resources.getString(R.string.tab_issues);\n            default:\n                return null;\n        }\n    }\n\n    @Override\n    public Fragment getItem(int position) {\n        position = hasReadme ? position : position + 1;\n\n        switch (position) {\n            case 0:\n                return new RepositoryReadmeFragment();\n            case 1:\n                return new RepositoryNewsFragment();\n            case 2:\n                codeFragment = new RepositoryCodeFragment();\n                return codeFragment;\n            case 3:\n                commitsFragment = new CommitListFragment();\n                return commitsFragment;\n            case 4:\n                return new IssuesFragment();\n            default:\n                return null;\n        }\n    }\n\n    @Override\n    public int getCount() {\n        int count = hasIssues ? 5 : 4;\n        count = hasReadme ? count : count - 1;\n\n        return count;\n    }\n\n    /**\n     * Returns index of code page\n     */\n    public int getItemCode() {\n        return hasReadme ? 2 : 1;\n    }\n\n    /**\n     * Returns index of commits page\n     */\n    public int getItemCommits() {\n        return hasReadme ? 3 : 2;\n    }\n\n    /**\n     * Pass back button pressed event down to fragments\n     *\n     * @return true if handled, false otherwise\n     */\n    public boolean onBackPressed() {\n        return codeFragment != null && codeFragment.onBackPressed();\n    }\n\n    /**\n     * Deliver dialog result to fragment at given position\n     *\n     * @param position\n     * @param requestCode\n     * @param resultCode\n     * @param arguments\n     * @return this adapter\n     */\n    public RepositoryPagerAdapter onDialogResult(int position, int requestCode,\n                                                 int resultCode, Bundle arguments) {\n        if (position == getItemCode() && codeFragment != null) {\n            codeFragment.onDialogResult(requestCode, resultCode, arguments);\n        } else if (position == getItemCommits() && commitsFragment != null) {\n            commitsFragment.onDialogResult(requestCode, resultCode, arguments);\n        }\n\n        return this;\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/repo/RepositoryReadmeFragment.kt",
    "content": "package com.github.pockethub.android.ui.repo\n\nimport android.os.Bundle\nimport android.util.Log\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.Toast\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport com.caverock.androidsvg.SVG\nimport com.github.pockethub.android.Intents\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.markwon.FontResolver\nimport com.github.pockethub.android.markwon.MarkwonUtils\nimport com.github.pockethub.android.rx.AutoDisposeUtils\nimport com.github.pockethub.android.ui.base.BaseFragment\nimport com.github.pockethub.android.util.ToastUtils\nimport com.meisolsson.githubsdk.core.ServiceGenerator\nimport com.meisolsson.githubsdk.model.Repository\nimport com.meisolsson.githubsdk.service.repositories.RepositoryContentService\nimport com.uber.autodispose.SingleSubscribeProxy\nimport io.noties.markwon.Markwon\nimport io.noties.markwon.recycler.MarkwonAdapter\nimport io.noties.markwon.recycler.SimpleEntry\nimport io.noties.markwon.recycler.table.TableEntry\nimport io.reactivex.android.schedulers.AndroidSchedulers\nimport io.reactivex.schedulers.Schedulers\nimport org.commonmark.ext.gfm.tables.TableBlock\nimport org.commonmark.node.FencedCodeBlock\nimport org.commonmark.node.HtmlBlock\nimport retrofit2.Response\n\nclass RepositoryReadmeFragment : BaseFragment() {\n    private lateinit var recyclerView: RecyclerView\n\n    private var data: String? = null\n    private var repo: Repository? = null\n    private var markwon: Markwon? = null\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        repo = requireActivity().intent.getParcelableExtra(Intents.EXTRA_REPOSITORY)\n        val defaultBranch = if (repo!!.defaultBranch() == null) \"master\" else repo!!.defaultBranch()!!\n        val baseString = String.format(\"https://github.com/%s/%s/%s/%s/\", repo!!.owner()!!.login(), repo!!.name(), \"%s\", defaultBranch)\n        SVG.registerExternalFileResolver(FontResolver(requireActivity().assets))\n        markwon = MarkwonUtils.createMarkwon(requireContext(), baseString)\n\n        loadReadMe()\n    }\n\n    private fun loadReadMe() {\n        ServiceGenerator.createService(activity, RepositoryContentService::class.java)\n                .getReadmeRaw(repo!!.owner()!!.login(), repo!!.name(), null)\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .`as`<SingleSubscribeProxy<Response<String?>>>(AutoDisposeUtils.bindToLifecycle(this))\n                .subscribe { response: Response<String?> ->\n                    if (response.isSuccessful) {\n                        setMarkdown(response.body())\n                    } else {\n                        ToastUtils.show(requireActivity(), R.string.error_rendering_markdown)\n                    }\n                }\n    }\n\n    private fun setMarkdown(body: String?) {\n        data = body\n        if (!this::recyclerView.isInitialized) {\n            return\n        }\n        val adapter = MarkwonAdapter.builderTextViewIsRoot(R.layout.markwon_adapter)\n                .include(HtmlBlock::class.java, SimpleEntry.createTextViewIsRoot(R.layout.markwon_adapter_test))\n                .include(FencedCodeBlock::class.java, SimpleEntry.create(R.layout.adapter_fenced_code_block, R.id.text))\n                .include(TableBlock::class.java, TableEntry.create { builder: TableEntry.Builder ->\n                    builder\n                            .tableLayout(R.layout.markwon_table_block, R.id.table_layout)\n                            .textLayoutIsRoot(R.layout.markwon_table_cell)\n                })\n                .build()\n        recyclerView.adapter = adapter\n        adapter.setMarkdown(markwon!!, body!!)\n        adapter.notifyDataSetChanged()\n    }\n\n    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {\n        val recyclerView = RecyclerView(inflater.context)\n        recyclerView.layoutParams = RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)\n        recyclerView.layoutManager = LinearLayoutManager(inflater.context)\n        return recyclerView\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        recyclerView = view as RecyclerView\n        if (data != null) {\n            setMarkdown(data)\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/repo/RepositoryViewActivity.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.repo\n\nimport android.content.Intent\nimport android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP\nimport android.content.Intent.FLAG_ACTIVITY_SINGLE_TOP\nimport android.net.Uri\nimport android.os.Bundle\nimport android.text.TextUtils\nimport android.view.Menu\nimport android.view.MenuItem\nimport android.view.View\nimport com.afollestad.materialdialogs.MaterialDialog\nimport com.github.pockethub.android.Intents.Builder\nimport com.github.pockethub.android.Intents.EXTRA_REPOSITORY\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.ResultCodes.RESOURCE_CHANGED\nimport com.github.pockethub.android.core.repo.RepositoryUtils\nimport com.github.pockethub.android.rx.AutoDisposeUtils\nimport com.github.pockethub.android.ui.DialogResultListener\nimport com.github.pockethub.android.ui.base.BaseActivity\nimport com.github.pockethub.android.ui.helpers.PagerHandler\nimport com.github.pockethub.android.ui.user.UriLauncherActivity\nimport com.github.pockethub.android.ui.user.UserViewActivity\nimport com.github.pockethub.android.util.InfoUtils\nimport com.github.pockethub.android.util.ShareUtils\nimport com.github.pockethub.android.util.ToastUtils\nimport com.meisolsson.githubsdk.core.ServiceGenerator\nimport com.meisolsson.githubsdk.model.Repository\nimport com.meisolsson.githubsdk.service.activity.StarringService\nimport com.meisolsson.githubsdk.service.repositories.RepositoryContentService\nimport com.meisolsson.githubsdk.service.repositories.RepositoryForkService\nimport com.meisolsson.githubsdk.service.repositories.RepositoryService\nimport io.reactivex.Single\nimport io.reactivex.android.schedulers.AndroidSchedulers\nimport io.reactivex.schedulers.Schedulers\nimport kotlinx.android.synthetic.main.pager_with_tabs.*\nimport kotlinx.android.synthetic.main.tabbed_progress_pager.*\nimport retrofit2.Response\n\n/**\n * Activity to view a repository\n */\nclass RepositoryViewActivity : BaseActivity(), DialogResultListener {\n\n    private var repository: Repository? = null\n\n    private var isStarred: Boolean = false\n\n    private var starredStatusChecked: Boolean = false\n\n    private var hasReadme: Boolean = false\n\n    private var pagerHandler: PagerHandler<RepositoryPagerAdapter>? = null\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.tabbed_progress_pager)\n\n        repository = intent.getParcelableExtra(EXTRA_REPOSITORY)\n        val owner = repository!!.owner()!!\n\n        val actionBar = supportActionBar!!\n        actionBar.title = repository!!.name()\n        actionBar.subtitle = owner.login()\n        actionBar.setDisplayHomeAsUpEnabled(true)\n\n        if (owner.avatarUrl() != null && RepositoryUtils.isComplete(repository!!)) {\n            checkReadme()\n        } else {\n            pb_loading.visibility = View.VISIBLE\n            ServiceGenerator.createService(this, RepositoryService::class.java)\n                .getRepository(repository!!.owner()!!.login(), repository!!.name())\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .`as`(AutoDisposeUtils.bindToLifecycle(this))\n                .subscribe({ response ->\n                    if (response.isSuccessful) {\n                        repository = response.body()\n                        checkReadme()\n                    } else {\n                        ToastUtils.show(this, R.string.error_repo_load)\n                        pb_loading.visibility = View.GONE\n                    }\n                }, { e ->\n                    ToastUtils.show(this, R.string.error_repo_load)\n                    pb_loading.visibility = View.GONE\n                })\n        }\n    }\n\n    override fun onCreateOptionsMenu(optionsMenu: Menu): Boolean {\n        menuInflater.inflate(R.menu.activity_repository, optionsMenu)\n        return super.onCreateOptionsMenu(optionsMenu)\n    }\n\n    override fun onPrepareOptionsMenu(menu: Menu): Boolean {\n        val followItem = menu.findItem(R.id.m_star)\n\n        followItem.isVisible = starredStatusChecked\n        followItem.setTitle(if (isStarred) R.string.unstar else R.string.star)\n\n        val parentRepo = menu.findItem(R.id.m_parent_repo)\n        if (repository != null && repository!!.isFork != null)\n            parentRepo.isVisible = repository!!.isFork!!\n\n        return super.onPrepareOptionsMenu(menu)\n    }\n\n    override fun onBackPressed() {\n        if (pagerHandler?.adapter == null || vp_pages.currentItem != pagerHandler?.adapter!!.itemCode || !pagerHandler?.adapter!!.onBackPressed()) {\n            super.onBackPressed()\n        }\n    }\n\n    private fun checkReadme() {\n        pb_loading.visibility = View.VISIBLE\n        ServiceGenerator.createService(this, RepositoryContentService::class.java)\n            .hasReadme(repository!!.owner()!!.login(), repository!!.name())\n            .subscribeOn(Schedulers.io())\n            .observeOn(AndroidSchedulers.mainThread())\n            .`as`(AutoDisposeUtils.bindToLifecycle(this))\n            .subscribe({ response ->\n                hasReadme = response.code() == 200\n                configurePager()\n            }, { e ->\n                hasReadme = false\n                configurePager()\n            })\n    }\n\n    private fun configurePager() {\n        val adapter = RepositoryPagerAdapter(this, repository!!.hasIssues()!!, hasReadme)\n        pagerHandler = PagerHandler(this, vp_pages, adapter)\n        lifecycle.addObserver(pagerHandler!!)\n        pagerHandler!!.tabs = sliding_tabs_layout\n\n        pb_loading.visibility = View.GONE\n        pagerHandler!!.setGone(false)\n        checkStarredRepositoryStatus()\n    }\n\n    override fun onDestroy() {\n        super.onDestroy()\n        lifecycle.removeObserver(pagerHandler!!)\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        when (item.itemId) {\n            R.id.m_star -> {\n                starRepository()\n                return true\n            }\n            R.id.m_fork -> {\n                forkRepository()\n                return true\n            }\n            R.id.m_contributors -> {\n                startActivity(RepositoryContributorsActivity.createIntent(repository))\n                return true\n            }\n            R.id.m_share -> {\n                shareRepository()\n                return true\n            }\n            R.id.m_parent_repo -> {\n                if (repository!!.parent() == null) {\n                    ServiceGenerator.createService(this, RepositoryService::class.java)\n                        .getRepository(repository!!.owner()!!.login(), repository!!.name())\n                        .subscribeOn(Schedulers.io())\n                        .observeOn(AndroidSchedulers.mainThread())\n                        .subscribe { response ->\n                            val parent = response.body()!!.parent()\n                            startActivity(RepositoryViewActivity.createIntent(parent!!))\n                        }\n                } else {\n                    startActivity(RepositoryViewActivity.createIntent(repository!!.parent()!!))\n                }\n                return true\n            }\n            R.id.m_delete -> {\n                deleteRepository()\n                return true\n            }\n            R.id.m_refresh -> {\n                checkStarredRepositoryStatus()\n                return super.onOptionsItemSelected(item)\n            }\n            android.R.id.home -> {\n                finish()\n                val intent = UserViewActivity.createIntent(repository!!.owner()!!)\n                intent.addFlags(FLAG_ACTIVITY_CLEAR_TOP or FLAG_ACTIVITY_SINGLE_TOP)\n                startActivity(intent)\n                return true\n            }\n            else -> return super.onOptionsItemSelected(item)\n        }\n    }\n\n    override fun onDialogResult(requestCode: Int, resultCode: Int, arguments: Bundle) {\n        pagerHandler?.adapter!!.onDialogResult(vp_pages.currentItem, requestCode, resultCode, arguments)\n    }\n\n    private fun starRepository() {\n        val service = ServiceGenerator.createService(this, StarringService::class.java)\n\n        val starSingle: Single<Response<Void>>\n        starSingle = if (isStarred) {\n            service.unstarRepository(repository!!.owner()!!.login(), repository!!.name())\n        } else {\n            service.starRepository(repository!!.owner()!!.login(), repository!!.name())\n        }\n\n        starSingle.subscribeOn(Schedulers.io())\n            .observeOn(AndroidSchedulers.mainThread())\n            .`as`(AutoDisposeUtils.bindToLifecycle(this))\n            .subscribe({ aVoid ->\n                isStarred = !isStarred\n                setResult(RESOURCE_CHANGED)\n            }, { e -> ToastUtils.show(this, if (isStarred) R.string.error_unstarring_repository else R.string.error_starring_repository) })\n    }\n\n    private fun checkStarredRepositoryStatus() {\n        starredStatusChecked = false\n        ServiceGenerator.createService(this, StarringService::class.java)\n            .checkIfRepositoryIsStarred(repository!!.owner()!!.login(), repository!!.name())\n            .subscribeOn(Schedulers.io())\n            .observeOn(AndroidSchedulers.mainThread())\n            .`as`(AutoDisposeUtils.bindToLifecycle(this))\n            .subscribe { response ->\n                isStarred = response.code() == 204\n                starredStatusChecked = true\n                invalidateOptionsMenu()\n            }\n    }\n\n    private fun shareRepository() {\n        var repoUrl = repository!!.htmlUrl()\n        if (TextUtils.isEmpty(repoUrl)) {\n            repoUrl = \"https://github.com/\" + InfoUtils.createRepoId(repository!!)\n        }\n        val sharingIntent = ShareUtils.create(InfoUtils.createRepoId(repository!!), repoUrl)\n        startActivity(sharingIntent)\n    }\n\n    private fun forkRepository() {\n        ServiceGenerator.createService(this, RepositoryForkService::class.java)\n            .createFork(repository!!.owner()!!.login(), repository!!.name())\n            .subscribeOn(Schedulers.io())\n            .observeOn(AndroidSchedulers.mainThread())\n            .`as`(AutoDisposeUtils.bindToLifecycle(this))\n            .subscribe({ response ->\n                val repo = response.body()!!\n                UriLauncherActivity.launchUri(this, Uri.parse(repo.htmlUrl()))\n            }, { e -> ToastUtils.show(this, R.string.error_forking_repository) })\n    }\n\n    private fun deleteRepository() {\n        MaterialDialog.Builder(this)\n            .title(R.string.are_you_sure)\n            .content(R.string.unexpected_bad_things)\n            .positiveText(R.string.not_sure)\n            .negativeText(R.string.delete_cap)\n            .callback(object : MaterialDialog.ButtonCallback() {\n                override fun onPositive(dialog: MaterialDialog?) {\n                    super.onPositive(dialog)\n                    dialog!!.dismiss()\n                }\n\n                override fun onNegative(dialog: MaterialDialog?) {\n                    super.onNegative(dialog)\n                    dialog!!.dismiss()\n\n                    ServiceGenerator.createService(dialog.context, RepositoryService::class.java)\n                        .deleteRepository(repository!!.owner()!!.login(), repository!!.name())\n                        .subscribeOn(Schedulers.io())\n                        .observeOn(AndroidSchedulers.mainThread())\n                        .`as`(AutoDisposeUtils.bindToLifecycle(lifecycle))\n                        .subscribe({ response ->\n                            onBackPressed()\n                            ToastUtils.show(this@RepositoryViewActivity, R.string.delete_successful)\n                        }, { e -> ToastUtils.show(this@RepositoryViewActivity, R.string.error_deleting_repository) })\n                }\n            })\n            .show()\n    }\n\n    companion object {\n        val TAG = \"RepositoryViewActivity\"\n\n        /**\n         * Create intent for this activity\n         *\n         * @param repository\n         * @return intent\n         */\n        fun createIntent(repository: Repository): Intent {\n            return Builder(\"repo.VIEW\").repo(repository).toIntent()\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/repo/UserRepositoryListFragment.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.repo\n\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport com.github.pockethub.android.Intents.EXTRA_USER\nimport com.github.pockethub.android.ui.helpers.ItemListHandler\nimport com.github.pockethub.android.ui.helpers.PagedListFetcher\nimport com.github.pockethub.android.ui.helpers.PagedScrollListener\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.RequestCodes.REPOSITORY_VIEW\nimport com.github.pockethub.android.ResultCodes.RESOURCE_CHANGED\nimport com.github.pockethub.android.ui.base.BaseFragment\nimport com.github.pockethub.android.ui.item.repository.RepositoryItem\nimport com.github.pockethub.android.util.ToastUtils\nimport com.meisolsson.githubsdk.model.Page\nimport com.meisolsson.githubsdk.model.Repository\nimport com.meisolsson.githubsdk.model.User\nimport com.meisolsson.githubsdk.service.repositories.RepositoryService\nimport com.xwray.groupie.Item\nimport com.xwray.groupie.OnItemClickListener\nimport io.reactivex.Single\nimport kotlinx.android.synthetic.main.fragment_item_list.view.*\nimport retrofit2.Response\nimport javax.inject.Inject\n\n/**\n * Fragment to display a list of repositories for a [User]\n */\nclass UserRepositoryListFragment : BaseFragment() {\n\n    @Inject\n    protected lateinit var service: RepositoryService\n\n    private lateinit var pagedListFetcher: PagedListFetcher<Repository>\n\n    private lateinit var itemListHandler: ItemListHandler\n\n    private var user: User? = null\n\n    protected val errorMessage: Int\n        get() = R.string.error_repos_load\n\n    override fun onAttach(context: Context) {\n        super.onAttach(context)\n\n        user = activity?.intent?.getParcelableExtra(EXTRA_USER)\n    }\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? {\n        return inflater.inflate(R.layout.fragment_item_list, container, false)\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        itemListHandler = ItemListHandler(\n            view.list,\n            view.empty,\n            lifecycle,\n            activity,\n            OnItemClickListener(this::onItemClick)\n        )\n\n        pagedListFetcher = PagedListFetcher(\n            view.swipe_item,\n            lifecycle,\n            itemListHandler,\n            { t -> ToastUtils.show(activity, errorMessage) },\n            this::loadData,\n            this::createItem\n        )\n\n        view.list.addOnScrollListener(\n            PagedScrollListener(itemListHandler.mainSection, pagedListFetcher)\n        )\n        itemListHandler.setEmptyText(R.string.no_repositories)\n    }\n\n    private fun loadData(page: Int): Single<Response<Page<Repository>>> {\n        return service.getUserRepositories(user!!.login(), page.toLong())\n    }\n\n    private fun createItem(item: Repository): Item<*> {\n        return RepositoryItem(item, user)\n    }\n\n    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {\n        if (requestCode == REPOSITORY_VIEW && resultCode == RESOURCE_CHANGED) {\n            pagedListFetcher.refresh()\n            return\n        }\n\n        super.onActivityResult(requestCode, resultCode, data)\n    }\n\n    fun onItemClick(item: Item<*>, view: View) {\n        if (item is RepositoryItem) {\n            val repo = item.repo\n            startActivityForResult(RepositoryViewActivity.createIntent(repo), REPOSITORY_VIEW)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/search/RepositorySearchSuggestionsProvider.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.search;\n\nimport android.content.Context;\nimport android.content.SearchRecentSuggestionsProvider;\nimport android.provider.SearchRecentSuggestions;\n\nimport com.github.pockethub.android.BuildConfig;\n\n/**\n * Suggestions provider for recently searched for repository queries\n */\npublic class RepositorySearchSuggestionsProvider extends\n        SearchRecentSuggestionsProvider {\n\n    private static final String AUTHORITY = BuildConfig.PROVIDER_AUTHORITY_SEARCH_SUGGEST_REPOS;\n\n    /**\n     * Save query to history\n     *\n     * @param context\n     * @param query\n     */\n    public static void save(Context context, String query) {\n        suggestions(context).saveRecentQuery(query, null);\n    }\n\n    /**\n     * Clear query history\n     *\n     * @param context\n     */\n    public static void clear(Context context) {\n        suggestions(context).clearHistory();\n    }\n\n    private static SearchRecentSuggestions suggestions(Context context) {\n        return new SearchRecentSuggestions(context, AUTHORITY,\n                DATABASE_MODE_QUERIES);\n    }\n\n    /**\n     * Create suggestions provider for searched for repository queries\n     */\n    public RepositorySearchSuggestionsProvider() {\n        setupSuggestions(AUTHORITY, DATABASE_MODE_QUERIES);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/search/SearchActivity.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.search\n\nimport android.app.SearchManager\nimport android.app.SearchManager.QUERY\nimport android.content.Context\nimport android.content.Intent\nimport android.content.Intent.ACTION_SEARCH\nimport android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP\nimport android.content.Intent.FLAG_ACTIVITY_SINGLE_TOP\nimport android.os.Bundle\nimport android.view.Menu\nimport android.view.MenuItem\nimport android.view.View\nimport androidx.appcompat.widget.SearchView\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.ui.base.BaseActivity\nimport com.github.pockethub.android.ui.MainActivity\nimport com.github.pockethub.android.ui.helpers.PagerHandler\nimport com.github.pockethub.android.util.ToastUtils\nimport kotlinx.android.synthetic.main.pager_with_tabs.*\nimport kotlinx.android.synthetic.main.tabbed_progress_pager.*\n\n/**\n * Activity to view search results\n */\nclass SearchActivity : BaseActivity() {\n\n    private var repoFragment: SearchRepositoryListFragment? = null\n\n    private var userFragment: SearchUserListFragment? = null\n\n    private var searchView: SearchView? = null\n\n    private var lastQuery: String? = null\n\n    private var pagerHandler: PagerHandler<SearchPagerAdapter>? = null\n\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.tabbed_progress_pager)\n\n        val actionBar = supportActionBar!!\n        actionBar.setDisplayHomeAsUpEnabled(true)\n\n        configurePager()\n        handleIntent(intent)\n    }\n\n    override fun onCreateOptionsMenu(menu: Menu): Boolean {\n        menuInflater.inflate(R.menu.activity_search, menu)\n\n        val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager\n        val searchItem = menu.findItem(R.id.m_search)\n        searchView = searchItem.actionView as SearchView\n        searchView!!.setSearchableInfo(searchManager.getSearchableInfo(componentName))\n\n        return super.onCreateOptionsMenu(menu)\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        when (item.itemId) {\n            R.id.m_search -> {\n                searchView!!.post { searchView!!.setQuery(lastQuery, false) }\n                return true\n            }\n            R.id.m_clear -> {\n                RepositorySearchSuggestionsProvider.clear(this)\n                ToastUtils.show(this, R.string.search_history_cleared)\n                return true\n            }\n            android.R.id.home -> {\n                val intent = Intent(this, MainActivity::class.java)\n                intent.addFlags(FLAG_ACTIVITY_CLEAR_TOP or FLAG_ACTIVITY_SINGLE_TOP)\n                startActivity(intent)\n                return true\n            }\n            else -> return super.onOptionsItemSelected(item)\n        }\n    }\n\n    override fun onNewIntent(intent: Intent) {\n        setIntent(intent)\n        handleIntent(intent)\n    }\n\n    private fun handleIntent(intent: Intent) {\n        if (ACTION_SEARCH == intent.action) {\n            search(intent.getStringExtra(QUERY))\n        }\n    }\n\n    private fun search(query: String) {\n        lastQuery = query\n        supportActionBar!!.title = query\n        RepositorySearchSuggestionsProvider.save(this, query)\n\n        if (repoFragment == null || userFragment == null) {\n            findFragments()\n        }\n\n        if (repoFragment != null && userFragment != null) {\n            repoFragment!!.pagedListFetcher.refresh()\n            userFragment!!.pagedListFetcher.refresh()\n        }\n    }\n\n    private fun configurePager() {\n        val adapter = SearchPagerAdapter(this)\n        pagerHandler = PagerHandler(this, vp_pages, adapter)\n        lifecycle.addObserver(pagerHandler!!)\n        pagerHandler!!.tabs = sliding_tabs_layout\n\n        pb_loading.visibility = View.GONE\n    }\n\n    override fun onDestroy() {\n        super.onDestroy()\n        lifecycle.removeObserver(pagerHandler!!)\n    }\n\n    private fun findFragments() {\n        val fm = supportFragmentManager\n        if (fm.fragments.size > 0 && (repoFragment == null || userFragment == null)) {\n            repoFragment = fm.findFragmentByTag(\n                \"android:switcher:${vp_pages.id}:0\") as SearchRepositoryListFragment\n            userFragment = fm.findFragmentByTag(\n                \"android:switcher:${vp_pages.id}:1\") as SearchUserListFragment\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/search/SearchPagerAdapter.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.search;\n\nimport android.content.res.Resources;\nimport androidx.fragment.app.Fragment;\nimport androidx.appcompat.app.AppCompatActivity;\n\nimport com.github.pockethub.android.R;\nimport com.github.pockethub.android.ui.base.FragmentPagerAdapter;\n\n/**\n * Adapter to view various pages of search screen\n */\npublic class SearchPagerAdapter extends FragmentPagerAdapter {\n\n    private final Resources resources;\n\n    /**\n     * Create search pager adapter\n     *\n     * @param activity\n     */\n    public SearchPagerAdapter(AppCompatActivity activity) {\n        super(activity);\n\n        resources = activity.getResources();\n    }\n\n    @Override\n    public CharSequence getPageTitle(int position) {\n        switch (position) {\n        case 0:\n            return resources.getString(R.string.tab_repositories);\n        case 1:\n            return resources.getString(R.string.tab_users);\n        default:\n            return null;\n        }\n    }\n\n    @Override\n    public Fragment getItem(int position) {\n        switch (position) {\n        case 0:\n            return new SearchRepositoryListFragment();\n        case 1:\n            return new SearchUserListFragment();\n        default:\n            return null;\n        }\n    }\n\n    @Override\n    public int getCount() {\n        return 2;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/search/SearchRepositoryListFragment.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.search\n\nimport android.app.SearchManager.QUERY\nimport android.content.Context\nimport android.os.Bundle\nimport android.text.TextUtils\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport com.github.pockethub.android.ui.helpers.ItemListHandler\nimport com.github.pockethub.android.ui.helpers.PagedListFetcher\nimport com.github.pockethub.android.ui.helpers.PagedScrollListener\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.rx.AutoDisposeUtils\nimport com.github.pockethub.android.rx.RxProgress\nimport com.github.pockethub.android.ui.base.BaseFragment\nimport com.github.pockethub.android.ui.item.repository.RepositoryItem\nimport com.github.pockethub.android.ui.repo.RepositoryViewActivity\nimport com.github.pockethub.android.util.InfoUtils\nimport com.github.pockethub.android.util.ToastUtils\nimport com.meisolsson.githubsdk.core.ServiceGenerator\nimport com.meisolsson.githubsdk.model.Page\nimport com.meisolsson.githubsdk.model.Repository\nimport com.meisolsson.githubsdk.service.repositories.RepositoryService\nimport com.meisolsson.githubsdk.service.search.SearchService\nimport com.xwray.groupie.Item\nimport com.xwray.groupie.OnItemClickListener\nimport io.reactivex.Single\nimport io.reactivex.android.schedulers.AndroidSchedulers\nimport io.reactivex.schedulers.Schedulers\nimport kotlinx.android.synthetic.main.fragment_item_list.view.*\nimport retrofit2.Response\nimport java.text.MessageFormat\nimport javax.inject.Inject\n\n/**\n * Fragment to display a list of [Repository] instances\n */\n//Repository\nclass SearchRepositoryListFragment : BaseFragment() {\n\n    @Inject\n    protected lateinit var service: SearchService\n\n    lateinit var pagedListFetcher: PagedListFetcher<Repository>\n\n    private lateinit var itemListHandler: ItemListHandler\n\n    protected val errorMessage: Int\n        get() = R.string.error_repos_load\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? {\n        return inflater.inflate(R.layout.fragment_item_list, container, false)\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        itemListHandler = ItemListHandler(\n            view.list,\n            view.empty,\n            lifecycle,\n            activity,\n            OnItemClickListener(this::onItemClick)\n        )\n\n        pagedListFetcher = PagedListFetcher(\n            view.swipe_item,\n            lifecycle,\n            itemListHandler,\n            { t -> ToastUtils.show(activity, errorMessage) },\n            this::loadData,\n            this::createItem\n        )\n\n        view.list.addOnScrollListener(\n            PagedScrollListener(itemListHandler.mainSection, pagedListFetcher)\n        )\n        itemListHandler.setEmptyText(R.string.no_repositories)\n    }\n\n    override fun onAttach(context: Context) {\n        super.onAttach(context)\n        start()\n    }\n\n    private fun start() {\n        openRepositoryMatch(activity?.intent?.getStringExtra(QUERY))\n    }\n\n    fun onItemClick(item: Item<*>, view: View) {\n        if (item is RepositoryItem) {\n            val result = item.repo\n            ServiceGenerator.createService(context, RepositoryService::class.java)\n                .getRepository(result.owner()!!.login(), result.name())\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .compose(RxProgress.bindToLifecycle(activity,\n                    MessageFormat.format(getString(R.string.opening_repository),\n                        InfoUtils.createRepoId(result))))\n                .`as`(AutoDisposeUtils.bindToLifecycle(this))\n                .subscribe { response -> startActivity(RepositoryViewActivity.createIntent(response.body()!!)) }\n        }\n    }\n\n    /**\n     * Check if the search query is an exact repository name/owner match and\n     * open the repository activity and finish the current activity when it is\n     *\n     * @param query\n     * @return true if query opened as repository, false otherwise\n     */\n    private fun openRepositoryMatch(query: String?): Boolean {\n        if (TextUtils.isEmpty(query)) {\n            return false\n        }\n\n        val repoId = InfoUtils.createRepoFromUrl(query!!.trim { it <= ' ' }) ?: return false\n\n        ServiceGenerator.createService(context, RepositoryService::class.java)\n            .getRepository(repoId.owner()!!.login(), repoId.name())\n            .subscribe { response ->\n                if (response.isSuccessful) {\n                    startActivity(RepositoryViewActivity.createIntent(response.body()!!))\n                    val activity = activity\n                    activity?.finish()\n                }\n            }\n\n        return true\n    }\n\n\n    private fun loadData(page: Int): Single<Response<Page<Repository>>> {\n        return service.searchRepositories(activity?.intent?.getStringExtra(QUERY), null, null, page.toLong())\n            .map { response ->\n                val repositorySearchPage = response.body()!!\n                Response.success(Page.builder<Repository>()\n                    .first(repositorySearchPage.first())\n                    .last(repositorySearchPage.last())\n                    .next(repositorySearchPage.next())\n                    .prev(repositorySearchPage.prev())\n                    .items(repositorySearchPage.items())\n                    .build())\n            }\n    }\n\n    private fun createItem(item: Repository): Item<*> {\n        return RepositoryItem(item, null)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/search/SearchUserListFragment.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.search\n\nimport android.app.SearchManager\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport com.github.pockethub.android.ui.helpers.ItemListHandler\nimport com.github.pockethub.android.ui.helpers.PagedListFetcher\nimport com.github.pockethub.android.ui.helpers.PagedScrollListener\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.rx.AutoDisposeUtils\nimport com.github.pockethub.android.ui.base.BaseFragment\nimport com.github.pockethub.android.ui.item.UserItem\nimport com.github.pockethub.android.ui.user.UserViewActivity\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.github.pockethub.android.util.ToastUtils\nimport com.meisolsson.githubsdk.core.ServiceGenerator\nimport com.meisolsson.githubsdk.model.Page\nimport com.meisolsson.githubsdk.model.User\nimport com.meisolsson.githubsdk.service.search.SearchService\nimport com.meisolsson.githubsdk.service.users.UserService\nimport com.xwray.groupie.Item\nimport com.xwray.groupie.OnItemClickListener\nimport io.reactivex.Single\nimport io.reactivex.android.schedulers.AndroidSchedulers\nimport io.reactivex.schedulers.Schedulers\nimport kotlinx.android.synthetic.main.fragment_item_list.view.*\nimport retrofit2.Response\nimport javax.inject.Inject\n\n/**\n * Fragment to display a list of [User] instances\n */\nclass SearchUserListFragment : BaseFragment() {\n\n    @Inject\n    protected lateinit var service: SearchService\n\n    @Inject\n    protected lateinit var avatars: AvatarLoader\n\n    lateinit var pagedListFetcher: PagedListFetcher<User>\n\n    private lateinit var itemListHandler: ItemListHandler\n\n    protected val errorMessage: Int\n        get() = R.string.error_users_search\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? {\n        return inflater.inflate(R.layout.fragment_item_list, container, false)\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        itemListHandler = ItemListHandler(\n            view.list,\n            view.empty,\n            lifecycle,\n            activity,\n            OnItemClickListener(this::onItemClick)\n        )\n\n        pagedListFetcher = PagedListFetcher(\n            view.swipe_item,\n            lifecycle,\n            itemListHandler,\n            { t -> ToastUtils.show(activity, errorMessage) },\n            this::loadData,\n            this::createItem\n        )\n\n        view.list.addOnScrollListener(\n            PagedScrollListener(itemListHandler.mainSection, pagedListFetcher)\n        )\n        itemListHandler.setEmptyText(R.string.no_people)\n    }\n\n    private fun loadData(page: Int): Single<Response<Page<User>>> {\n        return service.searchUsers(activity?.intent?.getStringExtra(SearchManager.QUERY), null, null, page.toLong())\n            .map { response ->\n                val repositorySearchPage = response.body()!!\n\n                Response.success(Page.builder<User>()\n                    .first(repositorySearchPage.first())\n                    .last(repositorySearchPage.last())\n                    .next(repositorySearchPage.next())\n                    .prev(repositorySearchPage.prev())\n                    .items(repositorySearchPage.items())\n                    .build())\n            }\n    }\n\n    private fun createItem(item: User): Item<*> {\n        return UserItem(avatars, item)\n    }\n\n    fun onItemClick(item: Item<*>, view: View) {\n        if (item is UserItem) {\n            val result = item.user\n            ServiceGenerator.createService(context, UserService::class.java)\n                .getUser(result.login())\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .`as`(AutoDisposeUtils.bindToLifecycle(this))\n                .subscribe { response -> startActivity(UserViewActivity.createIntent(response.body()!!)) }\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/user/FollowersFragment.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.user\n\nimport com.github.pockethub.android.R\n\n/**\n * Fragment to display a list of followers\n */\nabstract class FollowersFragment : PagedUserFragment() {\n\n    override val emptyText: Int = R.string.no_followers\n\n    override val errorMessage: Int = R.string.error_followers_load\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/user/FollowingFragment.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.user\n\nimport com.github.pockethub.android.R\n\n/**\n * Fragment to display a list of users being followed\n */\nabstract class FollowingFragment : PagedUserFragment() {\n\n    override val emptyText: Int = R.string.no_people\n\n    override val errorMessage: Int = R.string.error_people_load\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/user/HomePagerAdapter.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.user\n\nimport android.os.Bundle\nimport androidx.fragment.app.Fragment\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.ui.base.FragmentPagerAdapter\nimport com.github.pockethub.android.ui.repo.RepositoryListFragment\nimport com.meisolsson.githubsdk.model.User\n\n/**\n * Pager adapter for a user's different views.\n */\nclass HomePagerAdapter(\n        fragment: Fragment,\n        private val defaultUser: Boolean,\n        private val org: User\n) : FragmentPagerAdapter(fragment) {\n\n    private val resources = fragment.resources\n\n    override fun getItem(position: Int): Fragment {\n        val fragment = when (position) {\n            0 -> if (defaultUser) UserReceivedNewsFragment() else OrganizationNewsFragment()\n            1 -> RepositoryListFragment()\n            2 -> if (defaultUser) MyFollowersFragment() else MembersFragment()\n            3 -> MyFollowingFragment()\n            else -> error(\"Unknown position: $position\")\n        }\n\n        val args = Bundle()\n        args.putParcelable(\"org\", org)\n        fragment.arguments = args\n\n        return fragment\n    }\n\n    override fun getCount(): Int {\n        return if (defaultUser) 4 else 3\n    }\n\n    override fun getPageTitle(position: Int): CharSequence {\n        return when (position) {\n            0 -> resources.getString(R.string.tab_news)\n            1 -> resources.getString(R.string.tab_repositories)\n            2 -> resources.getString(\n                    if (defaultUser) R.string.tab_followers_self else R.string.tab_members\n            )\n            3 -> resources.getString(R.string.tab_following_self)\n            else -> error(\"Unknown position: $position\")\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/user/HomePagerFragment.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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\npackage com.github.pockethub.android.ui.user\n\nimport android.content.Context\nimport android.content.SharedPreferences\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.annotation.Nullable\nimport androidx.core.content.edit\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.accounts.AccountUtils\nimport com.github.pockethub.android.ui.base.BaseFragment\nimport com.github.pockethub.android.ui.helpers.PagerHandler\nimport com.github.pockethub.android.util.PreferenceUtils\nimport com.meisolsson.githubsdk.model.User\nimport kotlinx.android.synthetic.main.pager_with_tabs.*\nimport kotlinx.android.synthetic.main.pager_with_tabs.view.*\n\nclass HomePagerFragment : BaseFragment() {\n\n    private var sharedPreferences: SharedPreferences? = null\n\n    private var isDefaultUser: Boolean = false\n\n    private var org: User? = null\n\n    private var pagerHandler: PagerHandler<HomePagerAdapter>? = null\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? {\n        return inflater.inflate(R.layout.pager_with_tabs, container, false)\n    }\n\n    override fun onViewCreated(view: View, @Nullable savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        view.toolbar.visibility = View.GONE\n        sharedPreferences = activity!!.getPreferences(Context.MODE_PRIVATE)\n        setOrg(arguments!!.getParcelable(\"org\")!!)\n    }\n\n    private fun setOrg(org: User) {\n        sharedPreferences!!.edit {\n            putInt(PREF_ORG_ID, org.id()!!.toInt())\n        }\n        this.org = org\n        this.isDefaultUser = AccountUtils.isUser(activity, org)\n        configurePager()\n    }\n\n    private fun configurePager() {\n        val adapter = HomePagerAdapter(this, isDefaultUser, org!!)\n        pagerHandler = PagerHandler(this, vp_pages, adapter)\n        lifecycle.addObserver(pagerHandler!!)\n        pagerHandler!!.tabs = sliding_tabs_layout\n    }\n\n    override fun onDestroy() {\n        super.onDestroy()\n        if (pagerHandler != null) {\n            lifecycle.removeObserver(pagerHandler!!)\n        }\n    }\n\n    companion object {\n\n        private val TAG = \"HomePagerFragment\"\n\n        private val PREF_ORG_ID = \"orgId\"\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/user/MembersFragment.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.user\n\nimport android.os.Bundle\nimport com.github.pockethub.android.Intents.EXTRA_USER\nimport com.github.pockethub.android.R\nimport com.meisolsson.githubsdk.core.ServiceGenerator\nimport com.meisolsson.githubsdk.model.Page\nimport com.meisolsson.githubsdk.model.User\nimport com.meisolsson.githubsdk.service.organizations.OrganizationMemberService\nimport io.reactivex.Single\nimport retrofit2.Response\n\n/**\n * Fragment to display the members of an org.\n */\nclass MembersFragment : PagedUserFragment() {\n\n    internal var service = ServiceGenerator.createService(context, OrganizationMemberService::class.java)\n\n    private var org: User? = null\n\n    override val emptyText: Int = R.string.no_members\n\n    override val errorMessage: Int = R.string.error_members_load\n\n    override fun onSaveInstanceState(outState: Bundle) {\n        super.onSaveInstanceState(outState)\n        if (org != null) {\n            outState.putParcelable(EXTRA_USER, org)\n        }\n    }\n\n    override fun onActivityCreated(savedInstanceState: Bundle?) {\n        org = arguments!!.getParcelable(\"org\")\n        if (org == null && savedInstanceState != null) {\n            org = savedInstanceState.getParcelable(EXTRA_USER)\n        }\n\n        super.onActivityCreated(savedInstanceState)\n    }\n\n    override fun loadData(page: Int): Single<Response<Page<User>>> {\n        return service.getMembers(org!!.login(), page.toLong())\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/user/MyFollowersFragment.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.user;\n\nimport com.meisolsson.githubsdk.core.ServiceGenerator;\nimport com.meisolsson.githubsdk.model.Page;\nimport com.meisolsson.githubsdk.model.User;\nimport com.meisolsson.githubsdk.service.users.UserFollowerService;\n\nimport io.reactivex.Single;\nimport retrofit2.Response;\n\n/**\n * Fragment to display a list of followers\n */\npublic class MyFollowersFragment extends FollowersFragment {\n\n    UserFollowerService service = ServiceGenerator.createService(getContext(), UserFollowerService.class);\n\n    @Override\n    protected Single<Response<Page<User>>> loadData(int page) {\n        return service.getFollowers(page);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/user/MyFollowingFragment.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.user;\n\nimport com.meisolsson.githubsdk.core.ServiceGenerator;\nimport com.meisolsson.githubsdk.model.Page;\nimport com.meisolsson.githubsdk.model.User;\nimport com.meisolsson.githubsdk.service.users.UserFollowerService;\n\nimport io.reactivex.Single;\nimport retrofit2.Response;\n\n/**\n * Fragment to display the users being followed by the default user\n */\npublic class MyFollowingFragment extends FollowingFragment {\n\n    UserFollowerService service = ServiceGenerator.createService(getContext(), UserFollowerService.class);\n\n    @Override\n    protected Single<Response<Page<User>>> loadData(int page) {\n        return service.getFollowing(page);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/user/OrganizationNewsFragment.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.user;\n\nimport com.github.pockethub.android.accounts.AccountUtils;\nimport com.meisolsson.githubsdk.core.ServiceGenerator;\nimport com.meisolsson.githubsdk.model.GitHubEvent;\nimport com.meisolsson.githubsdk.model.Page;\nimport com.meisolsson.githubsdk.service.activity.EventService;\n\nimport io.reactivex.Single;\nimport retrofit2.Response;\n\n/**\n * Fragment to display an organization's news\n */\npublic class OrganizationNewsFragment extends UserNewsFragment {\n\n    EventService service = ServiceGenerator.createService(getContext(), EventService.class);\n\n    @Override\n    protected Single<Response<Page<GitHubEvent>>> loadData(int page) {\n        String account = AccountUtils.getLogin(getActivity());\n        return service.getOrganizationEvents(account, org.login(), page);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/user/OrganizationSelectionListener.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.user;\n\nimport com.meisolsson.githubsdk.model.User;\n\n/**\n * Callback interface when the selected organization changes\n */\npublic interface OrganizationSelectionListener {\n\n    /**\n     * Organization selection changed\n     *\n     * @param organization\n     */\n    void onOrganizationSelected(User organization);\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/user/OrganizationSelectionProvider.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.user;\n\nimport com.meisolsson.githubsdk.model.User;\n\n/**\n * Interface to register and unregister a {@link OrganizationSelectionListener}\n */\npublic interface OrganizationSelectionProvider {\n\n    /**\n     * Add selection listener\n     *\n     * @param listener\n     * @return the currently selected organization\n     */\n    User addListener(OrganizationSelectionListener listener);\n\n    /**\n     * Remove selection listener\n     *\n     * @param listener\n     * @return this selection provider\n     */\n    OrganizationSelectionProvider removeListener(\n            OrganizationSelectionListener listener);\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/user/PagedUserFragment.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.user\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport com.github.pockethub.android.ui.helpers.ItemListHandler\nimport com.github.pockethub.android.ui.helpers.PagedListFetcher\nimport com.github.pockethub.android.ui.helpers.PagedScrollListener\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.ui.base.BaseFragment\nimport com.github.pockethub.android.ui.item.UserItem\nimport com.github.pockethub.android.util.AvatarLoader\nimport com.github.pockethub.android.util.ToastUtils\nimport com.meisolsson.githubsdk.model.Page\nimport com.meisolsson.githubsdk.model.User\nimport com.xwray.groupie.Item\nimport com.xwray.groupie.OnItemClickListener\nimport io.reactivex.Single\nimport kotlinx.android.synthetic.main.fragment_item_list.view.*\nimport retrofit2.Response\nimport javax.inject.Inject\n\n/**\n * Fragment to page over users\n */\nabstract class PagedUserFragment : BaseFragment() {\n\n    /**\n     * Avatar loader\n     */\n    @Inject\n    protected lateinit var avatars: AvatarLoader\n\n    private lateinit var pagedListFetcher: PagedListFetcher<User>\n\n    private lateinit var itemListHandler: ItemListHandler\n\n    protected abstract val errorMessage: Int\n\n    protected abstract val emptyText: Int\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? {\n        return inflater.inflate(R.layout.fragment_item_list, container, false)\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        itemListHandler = ItemListHandler(\n            view.list,\n            view.empty,\n            lifecycle,\n            activity,\n            OnItemClickListener(this::onItemClick)\n        )\n\n        pagedListFetcher = PagedListFetcher(\n            view.swipe_item,\n            lifecycle,\n            itemListHandler,\n            { t -> ToastUtils.show(activity, errorMessage) },\n            this::loadData,\n            this::createItem\n        )\n\n        view.list.addOnScrollListener(\n            PagedScrollListener(itemListHandler.mainSection, pagedListFetcher)\n        )\n        itemListHandler.setEmptyText(emptyText)\n    }\n\n    protected abstract fun loadData(page: Int): Single<Response<Page<User>>>\n\n    protected fun createItem(item: User): Item<*> {\n        return UserItem(avatars, item)\n    }\n\n    fun onItemClick(item: Item<*>, view: View) {\n        if (item is UserItem) {\n            val user = item.user\n            startActivity(UserViewActivity.createIntent(user))\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/user/UriLauncherActivity.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.user;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.net.Uri;\nimport android.os.Bundle;\nimport android.text.TextUtils;\n\nimport com.afollestad.materialdialogs.MaterialDialog;\nimport com.meisolsson.githubsdk.model.Gist;\nimport com.meisolsson.githubsdk.model.Issue;\nimport com.meisolsson.githubsdk.model.Repository;\nimport com.meisolsson.githubsdk.model.User;\nimport com.github.pockethub.android.R;\nimport com.github.pockethub.android.core.commit.CommitMatch;\nimport com.github.pockethub.android.core.commit.CommitUriMatcher;\nimport com.github.pockethub.android.core.gist.GistUriMatcher;\nimport com.github.pockethub.android.core.issue.IssueUriMatcher;\nimport com.github.pockethub.android.core.repo.RepositoryUriMatcher;\nimport com.github.pockethub.android.core.user.UserUriMatcher;\nimport com.github.pockethub.android.ui.commit.CommitViewActivity;\nimport com.github.pockethub.android.ui.gist.GistsViewActivity;\nimport com.github.pockethub.android.ui.issue.IssuesViewActivity;\nimport com.github.pockethub.android.ui.repo.RepositoryViewActivity;\n\nimport java.net.URI;\nimport java.text.MessageFormat;\n\nimport static android.content.Intent.ACTION_VIEW;\nimport static android.content.Intent.CATEGORY_BROWSABLE;\n\n/**\n * Activity to launch other activities based on the intent's data {@link URI}\n */\npublic class UriLauncherActivity extends Activity {\n\n    private static final String HOST_DEFAULT = \"github.com\";\n    private static final String HOST_GISTS = \"gist.github.com\";\n    private static final String PROTOCOL_HTTPS = \"https\";\n\n    static public void launchUri(Context context, Uri data) {\n        Intent intent = getIntentForURI(data);\n        if (intent != null) {\n            context.startActivity(intent);\n        } else {\n            context.startActivity(new Intent(ACTION_VIEW, data).addCategory(CATEGORY_BROWSABLE));\n        }\n    }\n\n    /**\n     * Convert global view intent one into one that can be possibly opened\n     * inside the current application.\n     *\n     * @param intent\n     * @return converted intent or null if non-application specific\n     */\n    static public Intent convert(final Intent intent) {\n        if (intent == null) {\n            return null;\n        }\n\n        if (!ACTION_VIEW.equals(intent.getAction())) {\n            return null;\n        }\n\n        Uri data = intent.getData();\n        if (data == null) {\n            return null;\n        }\n\n        if (TextUtils.isEmpty(data.getHost()) || TextUtils.isEmpty(data.getScheme())) {\n            String host = data.getHost();\n            if (TextUtils.isEmpty(host)) {\n                host = HOST_DEFAULT;\n            }\n            String scheme = data.getScheme();\n            if (TextUtils.isEmpty(scheme)) {\n                scheme = PROTOCOL_HTTPS;\n            }\n            String prefix = scheme + \"://\" + host;\n\n            String path = data.getPath();\n            if (!TextUtils.isEmpty(path)) {\n                if (path.charAt(0) == '/') {\n                    data = Uri.parse(prefix + path);\n                } else {\n                    data = Uri.parse(prefix + '/' + path);\n                }\n            } else {\n                data = Uri.parse(prefix);\n            }\n            intent.setData(data);\n        }\n\n        return getIntentForURI(data);\n    }\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n\n        final Intent intent = getIntent();\n        final Uri data = intent.getData();\n\n        final Intent newIntent = getIntentForURI(data);\n        if (newIntent != null) {\n            startActivity(newIntent);\n            finish();\n            return;\n        }\n\n        if (!intent.hasCategory(CATEGORY_BROWSABLE)) {\n            startActivity(new Intent(ACTION_VIEW, data).addCategory(CATEGORY_BROWSABLE));\n            finish();\n        } else {\n            showParseError(data.toString());\n        }\n    }\n\n    static private Intent getIntentForURI(Uri data) {\n        if (HOST_GISTS.equals(data.getHost())) {\n            Gist gist = GistUriMatcher.getGist(data);\n            if (gist != null) {\n                return GistsViewActivity.Companion.createIntent(gist);\n            }\n        } else if (HOST_DEFAULT.equals(data.getHost())) {\n            CommitMatch commit = CommitUriMatcher.getCommit(data);\n            if (commit != null) {\n                return CommitViewActivity.Companion.createIntent(commit.getRepository(), commit.getCommit());\n            }\n\n            Issue issue = IssueUriMatcher.getIssue(data);\n            if (issue != null) {\n                return IssuesViewActivity.Companion.createIntent(issue, issue.repository());\n            }\n\n            Repository repository = RepositoryUriMatcher.getRepository(data);\n            if (repository != null) {\n                return RepositoryViewActivity.Companion.createIntent(repository);\n            }\n\n            User user = UserUriMatcher.getUser(data);\n            if (user != null) {\n                return UserViewActivity.Companion.createIntent(user);\n            }\n        }\n\n        return null;\n    }\n\n    private void showParseError(String url) {\n        new MaterialDialog.Builder(this)\n                .title(R.string.title_invalid_github_url)\n                .content(MessageFormat.format(getString(R.string.message_invalid_github_url), url))\n                .cancelListener(dialog -> finish())\n                .positiveText(android.R.string.ok)\n                .onPositive((dialog, which) -> finish())\n                .show();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/user/UserCreatedNewsFragment.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.user;\n\nimport com.meisolsson.githubsdk.core.ServiceGenerator;\nimport com.meisolsson.githubsdk.model.GitHubEvent;\nimport com.meisolsson.githubsdk.model.Page;\nimport com.meisolsson.githubsdk.service.activity.EventService;\n\nimport io.reactivex.Single;\nimport retrofit2.Response;\n\n/**\n * News that a given user has created\n */\npublic class UserCreatedNewsFragment extends UserNewsFragment {\n\n    EventService service = ServiceGenerator.createService(getContext(), EventService.class);\n\n    @Override\n    protected Single<Response<Page<GitHubEvent>>> loadData(int page) {\n        return service.getUserPerformedEvents(org.login(), page);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/user/UserFollowersFragment.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.user;\n\nimport android.content.Context;\n\nimport com.meisolsson.githubsdk.core.ServiceGenerator;\nimport com.meisolsson.githubsdk.model.Page;\nimport com.meisolsson.githubsdk.model.User;\nimport com.meisolsson.githubsdk.service.users.UserFollowerService;\n\nimport io.reactivex.Single;\nimport retrofit2.Response;\n\nimport static com.github.pockethub.android.Intents.EXTRA_USER;\n\n/**\n * Fragment to display a list of followers\n */\npublic class UserFollowersFragment extends FollowersFragment {\n\n    UserFollowerService service = ServiceGenerator.createService(getContext(), UserFollowerService.class);\n\n    private User user;\n\n    @Override\n    public void onAttach(Context context) {\n        super.onAttach(context);\n\n        user = requireActivity().getIntent().getParcelableExtra(EXTRA_USER);\n    }\n\n    @Override\n    protected Single<Response<Page<User>>> loadData(int page) {\n        return service.getFollowers(user.login(), page);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/user/UserFollowingFragment.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.user;\n\nimport android.content.Context;\n\nimport com.meisolsson.githubsdk.core.ServiceGenerator;\nimport com.meisolsson.githubsdk.model.Page;\nimport com.meisolsson.githubsdk.model.User;\nimport com.meisolsson.githubsdk.service.users.UserFollowerService;\n\nimport io.reactivex.Single;\nimport retrofit2.Response;\n\nimport static com.github.pockethub.android.Intents.EXTRA_USER;\n\n/**\n * Fragment to display the users being followed by a specific user\n */\npublic class UserFollowingFragment extends FollowingFragment {\n\n    UserFollowerService service = ServiceGenerator.createService(getContext(), UserFollowerService.class);\n\n    private User user;\n\n    @Override\n    public void onAttach(Context context) {\n        super.onAttach(context);\n\n        user = requireActivity().getIntent().getParcelableExtra(EXTRA_USER);\n    }\n\n    @Override\n    protected Single<Response<Page<User>>> loadData(int page) {\n        return service.getFollowing(user.login(), page);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/user/UserNewsFragment.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.user;\n\nimport android.os.Bundle;\n\nimport com.github.pockethub.android.core.user.UserEventMatcher.UserPair;\nimport com.github.pockethub.android.ui.NewsFragment;\nimport com.meisolsson.githubsdk.model.Repository;\nimport com.meisolsson.githubsdk.model.User;\n\nimport static com.github.pockethub.android.Intents.EXTRA_USER;\n\n/**\n * Fragment to display a news feed for a given user/org\n */\npublic abstract class UserNewsFragment extends NewsFragment implements\n    OrganizationSelectionListener {\n\n    /**\n     * Current organization/user\n     */\n    protected User org;\n\n    @Override\n    public void onSaveInstanceState(Bundle outState) {\n        super.onSaveInstanceState(outState);\n\n        if (org != null) {\n            outState.putParcelable(EXTRA_USER, org);\n        }\n    }\n\n    @Override\n    public void onActivityCreated(Bundle savedInstanceState) {\n        if (getActivity() instanceof OrganizationSelectionProvider) {\n            org = ((OrganizationSelectionProvider) getActivity()).addListener(this);\n        }\n\n        if (getArguments() != null && getArguments().containsKey(\"org\")) {\n            org = getArguments().getParcelable(\"org\");\n        }\n\n        if (org == null && savedInstanceState != null) {\n            org = (User) savedInstanceState.get(EXTRA_USER);\n        }\n\n        super.onActivityCreated(savedInstanceState);\n    }\n\n    @Override\n    public void onDetach() {\n        if (getActivity() != null && getActivity() instanceof OrganizationSelectionProvider) {\n            OrganizationSelectionProvider selectionProvider = (OrganizationSelectionProvider) getActivity();\n            selectionProvider.removeListener(this);\n        }\n\n        super.onDetach();\n    }\n\n    @Override\n    protected void viewRepository(Repository repository) {\n        User owner = repository.owner();\n        if (owner != null && org.login().equals(owner.login())) {\n            repository = repository.toBuilder().owner(org).build();\n        }\n\n        super.viewRepository(repository);\n    }\n\n    @Override\n    public void onOrganizationSelected(User organization) {\n        int previousOrgId = org != null ? org.id().intValue() : -1;\n        org = organization;\n        // Only hard refresh if view already created and org is changing\n        if (previousOrgId != org.id()) {\n            pagedListFetcher.refresh();\n        }\n    }\n\n    @Override\n    protected boolean viewUser(User user) {\n        if (org.id() != user.id()) {\n            startActivity(UserViewActivity.Companion.createIntent(user));\n            return true;\n        }\n        return false;\n    }\n\n    @Override\n    protected void viewUser(UserPair users) {\n        if (!viewUser(users.from)) {\n            viewUser(users.to);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/user/UserPagerAdapter.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.user;\n\nimport android.content.res.Resources;\nimport androidx.fragment.app.Fragment;\nimport androidx.appcompat.app.AppCompatActivity;\n\nimport com.github.pockethub.android.R;\nimport com.github.pockethub.android.ui.base.FragmentPagerAdapter;\nimport com.github.pockethub.android.ui.repo.UserRepositoryListFragment;\n\n/**\n * Pager adapter for a user's different views\n */\npublic class UserPagerAdapter extends FragmentPagerAdapter {\n\n    private final Resources resources;\n\n    /**\n     * @param activity\n     */\n    public UserPagerAdapter(final AppCompatActivity activity) {\n        super(activity);\n\n        resources = activity.getResources();\n    }\n\n    @Override\n    public Fragment getItem(final int position) {\n        switch (position) {\n        case 0:\n            return new UserCreatedNewsFragment();\n        case 1:\n            return new UserRepositoryListFragment();\n        case 2:\n            return new UserFollowersFragment();\n        case 3:\n            return new UserFollowingFragment();\n        default:\n            return null;\n        }\n    }\n\n    @Override\n    public int getCount() {\n        return 4;\n    }\n\n    @Override\n    public CharSequence getPageTitle(int position) {\n        switch (position) {\n        case 0:\n            return resources.getString(R.string.tab_news);\n        case 1:\n            return resources.getString(R.string.tab_repositories);\n        case 2:\n            return resources.getString(R.string.tab_followers);\n        case 3:\n            return resources.getString(R.string.tab_following);\n        default:\n            return null;\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/user/UserReceivedNewsFragment.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.user;\n\nimport com.meisolsson.githubsdk.core.ServiceGenerator;\nimport com.meisolsson.githubsdk.model.GitHubEvent;\nimport com.meisolsson.githubsdk.model.Page;\nimport com.meisolsson.githubsdk.service.activity.EventService;\n\nimport io.reactivex.Single;\nimport retrofit2.Response;\n\n/**\n * News that a given user has received\n */\npublic class UserReceivedNewsFragment extends UserNewsFragment {\n\n    EventService service = ServiceGenerator.createService(getContext(), EventService.class);\n\n    @Override\n    protected Single<Response<Page<GitHubEvent>>> loadData(int page) {\n        return service.getUserReceivedEvents(org.login(), page);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/user/UserViewActivity.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.ui.user\n\nimport android.content.Intent\nimport android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP\nimport android.content.Intent.FLAG_ACTIVITY_SINGLE_TOP\nimport android.os.Bundle\nimport android.text.TextUtils\nimport android.view.Menu\nimport android.view.MenuItem\nimport android.view.View\nimport com.github.pockethub.android.Intents.Builder\nimport com.github.pockethub.android.Intents.EXTRA_USER\nimport com.github.pockethub.android.R\nimport com.github.pockethub.android.accounts.AccountUtils\nimport com.github.pockethub.android.rx.AutoDisposeUtils\nimport com.github.pockethub.android.ui.base.BaseActivity\nimport com.github.pockethub.android.ui.MainActivity\nimport com.github.pockethub.android.ui.helpers.PagerHandler\nimport com.github.pockethub.android.util.ToastUtils\nimport com.meisolsson.githubsdk.core.ServiceGenerator\nimport com.meisolsson.githubsdk.model.User\nimport com.meisolsson.githubsdk.service.users.UserFollowerService\nimport com.meisolsson.githubsdk.service.users.UserService\nimport io.reactivex.Single\nimport io.reactivex.android.schedulers.AndroidSchedulers\nimport io.reactivex.schedulers.Schedulers\nimport kotlinx.android.synthetic.main.pager_with_tabs.*\nimport kotlinx.android.synthetic.main.tabbed_progress_pager.*\nimport retrofit2.Response\n\n/**\n * Activity to view a user's various pages\n */\nclass UserViewActivity : BaseActivity(), OrganizationSelectionProvider {\n\n    private var user: User? = null\n\n    private var isFollowing: Boolean = false\n\n    private var followingStatusChecked: Boolean = false\n\n    private var pagerHandler: PagerHandler<UserPagerAdapter>? = null\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.tabbed_progress_pager)\n\n        user = intent.getParcelableExtra(EXTRA_USER)\n\n        val actionBar = supportActionBar!!\n        actionBar.setDisplayHomeAsUpEnabled(true)\n        actionBar.title = user!!.login()\n\n        if (!TextUtils.isEmpty(user!!.avatarUrl())) {\n            configurePager()\n        } else {\n            pb_loading.visibility = View.VISIBLE\n            ServiceGenerator.createService(this, UserService::class.java)\n                .getUser(user!!.login())\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .`as`(AutoDisposeUtils.bindToLifecycle(this))\n                .subscribe({ response ->\n                    user = response.body()\n                    configurePager()\n                }, { e ->\n                    ToastUtils.show(this, R.string.error_person_load)\n                    pb_loading.visibility = View.GONE\n                })\n        }\n    }\n\n    override fun onCreateOptionsMenu(menu: Menu): Boolean {\n        menuInflater.inflate(R.menu.activity_user_follow, menu)\n\n        return super.onCreateOptionsMenu(menu)\n    }\n\n    override fun onPrepareOptionsMenu(menu: Menu): Boolean {\n        val followItem = menu.findItem(R.id.m_follow)\n        val isCurrentUser = user!!.login() == AccountUtils.getLogin(this)\n\n        followItem.isVisible = followingStatusChecked && !isCurrentUser\n        followItem.setTitle(if (isFollowing) R.string.unfollow else R.string.follow)\n\n        return super.onPrepareOptionsMenu(menu)\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        return when (item.itemId) {\n            R.id.m_follow -> {\n                followUser()\n                true\n            }\n            android.R.id.home -> {\n                val intent = Intent(this, MainActivity::class.java)\n                intent.addFlags(FLAG_ACTIVITY_CLEAR_TOP or FLAG_ACTIVITY_SINGLE_TOP)\n                startActivity(intent)\n                true\n            }\n            else -> super.onOptionsItemSelected(item)\n        }\n    }\n\n    private fun configurePager() {\n        val adapter = UserPagerAdapter(this)\n        pagerHandler = PagerHandler(this, vp_pages, adapter)\n        lifecycle.addObserver(pagerHandler!!)\n        pagerHandler!!.tabs = sliding_tabs_layout\n\n        pb_loading.visibility = View.GONE\n        pagerHandler!!.setGone(false)\n        checkFollowingUserStatus()\n    }\n\n    override fun onDestroy() {\n        super.onDestroy()\n        lifecycle.removeObserver(pagerHandler!!)\n    }\n\n    override fun addListener(listener: OrganizationSelectionListener): User? {\n        return user\n    }\n\n    override fun removeListener(\n        listener: OrganizationSelectionListener\n    ): OrganizationSelectionProvider {\n        return this\n    }\n\n    private fun followUser() {\n        val service = ServiceGenerator.createService(this, UserFollowerService::class.java)\n\n        val followSingle: Single<Response<Void>>\n        followSingle = if (isFollowing) {\n            service.unfollowUser(user!!.login())\n        } else {\n            service.followUser(user!!.login())\n        }\n\n        followSingle.subscribeOn(Schedulers.io())\n            .observeOn(AndroidSchedulers.mainThread())\n            .`as`(AutoDisposeUtils.bindToLifecycle(this))\n            .subscribe({ aVoid -> isFollowing = !isFollowing },\n                { e ->\n                    val message = if (isFollowing)\n                        R.string.error_unfollowing_person\n                    else\n                        R.string.error_following_person\n\n                    ToastUtils.show(this, message)\n                })\n    }\n\n    private fun checkFollowingUserStatus() {\n        followingStatusChecked = false\n        ServiceGenerator.createService(this, UserFollowerService::class.java)\n            .isFollowing(user!!.login())\n            .subscribeOn(Schedulers.io())\n            .observeOn(AndroidSchedulers.mainThread())\n            .`as`(AutoDisposeUtils.bindToLifecycle(this))\n            .subscribe { response ->\n                isFollowing = response.code() == 204\n                followingStatusChecked = true\n                invalidateOptionsMenu()\n            }\n    }\n\n    companion object {\n\n        /**\n         * Create intent for this activity\n         *\n         * @param user\n         * @return intent\n         */\n        fun createIntent(user: User): Intent {\n            return Builder(\"user.VIEW\").user(user).toIntent()\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/view/LinkTextView.kt",
    "content": "package com.github.pockethub.android.ui.view\n\nimport android.content.Context\nimport android.text.method.LinkMovementMethod\nimport android.util.AttributeSet\nimport android.widget.TextView\n\nclass LinkTextView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : TextView(context, attrs, defStyleAttr) {\n\n    init {\n        movementMethod = LinkMovementMethod.getInstance()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/ui/view/OcticonTextView.java",
    "content": "package com.github.pockethub.android.ui.view;\n\nimport android.content.Context;\nimport android.graphics.Typeface;\nimport androidx.appcompat.widget.AppCompatTextView;\nimport android.util.AttributeSet;\n\npublic class OcticonTextView extends AppCompatTextView {\n\n    /**\n     * Private repository icon\n     */\n    public static final String ICON_PRIVATE = \"\\uf26a\";\n\n    /**\n     * Public repository icon\n     */\n    public static final String ICON_PUBLIC = \"\\uf201\";\n\n    /**\n     * Fork icon\n     */\n    public static final String ICON_FORK = \"\\uf202\";\n\n    /**\n     * Create icon\n     */\n    public static final String ICON_CREATE = \"\\uf203\";\n\n    /**\n     * Delete icon\n     */\n    public static final String ICON_DELETE = \"\\uf204\";\n\n    /**\n     * Push icon\n     */\n    public static final String ICON_PUSH = \"\\uf205\";\n\n    /**\n     * Wiki icon\n     */\n    public static final String ICON_WIKI = \"\\uf207\";\n\n    /**\n     * Upload icon\n     */\n    public static final String ICON_UPLOAD = \"\\uf20C\";\n\n    /**\n     * Gist icon\n     */\n    public static final String ICON_GIST = \"\\uf20E\";\n\n    /**\n     * Add member icon\n     */\n    public static final String ICON_ADD_MEMBER = \"\\uf21A\";\n\n    /**\n     * Public mirror repository icon\n     */\n    public static final String ICON_MIRROR_PUBLIC = \"\\uf224\";\n\n    /**\n     * Public mirror repository icon\n     */\n    public static final String ICON_MIRROR_PRIVATE = \"\\uf225\";\n\n    /**\n     * Follow icon\n     */\n    public static final String ICON_FOLLOW = \"\\uf21C\";\n\n    /**\n     * Star icon\n     */\n    public static final String ICON_STAR = \"\\uf02A\";\n\n    /**\n     * Pull request icon\n     */\n    public static final String ICON_PULL_REQUEST = \"\\uf222\";\n\n    /**\n     * Issue open icon\n     */\n    public static final String ICON_ISSUE_OPEN = \"\\uf226\";\n\n    /**\n     * Issue reopen icon\n     */\n    public static final String ICON_ISSUE_REOPEN = \"\\uf227\";\n\n    /**\n     * Issue close icon\n     */\n    public static final String ICON_ISSUE_CLOSE = \"\\uf228\";\n\n    /**\n     * Issue comment icon\n     */\n    public static final String ICON_ISSUE_COMMENT = \"\\uf229\";\n\n    /**\n     * Comment icon\n     */\n    public static final String ICON_COMMENT = \"\\uf22b\";\n\n    /**\n     * News icon\n     */\n    public static final String ICON_NEWS = \"\\uf234\";\n\n    /**\n     * Watch icon\n     */\n    public static final String ICON_WATCH = \"\\uf04e\";\n\n    /**\n     * Team icon\n     */\n    public static final String ICON_TEAM = \"\\uf019\";\n\n    /**\n     * Code icon\n     */\n    public static final String ICON_CODE = \"\\uf010\";\n\n    /**\n     * Tag icon\n     */\n    public static final String ICON_TAG = \"\\uf015\";\n\n    /**\n     * Commit icon\n     */\n    public static final String ICON_COMMIT = \"\\uf01f\";\n\n    /**\n     * Merge icon\n     */\n    public static final String ICON_MERGE = \"\\uf023\";\n\n    /**\n     * Key icon\n     */\n    public static final String ICON_KEY = \"\\uf049\";\n\n    /**\n     * Lock icon\n     */\n    public static final String ICON_LOCK = \"\\uf06a\";\n\n    /**\n     * Milestone icon\n     */\n    public static final String ICON_MILESTONE = \"\\uf075\";\n\n    /**\n     * Bookmark icon\n     */\n    public static final String ICON_BOOKMARK = \"\\uf07b\";\n\n    /**\n     * Person icon\n     */\n    public static final String ICON_PERSON = \"\\uf218\";\n\n    /**\n     * Add icon\n     */\n    public static final String ICON_ADD = \"\\uf05d\";\n\n    /**\n     * Broadcast icon\n     */\n    public static final String ICON_BROADCAST = \"\\uf030\";\n\n    /**\n     * Edit icon\n     */\n    public static final String ICON_EDIT = \"\\uf058\";\n\n    /**\n     * Read/check icon\n     */\n    public static final String ICON_READ = \"\\uf03a\";\n\n    private static Typeface OCTICONS;\n\n    public OcticonTextView(Context context, AttributeSet attrs) {\n        super(context, attrs);\n\n        setTypeface(getOcticons());\n    }\n\n    /**\n     * Returns Octicons typeface.\n     */\n    private Typeface getOcticons() {\n        if (OCTICONS == null) {\n            OCTICONS = getTypeface(getContext(), \"octicons-regular-webfont.ttf\");\n        }\n        return OCTICONS;\n    }\n\n    /**\n     * Returns typeface from name.\n     */\n    private static Typeface getTypeface(final Context context, final String name) {\n        return Typeface.createFromAsset(context.getAssets(), name);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/util/AvatarLoader.kt",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.util\n\nimport android.content.Context\nimport android.widget.ImageView\nimport com.bumptech.glide.Glide\nimport com.bumptech.glide.RequestManager\nimport com.bumptech.glide.load.resource.bitmap.RoundedCorners\nimport com.github.pockethub.android.R\nimport com.meisolsson.githubsdk.model.User\nimport okhttp3.HttpUrl\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n/**\n * Avatar utilities\n *\n * @constructor Create avatar helper\n */\n@Singleton\nclass AvatarLoader @Inject constructor(context: Context) {\n\n    companion object {\n        private const val DISK_CACHE_SIZE = 50 * 1024 * 1024 // 50MB\n\n        private const val TAG = \"AvatarLoader\"\n\n        private const val CORNER_RADIUS_IN_DIP = 3f\n\n        /**\n         * The max size of avatar images, used to rescale images to save memory.\n         */\n        private var avatarSize = 0\n    }\n\n    private val requestManager: RequestManager = Glide.with(context)\n\n    private val cornerRadius: Int\n\n    private val transformation: RoundedCorners\n\n    init {\n\n        val density = context.resources.displayMetrics.density\n        cornerRadius = (CORNER_RADIUS_IN_DIP * density).toInt()\n        transformation = RoundedCorners(cornerRadius)\n\n        if (avatarSize == 0) {\n            avatarSize = getMaxAvatarSize(context)\n        }\n    }\n\n    /**\n     * Bind view to image at URL\n     *\n     * @param view The ImageView that is to display the user's avatar.\n     * @param user A User object that points to the desired user.\n     */\n    fun bind(view: ImageView, user: User?) {\n        bind(view, getAvatarUrl(user))\n    }\n\n    private fun bind(view: ImageView, url: String?) {\n        var localUrl = url\n        if (localUrl == null) {\n            requestManager.load(R.drawable.spinner_inner).override(avatarSize, avatarSize).into(view)\n            return\n        }\n\n        if (localUrl.contains(\"?\") && !localUrl.contains(\"gravatar\")) {\n            localUrl = localUrl.substring(0, localUrl.indexOf(\"?\"))\n        }\n\n        requestManager.load(localUrl)\n                .placeholder(R.drawable.gravatar_icon)\n                .override(avatarSize, avatarSize)\n                .transform(transformation)\n                .into(view)\n    }\n\n    private fun getAvatarUrl(user: User?): String? {\n        if (user == null) {\n            return null\n        }\n\n        val avatarUrl = user.avatarUrl()\n        val email = user.email()\n        return if (avatarUrl != null && avatarUrl.isNotBlank()) {\n            HttpUrl.parse(avatarUrl)\n                ?.newBuilder()\n                ?.addQueryParameter(\"size\", avatarSize.toString())\n                ?.build()\n                ?.toString()\n        } else if (email != null && email.isNotBlank()){\n            getAvatarUrl(GravatarUtils.getHash(user.email()))\n        } else {\n            // This redirects to avatar URL\n            \"http://github.com/${user.login()}.png?size=$avatarSize\"\n        }\n    }\n\n    private fun getAvatarUrl(id: String?): String? {\n        return if (!id.isNullOrEmpty()) \"http://gravatar.com/avatar/$id?d=404\" else null\n    }\n\n    private fun getMaxAvatarSize(context: Context): Int {\n        val attrs = intArrayOf(android.R.attr.layout_height)\n        val array = context.theme.obtainStyledAttributes(R.style.AvatarXLarge, attrs)\n        // Passing default value of 100px, but it shouldn't resolve to default anyway.\n        val size = array.getLayoutDimension(0, 100)\n        array.recycle()\n        return size\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/util/ConvertUtils.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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\npackage com.github.pockethub.android.util;\n\nimport com.meisolsson.githubsdk.model.GitHubEvent;\nimport com.meisolsson.githubsdk.model.Repository;\n\npublic class ConvertUtils {\n\n\t/**\n\t * Converts an event repo to a new, clean repo.\n\t *\n\t * @param repo The original repo.\n\t * @return A new repo, with a name and a new owner's login.\n\t */\n\tpublic static Repository eventRepoToRepo(GitHubEvent.RepoIdentifier repo) {\n\t\tString[] ref = repo.repoWithUserName().split(\"/\");\n\t\treturn InfoUtils.createRepoFromData(ref[0], ref[1]);\n\t}\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/util/GravatarUtils.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.util;\n\nimport android.text.TextUtils;\n\nimport java.io.UnsupportedEncodingException;\nimport java.math.BigInteger;\nimport java.security.MessageDigest;\nimport java.security.NoSuchAlgorithmException;\nimport java.util.Arrays;\n\nimport static java.util.Locale.US;\n\n/**\n * Helper to get a gravatar hash for an email\n */\npublic class GravatarUtils {\n\n    /**\n     * Length of generated hash\n     */\n    private static final int HASH_LENGTH = 32;\n\n    /**\n     * Charset used for hashing\n     */\n    private static final String CHARSET = \"CP1252\";\n\n    /**\n     * Algorithm used for hashing\n     */\n    private static final MessageDigest MD5;\n\n    static {\n        MessageDigest digest;\n        try {\n            digest = MessageDigest.getInstance(\"MD5\");\n        } catch (NoSuchAlgorithmException e) {\n            digest = null;\n        }\n        MD5 = digest;\n    }\n\n    private static String digest(final String value) {\n        if (MD5 == null) {\n            return null;\n        }\n\n        byte[] bytes;\n        try {\n            bytes = value.getBytes(CHARSET);\n        } catch (UnsupportedEncodingException e) {\n            return null;\n        }\n\n        synchronized (MD5) {\n            MD5.reset();\n            bytes = MD5.digest(bytes);\n        }\n\n        String hashed = new BigInteger(1, bytes).toString(16);\n        int padding = HASH_LENGTH - hashed.length();\n        if (padding == 0) {\n            return hashed;\n        }\n\n        char[] zeros = new char[padding];\n        Arrays.fill(zeros, '0');\n        return String.valueOf(zeros) + hashed;\n    }\n\n    /**\n     * Get avatar hash for specified e-mail address\n     *\n     * @param email\n     * @return hash\n     */\n    public static String getHash(String email) {\n        if (TextUtils.isEmpty(email)) {\n            return null;\n        }\n        email = email.trim().toLowerCase(US);\n        return email.length() > 0 ? digest(email) : null;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/util/HtmlUtils.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.util;\n\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.graphics.Paint.Style;\nimport android.text.Editable;\nimport android.text.Html;\nimport android.text.Html.ImageGetter;\nimport android.text.Html.TagHandler;\nimport android.text.Layout;\nimport android.text.Spanned;\nimport android.text.TextUtils;\nimport android.text.style.LeadingMarginSpan;\nimport android.text.style.QuoteSpan;\nimport android.text.style.StrikethroughSpan;\nimport android.text.style.TypefaceSpan;\n\nimport org.xml.sax.XMLReader;\n\nimport java.util.LinkedList;\n\nimport static android.graphics.Paint.Style.FILL;\nimport static android.text.Spanned.SPAN_EXCLUSIVE_EXCLUSIVE;\nimport static android.text.Spanned.SPAN_MARK_MARK;\n\n/**\n * HTML Utilities\n */\npublic class HtmlUtils {\n\n    private static class ReplySpan implements LeadingMarginSpan {\n\n        private final int color = 0xffDDDDDD;\n\n        @Override\n        public int getLeadingMargin(boolean first) {\n            return 18;\n        }\n\n        @Override\n        public void drawLeadingMargin(Canvas c, Paint p, int x, int dir,\n                                      int top, int baseline, int bottom, CharSequence text,\n                                      int start, int end, boolean first, Layout layout) {\n            final Style style = p.getStyle();\n            final int color = p.getColor();\n\n            p.setStyle(FILL);\n            p.setColor(this.color);\n\n            c.drawRect(x, top, x + dir * 6, bottom, p);\n\n            p.setStyle(style);\n            p.setColor(color);\n        }\n    }\n\n    private static final String TAG_ROOT = \"githubroot\";\n\n    private static final String ROOT_START = '<' + TAG_ROOT + '>';\n\n    private static final String ROOT_END = \"</\" + TAG_ROOT + '>';\n\n    private static final String TOGGLE_START = \"<span class=\\\"email-hidden-toggle\\\">\";\n\n    private static final String TOGGLE_END = \"</span>\";\n\n    private static final String REPLY_START = \"<div class=\\\"email-quoted-reply\\\">\";\n\n    private static final String REPLY_END = \"</div>\";\n\n    private static final String SIGNATURE_START = \"<div class=\\\"email-signature-reply\\\">\";\n\n    private static final String SIGNATURE_END = \"</div>\";\n\n    private static final String EMAIL_START = \"<div class=\\\"email-fragment\\\">\";\n\n    private static final String EMAIL_END = \"</div>\";\n\n    private static final String HIDDEN_REPLY_START = \"<div class=\\\"email-hidden-reply\\\" style=\\\" display:none\\\">\";\n\n    private static final String HIDDEN_REPLY_END = \"</div>\";\n\n    private static final String BREAK = \"<br>\";\n\n    private static final String PARAGRAPH_START = \"<p>\";\n\n    private static final String PARAGRAPH_END = \"</p>\";\n\n    private static final String BLOCKQUOTE_START = \"<blockquote>\";\n\n    private static final String BLOCKQUOTE_END = \"</blockquote>\";\n\n    private static final String SPACE = \"&nbsp;\";\n\n    private static final String PRE_START = \"<pre>\";\n\n    private static final String PRE_END = \"</pre>\";\n\n    private static final String CODE_START = \"<code>\";\n\n    private static final String CODE_END = \"</code>\";\n\n    private static class ListSeparator {\n\n        private int count;\n\n        public ListSeparator(boolean ordered) {\n            count = ordered ? 1 : -1;\n        }\n\n        public ListSeparator append(Editable output, int indentLevel) {\n            output.append('\\n');\n            for (int i = 0; i < indentLevel * 2; i++) {\n                output.append(' ');\n            }\n            if (count != -1) {\n                output.append(Integer.toString(count)).append('.');\n                count++;\n            } else {\n                output.append('\\u2022');\n            }\n            output.append(' ').append(' ');\n            return this;\n        }\n    }\n\n    private static final TagHandler TAG_HANDLER = new TagHandler() {\n\n        private static final String TAG_DEL = \"del\";\n\n        private static final String TAG_UL = \"ul\";\n\n        private static final String TAG_OL = \"ol\";\n\n        private static final String TAG_LI = \"li\";\n\n        private static final String TAG_CODE = \"code\";\n\n        private static final String TAG_PRE = \"pre\";\n\n        private int indentLevel;\n\n        private final LinkedList<ListSeparator> listElements = new LinkedList<>();\n\n        @Override\n        public void handleTag(final boolean opening, final String tag,\n                              final Editable output, final XMLReader xmlReader) {\n            if (TAG_DEL.equalsIgnoreCase(tag)) {\n                if (opening) {\n                    startSpan(new StrikethroughSpan(), output);\n                } else {\n                    endSpan(StrikethroughSpan.class, output);\n                }\n                return;\n            }\n\n            if (TAG_UL.equalsIgnoreCase(tag)) {\n                if (opening) {\n                    listElements.addFirst(new ListSeparator(false));\n                    indentLevel++;\n                } else {\n                    listElements.removeFirst();\n                    indentLevel--;\n                }\n\n                if (!opening && indentLevel == 0) {\n                    output.append('\\n');\n                }\n                return;\n            }\n\n            if (TAG_OL.equalsIgnoreCase(tag)) {\n                if (opening) {\n                    listElements.addFirst(new ListSeparator(true));\n                    indentLevel++;\n                } else {\n                    listElements.removeFirst();\n                    indentLevel--;\n                }\n                if (!opening && indentLevel == 0) {\n                    output.append('\\n');\n                }\n                return;\n            }\n\n            if (TAG_LI.equalsIgnoreCase(tag) && opening) {\n                listElements.getFirst().append(output, indentLevel);\n                return;\n            }\n\n            if (TAG_CODE.equalsIgnoreCase(tag)) {\n                if (opening) {\n                    startSpan(new TypefaceSpan(\"monospace\"), output);\n                } else {\n                    endSpan(TypefaceSpan.class, output);\n                }\n                return;\n            }\n\n            if (TAG_PRE.equalsIgnoreCase(tag)) {\n                output.append('\\n');\n                if (opening) {\n                    startSpan(new TypefaceSpan(\"monospace\"), output);\n                } else {\n                    endSpan(TypefaceSpan.class, output);\n                }\n                return;\n            }\n\n            if (TAG_ROOT.equalsIgnoreCase(tag) && !opening) {\n                // Remove leading newlines\n                while (output.length() > 0 && output.charAt(0) == '\\n') {\n                    output.delete(0, 1);\n                }\n\n                // Remove trailing newlines\n                int last = output.length() - 1;\n                while (last >= 0 && output.charAt(last) == '\\n') {\n                    output.delete(last, last + 1);\n                    last = output.length() - 1;\n                }\n\n                QuoteSpan[] quoteSpans = output.getSpans(0, output.length(),\n                        QuoteSpan.class);\n                for (QuoteSpan span : quoteSpans) {\n                    int start = output.getSpanStart(span);\n                    int end = output.getSpanEnd(span);\n                    output.removeSpan(span);\n                    output.setSpan(new ReplySpan(), start, end,\n                            SPAN_EXCLUSIVE_EXCLUSIVE);\n                }\n            }\n        }\n    };\n\n    private static Object getLast(final Spanned text, final Class<?> kind) {\n        Object[] spans = text.getSpans(0, text.length(), kind);\n        return spans.length > 0 ? spans[spans.length - 1] : null;\n    }\n\n    private static void startSpan(Object span, Editable output) {\n        int length = output.length();\n        output.setSpan(span, length, length, SPAN_MARK_MARK);\n    }\n\n    private static void endSpan(Class<?> type, Editable output) {\n        int length = output.length();\n        Object span = getLast(output, type);\n        int start = output.getSpanStart(span);\n        output.removeSpan(span);\n        if (start != length) {\n            output.setSpan(span, start, length, SPAN_EXCLUSIVE_EXCLUSIVE);\n        }\n    }\n\n    /**\n     * Encode HTML\n     *\n     * @param html\n     * @return html\n     */\n    public static CharSequence encode(final String html) {\n        return encode(html, null);\n    }\n\n    /**\n     * Encode HTML\n     *\n     * @param html\n     * @param imageGetter\n     * @return html\n     */\n    public static CharSequence encode(final String html,\n                                      final ImageGetter imageGetter) {\n        if (TextUtils.isEmpty(html)) {\n            return \"\";\n        }\n\n        return Html.fromHtml(html, imageGetter, TAG_HANDLER);\n    }\n\n    /**\n     * Format given HTML string so it is ready to be presented in a text view\n     *\n     * @param html\n     * @return formatted HTML\n     */\n    public static final CharSequence format(final String html) {\n        if (html == null) {\n            return \"\";\n        }\n        if (html.length() == 0) {\n            return \"\";\n        }\n\n        StringBuilder formatted = new StringBuilder(html);\n\n        // Remove e-mail toggle link\n        strip(formatted, TOGGLE_START, TOGGLE_END);\n\n        // Remove signature\n        strip(formatted, SIGNATURE_START, SIGNATURE_END);\n\n        // Replace div with e-mail content with block quote\n        replace(formatted, REPLY_START, REPLY_END, BLOCKQUOTE_START,\n                BLOCKQUOTE_END);\n\n        // Remove hidden div\n        strip(formatted, HIDDEN_REPLY_START, HIDDEN_REPLY_END);\n\n        // Replace paragraphs with breaks\n        if (replace(formatted, PARAGRAPH_START, BREAK)) {\n            replace(formatted, PARAGRAPH_END, BREAK);\n        }\n\n        formatPres(formatted);\n\n        formatEmailFragments(formatted);\n\n        trim(formatted);\n\n        formatted.insert(0, ROOT_START);\n        formatted.append(ROOT_END);\n\n        return formatted;\n    }\n\n    private static StringBuilder strip(final StringBuilder input,\n                                       final String prefix, final String suffix) {\n        int start = input.indexOf(prefix);\n        while (start != -1) {\n            int end = input.indexOf(suffix, start + prefix.length());\n            if (end == -1) {\n                end = input.length();\n            }\n            input.delete(start, end + suffix.length());\n            start = input.indexOf(prefix, start);\n        }\n        return input;\n    }\n\n    private static boolean replace(final StringBuilder input,\n                                   final String from, final String to) {\n        int start = input.indexOf(from);\n        if (start == -1) {\n            return false;\n        }\n\n        final int fromLength = from.length();\n        final int toLength = to.length();\n        while (start != -1) {\n            input.replace(start, start + fromLength, to);\n            start = input.indexOf(from, start + toLength);\n        }\n        return true;\n    }\n\n    private static void replaceTag(final StringBuilder input,\n                                   final String from, final String to) {\n        if (replace(input, '<' + from + '>', '<' + to + '>')) {\n            replace(input, \"</\" + from + '>', \"</\" + to + '>');\n        }\n    }\n\n    private static StringBuilder replace(final StringBuilder input,\n                                         final String fromStart, final String fromEnd, final String toStart,\n                                         final String toEnd) {\n        int start = input.indexOf(fromStart);\n        if (start == -1) {\n            return input;\n        }\n\n        final int fromStartLength = fromStart.length();\n        final int fromEndLength = fromEnd.length();\n        final int toStartLength = toStart.length();\n        while (start != -1) {\n            input.replace(start, start + fromStartLength, toStart);\n            int end = input.indexOf(fromEnd, start + toStartLength);\n            if (end != -1) {\n                input.replace(end, end + fromEndLength, toEnd);\n            }\n\n            start = input.indexOf(fromStart);\n        }\n        return input;\n    }\n\n    private static StringBuilder formatPres(final StringBuilder input) {\n        int start = input.indexOf(PRE_START);\n        final int spaceAdvance = SPACE.length() - 1;\n        final int breakAdvance = BREAK.length() - 1;\n        while (start != -1) {\n            int end = input.indexOf(PRE_END, start + PRE_START.length());\n            if (end == -1) {\n                break;\n            }\n\n            // Skip over code element\n            if (input.indexOf(CODE_START, start) == start) {\n                start += CODE_START.length();\n            }\n            if (input.indexOf(CODE_END, start) == end - CODE_END.length()) {\n                end -= CODE_END.length();\n            }\n\n            for (int i = start; i < end; i++) {\n                switch (input.charAt(i)) {\n                    case ' ':\n                        input.deleteCharAt(i);\n                        input.insert(i, SPACE);\n                        start += spaceAdvance;\n                        end += spaceAdvance;\n                        break;\n                    case '\\t':\n                        input.deleteCharAt(i);\n                        input.insert(i, SPACE);\n                        start += spaceAdvance;\n                        end += spaceAdvance;\n                        for (int j = 0; j < 3; j++) {\n                            input.insert(i, SPACE);\n                            start += spaceAdvance + 1;\n                            end += spaceAdvance + 1;\n                        }\n                        break;\n                    case '\\n':\n                        input.deleteCharAt(i);\n                        // Ignore if last character is a newline\n                        if (i + 1 < end) {\n                            input.insert(i, BREAK);\n                            start += breakAdvance;\n                            end += breakAdvance;\n                        }\n                        break;\n                }\n            }\n            start = input.indexOf(PRE_START, end + PRE_END.length());\n        }\n        return input;\n    }\n\n    /**\n     * Remove email fragment 'div' tag and replace newlines with 'br' tags\n     *\n     * @param input\n     * @return input\n     */\n    private static StringBuilder formatEmailFragments(final StringBuilder input) {\n        int emailStart = input.indexOf(EMAIL_START);\n        int breakAdvance = BREAK.length() - 1;\n        while (emailStart != -1) {\n            int startLength = EMAIL_START.length();\n            int emailEnd = input.indexOf(EMAIL_END, emailStart + startLength);\n            if (emailEnd == -1) {\n                break;\n            }\n\n            input.delete(emailEnd, emailEnd + EMAIL_END.length());\n            input.delete(emailStart, emailStart + startLength);\n\n            int fullEmail = emailEnd - startLength;\n            for (int i = emailStart; i < fullEmail; i++) {\n                if (input.charAt(i) == '\\n') {\n                    input.deleteCharAt(i);\n                    input.insert(i, BREAK);\n                    i += breakAdvance;\n                    fullEmail += breakAdvance;\n                }\n            }\n\n            emailStart = input.indexOf(EMAIL_START, fullEmail);\n        }\n        return input;\n    }\n\n    /**\n     * Remove leading and trailing whitespace\n     *\n     * @param input\n     */\n    private static StringBuilder trim(final StringBuilder input) {\n        int length = input.length();\n        int breakLength = BREAK.length();\n\n        while (length > 0) {\n            if (input.indexOf(BREAK) == 0) {\n                input.delete(0, breakLength);\n            } else if (length >= breakLength\n                    && input.lastIndexOf(BREAK) == length - breakLength) {\n                input.delete(length - breakLength, length);\n            } else if (Character.isWhitespace(input.charAt(0))) {\n                input.deleteCharAt(0);\n            } else if (Character.isWhitespace(input.charAt(length - 1))) {\n                input.deleteCharAt(length - 1);\n            } else {\n                break;\n            }\n            length = input.length();\n        }\n        return input;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/util/HttpImageGetter.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.util;\n\nimport android.content.Context;\nimport android.graphics.Bitmap;\nimport android.graphics.BitmapFactory;\nimport android.graphics.drawable.BitmapDrawable;\nimport android.graphics.drawable.Drawable;\nimport android.net.Uri;\nimport androidx.annotation.DimenRes;\nimport android.text.Html.ImageGetter;\nimport android.text.TextUtils;\nimport android.util.Base64;\nimport android.util.Log;\nimport android.widget.TextView;\n\nimport com.bugsnag.android.Bugsnag;\nimport com.github.pockethub.android.R;\nimport com.meisolsson.githubsdk.core.ServiceGenerator;\nimport com.meisolsson.githubsdk.model.Content;\nimport com.meisolsson.githubsdk.model.request.RequestMarkdown;\nimport com.meisolsson.githubsdk.service.misc.MarkdownService;\nimport com.meisolsson.githubsdk.service.repositories.RepositoryContentService;\nimport javax.inject.Inject;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\nimport io.reactivex.Single;\nimport io.reactivex.android.schedulers.AndroidSchedulers;\nimport io.reactivex.schedulers.Schedulers;\nimport okhttp3.OkHttpClient;\nimport okhttp3.Request;\nimport okhttp3.Response;\n\nimport static android.util.Base64.DEFAULT;\nimport static android.view.View.GONE;\nimport static android.view.View.VISIBLE;\nimport static java.lang.Integer.MAX_VALUE;\n\n/**\n * Getter for an image\n */\npublic class HttpImageGetter implements ImageGetter {\n\n    private static class LoadingImageGetter implements ImageGetter {\n\n        private final Drawable image;\n\n        private LoadingImageGetter(final Context context, @DimenRes final int size) {\n            int imageSize = context.getResources().getDimensionPixelSize(size);\n            image = context.getResources().getDrawable(\n                    R.drawable.image_loading_icon);\n            image.setBounds(0, 0, imageSize, imageSize);\n        }\n\n        @Override\n        public Drawable getDrawable(String source) {\n            return image;\n        }\n    }\n\n    private static boolean containsImages(final String html) {\n        return html.contains(\"<img\");\n    }\n\n    private static final String HOST_DEFAULT = \"github.com\";\n\n    private final LoadingImageGetter loading;\n\n    private final Context context;\n\n    private final File dir;\n\n    private final int width;\n\n    private final Map<Object, CharSequence> rawHtmlCache = new HashMap<>();\n\n    private final Map<Object, CharSequence> fullHtmlCache = new HashMap<>();\n\n    private final OkHttpClient okHttpClient;\n\n    /**\n     * Create image getter for context\n     *\n     * @param context\n     */\n    @Inject\n    public HttpImageGetter(Context context) {\n        this.context = context;\n        dir = context.getCacheDir();\n        width = ServiceUtils.getDisplayWidth(context);\n        loading = new LoadingImageGetter(context, R.dimen.image_loading_size);\n        okHttpClient = new OkHttpClient();\n    }\n\n    private HttpImageGetter show(final TextView view, final CharSequence html) {\n        if (TextUtils.isEmpty(html)) {\n            return hide(view);\n        }\n\n        view.setText(trim(html));\n        view.setVisibility(VISIBLE);\n        view.setTag(null);\n        return this;\n    }\n\n    private HttpImageGetter hide(final TextView view) {\n        view.setText(null);\n        view.setVisibility(GONE);\n        view.setTag(null);\n        return this;\n    }\n\n    //All comments end with \"\\n\\n\" removing 2 chars\n    private CharSequence trim(CharSequence val){\n        if(val.charAt(val.length()-1) == '\\n' && val.charAt(val.length()-2) == '\\n') {\n            val = val.subSequence(0, val.length() - 2);\n        }\n        return val;\n    }\n\n    /**\n     * Encode given HTML string and map it to the given id\n     *\n     * @param id\n     * @param html\n     * @return this image getter\n     */\n    public HttpImageGetter encode(final Object id, final String html) {\n        if (TextUtils.isEmpty(html)) {\n            return this;\n        }\n\n        CharSequence encoded = HtmlUtils.encode(html, loading);\n        // Use default encoding if no img tags\n        if (containsImages(html)) {\n            CharSequence currentEncoded = rawHtmlCache.put(id, encoded);\n            // Remove full html if raw html has changed\n            if (currentEncoded == null\n                    || !currentEncoded.toString().equals(encoded.toString())) {\n                fullHtmlCache.remove(id);\n            }\n        } else {\n            rawHtmlCache.remove(id);\n            fullHtmlCache.put(id, encoded);\n        }\n        return this;\n    }\n\n    /**\n     * Bind text view to HTML string\n     *\n     * @param view\n     * @param html\n     * @param id\n     * @return this image getter\n     */\n    public HttpImageGetter bind(final TextView view, final String html,\n            final Object id) {\n        if (TextUtils.isEmpty(html)) {\n            return hide(view);\n        }\n\n        CharSequence encoded = fullHtmlCache.get(id);\n        if (encoded != null) {\n            return show(view, encoded);\n        }\n\n        encoded = rawHtmlCache.get(id);\n        if (encoded == null) {\n            if (!html.matches(\"<[a-z][\\\\s\\\\S]*>\")) {\n                RequestMarkdown requestMarkdown = RequestMarkdown.builder()\n                        .text(html)\n                        .build();\n\n                ServiceGenerator.createService(context, MarkdownService.class)\n                        .renderMarkdown(requestMarkdown)\n                        .subscribeOn(Schedulers.io())\n                        .observeOn(AndroidSchedulers.mainThread())\n                        .subscribe(data -> continueBind(view, data.body(), id),\n                                e -> continueBind(view, html, id));\n            } else {\n                return continueBind(view, html, id);\n            }\n        }\n        return continueBind(view, html, id);\n    }\n\n    private HttpImageGetter continueBind(final TextView view, final String html, final Object id) {\n        CharSequence encoded = HtmlUtils.encode(html, loading);\n        if (containsImages(html)) {\n            rawHtmlCache.put(id, encoded);\n        } else {\n            rawHtmlCache.remove(id);\n            fullHtmlCache.put(id, encoded);\n            return show(view, encoded);\n        }\n\n        if (TextUtils.isEmpty(encoded)) {\n            return hide(view);\n        }\n\n        show(view, encoded);\n        view.setTag(id);\n        Single.just(html)\n                .subscribeOn(Schedulers.computation())\n                .map(htmlString -> HtmlUtils.encode(htmlString, this))\n                .observeOn(AndroidSchedulers.mainThread())\n                .subscribe(htmlCharSequence -> {\n                    fullHtmlCache.put(id, htmlCharSequence);\n                    if (id.equals(view.getTag())) {\n                        show(view, htmlCharSequence);\n                    }\n                });\n        return this;\n    }\n\n    /**\n     * Request an image using the contents API if the source URI is a path to a\n     * file already in the repository\n     *\n     * @param source\n     * @return\n     * @throws IOException\n     */\n    private Drawable requestRepositoryImage(final String source)\n            throws IOException {\n        if (TextUtils.isEmpty(source)) {\n            return null;\n        }\n\n        Uri uri = Uri.parse(source);\n        if (!HOST_DEFAULT.equals(uri.getHost())) {\n            return null;\n        }\n\n        List<String> segments = uri.getPathSegments();\n        if (segments.size() < 5) {\n            return null;\n        }\n\n        String prefix = segments.get(2);\n        // Two types of urls supported:\n        // github.com/github/android/raw/master/app/res/drawable-xhdpi/app_icon.png\n        // github.com/github/android/blob/master/app/res/drawable-xhdpi/app_icon.png?raw=true\n        if (!(\"raw\".equals(prefix) || (\"blob\".equals(prefix) && !TextUtils\n                .isEmpty(uri.getQueryParameter(\"raw\"))))) {\n            return null;\n        }\n\n        String owner = segments.get(0);\n        if (TextUtils.isEmpty(owner)) {\n            return null;\n        }\n        String name = segments.get(1);\n        if (TextUtils.isEmpty(name)) {\n            return null;\n        }\n        String branch = segments.get(3);\n        if (TextUtils.isEmpty(branch)) {\n            return null;\n        }\n\n        StringBuilder path = new StringBuilder(segments.get(4));\n        for (int i = 5; i < segments.size(); i++) {\n            String segment = segments.get(i);\n            if (!TextUtils.isEmpty(segment)) {\n                path.append('/').append(segment);\n            }\n        }\n\n        if (TextUtils.isEmpty(path)) {\n            return null;\n        }\n\n        Content contents = ServiceGenerator.createService(context, RepositoryContentService.class)\n                .getContents(owner, name, path.toString(), branch)\n                .blockingGet()\n                .body();\n\n        if (contents.content() != null) {\n            byte[] content = Base64.decode(contents.content(), DEFAULT);\n            Bitmap bitmap = ImageUtils.getBitmap(content, width, MAX_VALUE);\n            if (bitmap == null) {\n                return loading.getDrawable(source);\n            }\n            BitmapDrawable drawable = new BitmapDrawable(\n                    context.getResources(), bitmap);\n            drawable.setBounds(0, 0, bitmap.getWidth(), bitmap.getHeight());\n            return drawable;\n        } else {\n            return null;\n        }\n    }\n\n    @Override\n    public Drawable getDrawable(final String source) {\n        try {\n            Drawable repositoryImage = requestRepositoryImage(source);\n            if (repositoryImage != null) {\n                return repositoryImage;\n            }\n        } catch (Exception e) {\n            // Ignore and attempt request over regular HTTP request\n        }\n\n        try {\n            String logMessage = \"Loading image: \" + source;\n            Log.d(getClass().getSimpleName(), logMessage);\n            Bugsnag.leaveBreadcrumb(logMessage);\n\n            Request request = new Request.Builder()\n                    .get()\n                    .url(source)\n                    .build();\n\n            Response response = okHttpClient.newCall(request).execute();\n\n            if (!response.isSuccessful()) {\n                throw new IOException(\"Unexpected response code: \" + response.code());\n            }\n\n            Bitmap bitmap = BitmapFactory.decodeStream(response.body().byteStream());\n\n            if (bitmap == null) {\n                return loading.getDrawable(source);\n            }\n\n            BitmapDrawable drawable = new BitmapDrawable( context.getResources(), bitmap);\n            drawable.setBounds(0, 0, bitmap.getWidth(), bitmap.getHeight());\n            return drawable;\n        } catch (IOException e) {\n            Log.e(getClass().getSimpleName(), \"Error loading image\", e);\n            Bugsnag.notify(e);\n            return loading.getDrawable(source);\n        }\n    }\n\n    /**\n     * Remove Object from cache store.\n     * @param id\n     */\n    public void removeFromCache(final Object id) {\n        rawHtmlCache.remove(id);\n        fullHtmlCache.remove(id);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/util/ImageBinPoster.kt",
    "content": "package com.github.pockethub.android.util\n\nimport android.content.Context\nimport android.net.Uri\nimport io.reactivex.Single\nimport okhttp3.*\nimport okio.Okio\nimport java.io.IOException\n\nobject ImageBinPoster {\n\n    private val client = OkHttpClient()\n\n    /**\n     * Post the image to ImageBin\n     *\n     * @param context A context\n     * @param uri The content URI\n     * @return Single containing the network Response\n     */\n    @JvmStatic\n    fun post(context: Context, uri: Uri): Single<Response> {\n        var bytes: ByteArray? = null\n\n        try {\n            val stream = context.contentResolver.openInputStream(uri)\n            if (stream != null) {\n                val source = Okio.source(stream)\n                bytes = Okio.buffer(source).readByteArray()\n            }\n        } catch (e: IOException) {\n            return Single.error(e)\n        }\n\n        return post(bytes)\n    }\n\n    /**\n     * Post the image to ImageBin\n     *\n     * @param bytes Bytes of the image to post\n     * @return Single containing the network Response\n     */\n    @JvmStatic\n    fun post(bytes: ByteArray?): Single<Response> {\n        val requestBody = MultipartBody.Builder()\n                .setType(MultipartBody.FORM)\n                .addFormDataPart(\"file\", \"test\", RequestBody.create(MediaType.parse(\"image/*\"), bytes!!))\n                .build()\n\n        val request = Request.Builder()\n                .url(\"https://imagebin.ca/upload.php\")\n                .post(requestBody)\n                .build()\n\n        return Single.fromCallable { client.newCall(request).execute() }\n    }\n\n    @JvmStatic\n    fun getUrl(body: String): String? {\n        return body.split(\"\\n\").last { it.startsWith(\"url\") }.substringAfter(':')\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/util/ImageUtils.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.util;\n\nimport android.graphics.Bitmap;\nimport android.graphics.BitmapFactory;\nimport android.graphics.BitmapFactory.Options;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.graphics.Point;\nimport android.graphics.PorterDuffXfermode;\nimport android.graphics.RectF;\nimport android.util.Log;\nimport android.widget.ImageView;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.io.RandomAccessFile;\n\nimport static android.graphics.Bitmap.Config.ARGB_8888;\nimport static android.graphics.Color.WHITE;\nimport static android.graphics.PorterDuff.Mode.DST_IN;\n\n/**\n * Image utilities\n */\npublic class ImageUtils {\n\n    private static final String TAG = \"ImageUtils\";\n\n    /**\n     * Get a bitmap from the image path\n     *\n     * @param imagePath\n     * @return bitmap or null if read fails\n     */\n    public static Bitmap getBitmap(final String imagePath) {\n        return getBitmap(imagePath, 1);\n    }\n\n    /**\n     * Get a bitmap from the image path\n     *\n     * @param imagePath\n     * @param sampleSize\n     * @return bitmap or null if read fails\n     */\n    public static Bitmap getBitmap(final String imagePath, int sampleSize) {\n        final Options options = new Options();\n        options.inDither = false;\n        options.inSampleSize = sampleSize;\n\n        RandomAccessFile file = null;\n        try {\n            file = new RandomAccessFile(imagePath, \"r\");\n            return BitmapFactory.decodeFileDescriptor(file.getFD(), null,\n                    options);\n        } catch (IOException e) {\n            Log.d(TAG, e.getMessage(), e);\n            return null;\n        } finally {\n            if (file != null) {\n                try {\n                    file.close();\n                } catch (IOException e) {\n                    Log.d(TAG, e.getMessage(), e);\n                }\n            }\n        }\n    }\n\n    /**\n     * Get a bitmap from the image\n     *\n     * @param image\n     * @param sampleSize\n     * @return bitmap or null if read fails\n     */\n    public static Bitmap getBitmap(final byte[] image, int sampleSize) {\n        final Options options = new Options();\n        options.inDither = false;\n        options.inSampleSize = sampleSize;\n        return BitmapFactory.decodeByteArray(image, 0, image.length, options);\n    }\n\n    /**\n     * Get scale for image of size and max height/width\n     *\n     * @param size\n     * @param width\n     * @param height\n     * @return scale\n     */\n    public static int getScale(Point size, int width, int height) {\n        if (size.x > width || size.y > height) {\n            return Math.max(Math.round((float) size.y / (float) height),\n                    Math.round((float) size.x / (float) width));\n        } else {\n            return 1;\n        }\n    }\n\n    /**\n     * Get size of image\n     *\n     * @param imagePath\n     * @return size\n     */\n    public static Point getSize(final String imagePath) {\n        final Options options = new Options();\n        options.inJustDecodeBounds = true;\n\n        RandomAccessFile file = null;\n        try {\n            file = new RandomAccessFile(imagePath, \"r\");\n            BitmapFactory.decodeFileDescriptor(file.getFD(), null, options);\n            return new Point(options.outWidth, options.outHeight);\n        } catch (IOException e) {\n            Log.d(TAG, e.getMessage(), e);\n            return null;\n        } finally {\n            if (file != null) {\n                try {\n                    file.close();\n                } catch (IOException e) {\n                    Log.d(TAG, e.getMessage(), e);\n                }\n            }\n        }\n    }\n\n    /**\n     * Get size of image\n     *\n     * @param image\n     * @return size\n     */\n    public static Point getSize(final byte[] image) {\n        final Options options = new Options();\n        options.inJustDecodeBounds = true;\n        BitmapFactory.decodeByteArray(image, 0, image.length, options);\n        return new Point(options.outWidth, options.outHeight);\n    }\n\n    /**\n     * Get bitmap with maximum height or width\n     *\n     * @param imagePath\n     * @param width\n     * @param height\n     * @return image\n     */\n    public static Bitmap getBitmap(final String imagePath, int width, int height) {\n        Point size = getSize(imagePath);\n        return getBitmap(imagePath, getScale(size, width, height));\n    }\n\n    /**\n     * Get bitmap with maximum height or width\n     *\n     * @param image\n     * @param width\n     * @param height\n     * @return image\n     */\n    public static Bitmap getBitmap(final byte[] image, int width, int height) {\n        Point size = getSize(image);\n        return getBitmap(image, getScale(size, width, height));\n    }\n\n    /**\n     * Get bitmap with maximum height or width\n     *\n     * @param image\n     * @param width\n     * @param height\n     * @return image\n     */\n    public static Bitmap getBitmap(final File image, int width, int height) {\n        return getBitmap(image.getAbsolutePath(), width, height);\n    }\n\n    /**\n     * Get a bitmap from the image file\n     *\n     * @param image\n     * @return bitmap or null if read fails\n     */\n    public static Bitmap getBitmap(final File image) {\n        return getBitmap(image.getAbsolutePath());\n    }\n\n    /**\n     * Load a {@link Bitmap} from the given path and set it on the given\n     * {@link ImageView}\n     *\n     * @param imagePath\n     * @param view\n     */\n    public static void setImage(final String imagePath, final ImageView view) {\n        setImage(new File(imagePath), view);\n    }\n\n    /**\n     * Load a {@link Bitmap} from the given {@link File} and set it on the given\n     * {@link ImageView}\n     *\n     * @param image\n     * @param view\n     */\n    public static void setImage(final File image, final ImageView view) {\n        Bitmap bitmap = getBitmap(image);\n        if (bitmap != null) {\n            view.setImageBitmap(bitmap);\n        }\n    }\n\n    /**\n     * Round the corners of a {@link Bitmap}\n     *\n     * @param source\n     * @param radius\n     * @return rounded corner bitmap\n     */\n    public static Bitmap roundCorners(final Bitmap source, final float radius) {\n        int width = source.getWidth();\n        int height = source.getHeight();\n\n        Paint paint = new Paint();\n        paint.setAntiAlias(true);\n        paint.setColor(WHITE);\n\n        Bitmap clipped = Bitmap.createBitmap(width, height, ARGB_8888);\n        Canvas canvas = new Canvas(clipped);\n        canvas.drawRoundRect(new RectF(0, 0, width, height), radius, radius,\n                paint);\n        paint.setXfermode(new PorterDuffXfermode(DST_IN));\n\n        Bitmap rounded = Bitmap.createBitmap(width, height, ARGB_8888);\n        canvas = new Canvas(rounded);\n        canvas.drawBitmap(source, 0, 0, null);\n        canvas.drawBitmap(clipped, 0, 0, paint);\n\n        source.recycle();\n        clipped.recycle();\n\n        return rounded;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/util/InfoUtils.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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\npackage com.github.pockethub.android.util;\n\nimport com.meisolsson.githubsdk.model.Repository;\nimport com.meisolsson.githubsdk.model.User;\n\npublic class InfoUtils {\n\n    public static Repository createRepoFromUrl(String url) {\n        if (url == null || url.length() == 0) {\n            return null;\n        }\n        String owner = null;\n        String name = null;\n        for (String segment : url.split(\"/\")) //$NON-NLS-1$\n        {\n            if (segment.length() > 0) {\n                if (owner == null) {\n                    owner = segment;\n                } else if (name == null) {\n                    name = segment;\n                } else {\n                    break;\n                }\n            }\n        }\n\n        if (owner != null && owner.length() > 0 && name != null && name.length() > 0) {\n            return createRepoFromData(owner, name);\n        } else {\n            return null;\n        }\n    }\n\n    public static String createRepoId(Repository repo) {\n        if(repo.name().contains(\"/\")) {\n            return repo.name();\n        } else {\n            return createRepoId(repo.owner().login(), repo.name());\n        }\n    }\n\n    public static String createRepoId(String owner, String name) {\n        return owner + \"/\" + name;\n    }\n\n    public static Repository createRepoFromData(String repoOwner, String repoName) {\n        User user = User.builder().login(repoOwner).build();\n        return Repository.builder().owner(user).name(repoName).build();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/util/MarkdownLoader.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.util;\n\nimport android.content.Context;\nimport android.text.Html.ImageGetter;\n\nimport com.meisolsson.githubsdk.core.ServiceGenerator;\nimport com.meisolsson.githubsdk.model.Repository;\nimport com.github.pockethub.android.util.HtmlUtils;\nimport com.meisolsson.githubsdk.model.request.RequestMarkdown;\nimport com.meisolsson.githubsdk.service.misc.MarkdownService;\n\nimport io.reactivex.Single;\nimport retrofit2.Response;\n\n/**\n * Markdown loader.\n */\npublic class MarkdownLoader {\n\n    /**\n     * Fetches html\n     * @param context\n     * @param raw\n     * @param repository\n     * @param imageGetter\n     * @param encode\n     * @return\n     */\n    public static Single<CharSequence> load(Context context, String raw, Repository repository,\n                              ImageGetter imageGetter, boolean encode) {\n        RequestMarkdown markdown = RequestMarkdown.builder()\n                .mode(RequestMarkdown.MODE_GFM)\n                .text(raw)\n                .context(repository != null ? String.format(\"%s/%s\", repository.owner().login(), repository.name()) : null)\n                .build();\n\n        return ServiceGenerator.createService(context, MarkdownService.class)\n                .renderMarkdown(markdown)\n                .map(Response::body)\n                .map(html -> encode ? HtmlUtils.encode(html, imageGetter) : html);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/util/MarkdownUtils.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.util;\n\nimport android.text.TextUtils;\n\nimport static java.util.Locale.US;\n\n/**\n * Utilities for dealing with Markdown files\n */\npublic class MarkdownUtils {\n\n  private static final String[] MARKDOWN_EXTENSIONS = { \".md\", \".mkdn\",\n          \".mdwn\", \".mdown\", \".markdown\", \".mkd\", \".mkdown\", \".ron\" };\n\n  /**\n   * Is the the given file name a Markdown file?\n   *\n   * @param name\n   * @return true if the name has a markdown extension, false otherwise\n   */\n  public static boolean isMarkdown(String name) {\n      if (TextUtils.isEmpty(name)) {\n          return false;\n      }\n\n      name = name.toLowerCase(US);\n      for (String extension : MARKDOWN_EXTENSIONS) {\n          if (name.endsWith(extension)) {\n              return true;\n          }\n      }\n\n      return false;\n  }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/util/PermissionsUtils.java",
    "content": "package com.github.pockethub.android.util;\n\nimport android.app.Activity;\nimport androidx.annotation.StringRes;\nimport androidx.core.app.ActivityCompat;\nimport androidx.fragment.app.Fragment;\n\nimport com.afollestad.materialdialogs.MaterialDialog;\n\n/**\n * Created by savio on 2017-01-08.\n */\npublic class PermissionsUtils {\n\n    public static void askForPermission(final Activity activity, final int requestCode,\n                                        final String permission, @StringRes final int askTitle,\n                                        @StringRes final int askContent) {\n\n        if (ActivityCompat.shouldShowRequestPermissionRationale(activity, permission)) {\n            MaterialDialog.Builder builder = new MaterialDialog.Builder(activity)\n                    .title(askTitle)\n                    .content(askContent)\n                    .positiveText(android.R.string.yes)\n                    .negativeText(android.R.string.no)\n                    .onPositive((dialog, which) ->\n                            ActivityCompat.requestPermissions(activity,\n                                    new String[]{permission}, requestCode));\n\n            builder.show();\n        } else {\n            ActivityCompat.requestPermissions(activity, new String[]{permission}, requestCode);\n        }\n    }\n\n    public static void askForPermission(final Fragment fragment, final int requestCode,\n                                        final String permission, @StringRes final int askTitle,\n                                        @StringRes final int askContent) {\n\n        if (fragment.shouldShowRequestPermissionRationale(permission)) {\n            MaterialDialog.Builder builder = new MaterialDialog.Builder(fragment.getActivity())\n                    .title(askTitle)\n                    .content(askContent)\n                    .positiveText(android.R.string.yes)\n                    .negativeText(android.R.string.no)\n                    .onPositive((dialog, which) ->\n                            fragment.requestPermissions(new String[]{permission}, requestCode));\n\n            builder.show();\n        } else {\n            fragment.requestPermissions(new String[]{permission}, requestCode);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/util/PreferenceUtils.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.util;\n\nimport android.content.Context;\nimport android.content.SharedPreferences;\n\nimport static android.content.Context.MODE_PRIVATE;\n\n/**\n * Utility class for working with {@link SharedPreferences}\n */\npublic class PreferenceUtils {\n\n    /**\n     * Preference to wrap lines of code\n     */\n    public static final String WRAP = \"wrap\";\n\n    /**\n     * Preference to render markdown\n     */\n    public static final String RENDER_MARKDOWN = \"renderMarkdown\";\n\n    /**\n     * Get code browsing preferences\n     *\n     * @param context\n     * @return preferences\n     */\n    public static SharedPreferences getCodePreferences(final Context context) {\n        return context.getSharedPreferences(\"code\", MODE_PRIVATE);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/util/RxPageUtil.java",
    "content": "package com.github.pockethub.android.util;\n\nimport com.github.pockethub.android.core.GitHubRequest;\nimport com.meisolsson.githubsdk.model.Page;\n\nimport io.reactivex.Observable;\nimport io.reactivex.android.schedulers.AndroidSchedulers;\nimport io.reactivex.schedulers.Schedulers;\nimport retrofit2.Response;\n\npublic class RxPageUtil {\n\n    public static  <B> Observable<Page<B>> getAllPages(\n            GitHubRequest<Response<Page<B>>> pagedSingleCall, int i) {\n\n        return pagedSingleCall.execute(i)\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .flatMapObservable(response -> {\n                    Page<B> page = response.body();\n                    if (page.next() == null) {\n                        return Observable.just(page);\n                    }\n\n                    return Observable.just(page)\n                            .concatWith(getAllPages(pagedSingleCall, page.next()));\n\n                });\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/util/ServiceUtils.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.util;\n\nimport android.content.Context;\nimport android.content.res.Resources;\nimport android.util.TypedValue;\nimport android.view.Display;\nimport android.view.View;\nimport android.view.WindowManager;\n\nimport static android.content.Context.WINDOW_SERVICE;\nimport static android.util.TypedValue.COMPLEX_UNIT_DIP;\n\n/**\n * Helpers for dealing with system services\n */\npublic class ServiceUtils {\n\n    /**\n     * Get default display\n     *\n     * @param context\n     * @return display\n     */\n    public static Display getDisplay(final Context context) {\n        return ((WindowManager) context.getSystemService(WINDOW_SERVICE))\n                .getDefaultDisplay();\n    }\n\n    /**\n     * Get default display\n     *\n     * @param view\n     * @return display\n     */\n    public static Display getDisplay(final View view) {\n        return getDisplay(view.getContext());\n    }\n\n    /**\n     * Get default display width\n     *\n     * @param context\n     * @return display\n     */\n    public static int getDisplayWidth(final Context context) {\n        return getDisplay(context).getWidth();\n    }\n\n    /**\n     * Get default display width\n     *\n     * @param view\n     * @return display\n     */\n    public static int getDisplayWidth(final View view) {\n        return getDisplayWidth(view.getContext());\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/util/ShareUtils.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.util;\n\nimport android.content.Intent;\nimport android.text.TextUtils;\n\nimport static android.content.Intent.ACTION_SEND;\nimport static android.content.Intent.EXTRA_SUBJECT;\nimport static android.content.Intent.EXTRA_TEXT;\n\n/**\n * Utilities for creating a share intent\n */\npublic class ShareUtils {\n\n    /**\n     * Create intent with subject and body\n     *\n     * @param subject\n     * @param body\n     * @return intent\n     */\n    public static Intent create(final CharSequence subject,\n            final CharSequence body) {\n        Intent intent = new Intent(ACTION_SEND);\n        intent.setType(\"text/plain\");\n        if (!TextUtils.isEmpty(subject)) {\n            intent.putExtra(EXTRA_SUBJECT, subject);\n        }\n        intent.putExtra(EXTRA_TEXT, body);\n        return intent;\n    }\n\n    /**\n     * Get body from intent\n     *\n     * @param intent\n     * @return body\n     */\n    public static String getBody(final Intent intent) {\n        return intent != null ? intent.getStringExtra(EXTRA_TEXT) : null;\n    }\n\n    /**\n     * Get subject from intent\n     *\n     * @param intent\n     * @return subject\n     */\n    public static String getSubject(final Intent intent) {\n        return intent != null ? intent.getStringExtra(EXTRA_SUBJECT) : null;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/util/SourceEditor.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.util;\n\nimport android.net.Uri;\nimport android.os.Build;\nimport android.text.TextUtils;\nimport android.util.Base64;\nimport android.webkit.JavascriptInterface;\nimport android.webkit.WebSettings;\nimport android.webkit.WebView;\nimport android.webkit.WebViewClient;\n\nimport com.github.pockethub.android.ui.user.UriLauncherActivity;\nimport com.meisolsson.githubsdk.model.git.GitBlob;\n\nimport java.io.UnsupportedEncodingException;\n\n/**\n * Utilities for displaying source code in a {@link WebView}\n */\npublic class SourceEditor {\n\n    private static final String URL_PAGE = \"file:///android_asset/source-editor.html\";\n    private static final String ENCODING_BASE64 = \"base64\";\n\n    private final WebView view;\n\n    private boolean wrap;\n\n    private String name;\n\n    private String content;\n\n    private boolean encoded;\n\n    private boolean markdown;\n\n    /**\n     * Create source editor using given web view\n     *\n     * @param view\n     */\n    public SourceEditor(final WebView view) {\n        WebViewClient client = new WebViewClient() {\n\n            @Override\n            public boolean shouldOverrideUrlLoading(WebView view, String url) {\n                if (URL_PAGE.equals(url)) {\n                    view.loadUrl(url);\n                    return false;\n                } else {\n                    UriLauncherActivity.launchUri(view.getContext(), Uri.parse(url));\n                    return true;\n                }\n            }\n        };\n        view.setWebViewClient(client);\n\n        WebSettings settings = view.getSettings();\n        settings.setJavaScriptEnabled(true);\n        view.addJavascriptInterface(this, \"SourceEditor\");\n\n        this.view = view;\n    }\n\n    /**\n     * @return name\n     */\n    @JavascriptInterface\n    public String getName() {\n        return name;\n    }\n\n    /**\n     * @return content\n     */\n    @JavascriptInterface\n    public String getRawContent() {\n        return content;\n    }\n\n    /**\n     * @return content\n     */\n    @JavascriptInterface\n    public String getContent() {\n        if (encoded) {\n            try {\n                return new String(Base64.decode(content, Base64.DEFAULT), \"UTF-8\");\n            } catch (UnsupportedEncodingException e) {\n                return getRawContent();\n            }\n        } else {\n            return getRawContent();\n        }\n    }\n\n    /**\n     * @return wrap\n     */\n    @JavascriptInterface\n    public boolean getWrap() {\n        return wrap;\n    }\n\n    /**\n     * @return markdown\n     */\n    public boolean isMarkdown() {\n        return markdown;\n    }\n\n    /**\n     * Set whether lines should wrap\n     *\n     * @param wrap\n     * @return this editor\n     */\n    public SourceEditor setWrap(final boolean wrap) {\n        this.wrap = wrap;\n        loadSource();\n        return this;\n    }\n\n    /**\n     * Sets whether the content is a markdown file\n     *\n     * @param markdown\n     * @return this editor\n     */\n    public SourceEditor setMarkdown(final boolean markdown) {\n        this.markdown = markdown;\n        return this;\n    }\n\n    /**\n     * Bind content to current {@link WebView}\n     *\n     * @param name\n     * @param content\n     * @param encoded\n     * @return this editor\n     */\n    public SourceEditor setSource(final String name, final String content, final boolean encoded) {\n        this.name = name;\n        this.content = content;\n        this.encoded = encoded;\n        loadSource();\n\n        return this;\n    }\n\n    private void loadSource() {\n        if (name != null && content != null) {\n            if (markdown) {\n                view.loadDataWithBaseURL(null, content, \"text/html\", \"UTF-8\", null);\n            } else {\n                view.loadUrl(URL_PAGE);\n            }\n        }\n    }\n\n    /**\n     * Bind blob content to current {@link WebView}\n     *\n     * @param name\n     * @param blob\n     * @return this editor\n     */\n    public SourceEditor setSource(final String name, final GitBlob blob) {\n        String content = blob.content();\n        if (content == null) {\n            content = \"\";\n        }\n        boolean encoded = !TextUtils.isEmpty(content) && ENCODING_BASE64.equals(blob.encoding());\n        return setSource(name, content, encoded);\n    }\n\n    /**\n     * Toggle line wrap\n     *\n     * @return this editor\n     */\n    public SourceEditor toggleWrap() {\n        return setWrap(!wrap);\n    }\n\n    /**\n     * Toggle markdown file rendering\n     *\n     * @return this editor\n     */\n    public SourceEditor toggleMarkdown() {\n        return setMarkdown(!markdown);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/util/TimeUtils.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.util;\n\nimport android.text.format.DateUtils;\n\nimport java.util.Date;\nimport java.util.concurrent.TimeUnit;\n\nimport static android.text.format.DateUtils.FORMAT_NUMERIC_DATE;\nimport static android.text.format.DateUtils.FORMAT_SHOW_DATE;\nimport static android.text.format.DateUtils.FORMAT_SHOW_YEAR;\nimport static android.text.format.DateUtils.MINUTE_IN_MILLIS;\n\n/**\n * Utilities for dealing with dates and times\n */\npublic class TimeUtils {\n\n    /**\n     * Get relative time for date\n     *\n     * @param date\n     * @return relative time\n     */\n    public static CharSequence getRelativeTime(final Date date) {\n        long now = System.currentTimeMillis();\n        if (Math.abs(now - date.getTime()) > TimeUnit.MINUTES.toMillis(1)) {\n            return DateUtils.getRelativeTimeSpanString(date.getTime(), now,\n                    MINUTE_IN_MILLIS, FORMAT_SHOW_DATE | FORMAT_SHOW_YEAR\n                            | FORMAT_NUMERIC_DATE);\n        } else {\n            return \"just now\";\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/util/ToastUtils.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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 */\npackage com.github.pockethub.android.util;\n\nimport android.app.Activity;\nimport android.widget.Toast;\n\n/**\n * Utilities for displaying toast notifications\n */\npublic class ToastUtils {\n\n    /**\n     * Show the given message in a {@link Toast}\n     * <p>\n     * This method may be called from any thread\n     *\n     * @param activity\n     * @param message\n     */\n    public static void show(final Activity activity, final String message) {\n        Toast.makeText(activity, message, Toast.LENGTH_LONG).show();\n    }\n\n    /**\n     * Show the message with the given resource id in a {@link Toast}\n     * <p>\n     * This method may be called from any thread\n     *\n     * @param activity\n     * @param resId\n     */\n    public static void show(final Activity activity, final int resId) {\n        if (activity == null) {\n            return;\n        }\n\n        show(activity, activity.getString(resId));\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/github/pockethub/android/util/android/text/SpannableStringBuilder.kt",
    "content": "package com.github.pockethub.android.util.android.text\n\nimport android.text.SpannableStringBuilder\nimport android.text.TextPaint\nimport android.text.style.ClickableSpan\nimport android.text.style.TypefaceSpan\nimport android.view.View\nimport androidx.core.text.inSpans\nimport com.github.pockethub.android.util.TimeUtils\nimport java.util.*\n\nfun SpannableStringBuilder.monospace(builderAction: SpannableStringBuilder.() -> Unit) {\n    inSpans(TypefaceSpan(\"monospace\"), builderAction = builderAction)\n}\n\nfun SpannableStringBuilder.clickable(\n    onClick: (View) -> Unit,\n    builderAction: SpannableStringBuilder.() -> Unit\n) = inSpans(object : ClickableSpan() {\n    override fun onClick(widget: View) {\n        onClick(widget)\n    }\n\n    override fun updateDrawState(ds: TextPaint) {\n        super.updateDrawState(ds)\n        ds.isUnderlineText = false\n    }\n}, builderAction = builderAction)\n\nfun SpannableStringBuilder.append(date: Date) {\n    val time = TimeUtils.getRelativeTime(date)\n    // Un-capitalize time string if there is already a prefix.\n    // So you get \"opened in 5 days\" instead of \"opened In 5 days\".\n    val timeLength = time.length\n    if (length > 0 && timeLength > 0 && Character.isUpperCase(time[0])) {\n        append(time.subSequence(0, 1).toString().toLowerCase(Locale.getDefault()))\n        append(time.subSequence(1, timeLength))\n    } else {\n        append(time)\n    }\n}\n"
  },
  {
    "path": "app/src/main/res/color/color_navigation_view_icon.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     http://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:color=\"@color/appcompat_secondary_text_disabled_material_light\" android:state_enabled=\"false\"/>\n    <item android:color=\"@android:color/black\" android:state_checked=\"true\"/>\n    <item android:color=\"@color/appcompat_secondary_text_default_material_light\"/>\n</selector>\n"
  },
  {
    "path": "app/src/main/res/drawable/actionbar_spinner.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n  <item>\n    <rotate\n      android:drawable=\"@drawable/ic_refresh_white_24dp\"\n      android:fromDegrees=\"0\"\n      android:interpolator=\"@android:anim/linear_interpolator\"\n      android:pivotX=\"50%\"\n      android:pivotY=\"50%\"\n      android:toDegrees=\"360\" />\n  </item>\n\n</layer-list>\n"
  },
  {
    "path": "app/src/main/res/drawable/diff_add_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item android:drawable=\"@color/background_selected\" android:state_pressed=\"true\"/>\n    <item android:drawable=\"@color/diff_add\"/>\n\n</selector>\n"
  },
  {
    "path": "app/src/main/res/drawable/diff_marker_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item android:drawable=\"@color/background_selected\" android:state_pressed=\"true\"/>\n    <item android:drawable=\"@color/diff_marker_bg\"/>\n\n</selector>\n"
  },
  {
    "path": "app/src/main/res/drawable/diff_remove_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item android:drawable=\"@color/background_selected\" android:state_pressed=\"true\"/>\n    <item android:drawable=\"@color/diff_remove\"/>\n\n</selector>\n"
  },
  {
    "path": "app/src/main/res/drawable/edit_text_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <item>\n        <shape>\n            <solid android:color=\"@color/edit_text_outer\" />\n\n            <corners android:radius=\"2dp\" />\n        </shape>\n    </item>\n    <item\n        android:bottom=\"1dp\"\n        android:left=\"1dp\"\n        android:right=\"1dp\"\n        android:top=\"1dp\">\n        <shape>\n            <solid android:color=\"@color/edit_text_inner\" />\n\n            <corners android:radius=\"1dp\" />\n        </shape>\n    </item>\n    <item\n        android:bottom=\"2dp\"\n        android:left=\"2dp\"\n        android:right=\"2dp\"\n        android:top=\"2dp\">\n        <shape>\n            <solid android:color=\"@color/edit_text_background\" />\n\n            <corners android:radius=\"1dp\" />\n        </shape>\n    </item>\n\n</layer-list>\n"
  },
  {
    "path": "app/src/main/res/drawable/edit_text_cursor.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"rectangle\" >\n\n    <size android:width=\"1dp\" />\n\n    <solid android:color=\"@color/edit_text_cursor\" />\n\n</shape>\n"
  },
  {
    "path": "app/src/main/res/drawable/footer_selector.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item android:drawable=\"@color/footer_pressed\" android:state_pressed=\"true\"/>\n    <item android:drawable=\"@color/footer\"/>\n\n</selector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_add_a_photo.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=\"#FFFFFFFF\"\n        android:pathData=\"M3,4L3,1h2v3h3v2L5,6v3L3,9L3,6L0,6L0,4h3zM6,10L6,7h3L9,4h7l1.83,2L21,6c1.1,0 2,0.9 2,2v12c0,1.1 -0.9,2 -2,2L5,22c-1.1,0 -2,-0.9 -2,-2L3,10h3zM13,19c2.76,0 5,-2.24 5,-5s-2.24,-5 -5,-5 -5,2.24 -5,5 2.24,5 5,5zM9.8,14c0,1.77 1.43,3.2 3.2,3.2s3.2,-1.43 3.2,-3.2 -1.43,-3.2 -3.2,-3.2 -3.2,1.43 -3.2,3.2z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_notifications_black.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=\"M12,22c1.1,0 2,-0.9 2,-2h-4c0,1.1 0.89,2 2,2zM18,16v-5c0,-3.07 -1.64,-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.63,5.36 6,7.92 6,11v5l-2,2v1h16v-1l-2,-2z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_search_white_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=\"#FFFFFFFF\"\n        android:pathData=\"M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/inset_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <item>\n        <shape>\n            <solid android:color=\"@color/inset_outer\" />\n\n            <corners android:radius=\"2dp\" />\n        </shape>\n    </item>\n    <item\n        android:bottom=\"1dp\"\n        android:left=\"1dp\"\n        android:right=\"1dp\"\n        android:top=\"1dp\">\n        <shape>\n            <solid android:color=\"@color/inset_inner\" />\n\n            <corners android:radius=\"1dp\" />\n        </shape>\n    </item>\n    <item\n        android:bottom=\"2dp\"\n        android:left=\"2dp\"\n        android:right=\"2dp\"\n        android:top=\"2dp\">\n        <shape>\n            <solid android:color=\"@color/inset_background\" />\n\n            <corners android:radius=\"1dp\" />\n        </shape>\n    </item>\n\n</layer-list>\n"
  },
  {
    "path": "app/src/main/res/drawable/label_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <item android:id=\"@+id/item_outer_layer\">\n        <layer-list>\n            <item android:id=\"@+id/item_outer\">\n                <shape>\n                    <corners android:radius=\"2dp\" />\n                </shape>\n            </item>\n            <item>\n                <shape>\n                    <solid android:color=\"@color/label_outer\" />\n\n                    <corners android:radius=\"2dp\" />\n                </shape>\n            </item>\n        </layer-list>\n    </item>\n    <item\n        android:id=\"@+id/item_inner_layer\"\n        android:bottom=\"1dp\"\n        android:left=\"1dp\"\n        android:right=\"1dp\"\n        android:top=\"1dp\">\n        <layer-list>\n            <item android:id=\"@+id/item_inner\">\n                <shape>\n                    <corners android:radius=\"1dp\" />\n                </shape>\n            </item>\n            <item>\n                <shape>\n                    <solid android:color=\"@color/label_inner\" />\n\n                    <corners android:radius=\"1dp\" />\n                </shape>\n            </item>\n        </layer-list>\n    </item>\n    <item\n        android:id=\"@+id/item_bg\"\n        android:bottom=\"2dp\"\n        android:left=\"2dp\"\n        android:right=\"2dp\"\n        android:top=\"2dp\">\n        <shape>\n            <corners android:radius=\"1dp\" />\n        </shape>\n    </item>\n\n</layer-list>\n"
  },
  {
    "path": "app/src/main/res/drawable/list_divider_5dp.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n       android:shape=\"rectangle\">\n\n    <size android:height=\"5dp\"/>\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/list_item_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item android:drawable=\"@color/background_selected\" android:state_pressed=\"true\"/>\n    <item android:drawable=\"@color/background\"/>\n\n</selector>\n"
  },
  {
    "path": "app/src/main/res/drawable/milestone_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <item>\n        <shape>\n            <corners android:radius=\"2dp\" />\n\n            <solid android:color=\"@color/milestone_border\" />\n        </shape>\n    </item>\n    <item\n        android:bottom=\"1dp\"\n        android:left=\"1dp\"\n        android:right=\"1dp\"\n        android:top=\"1dp\">\n        <shape>\n            <gradient\n                android:angle=\"270\"\n                android:endColor=\"@color/milestone_opened_end\"\n                android:startColor=\"@color/milestone_opened_start\" />\n\n            <corners android:radius=\"1dp\" />\n        </shape>\n    </item>\n\n</layer-list>\n"
  },
  {
    "path": "app/src/main/res/drawable/milestone_closed_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<shape xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <gradient\n        android:angle=\"270\"\n        android:endColor=\"@color/milestone_closed_end\"\n        android:startColor=\"@color/milestone_closed_start\" />\n\n    <corners android:radius=\"1dp\" />\n\n</shape>\n"
  },
  {
    "path": "app/src/main/res/drawable/section_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <item>\n        <shape>\n            <solid android:color=\"@color/section_border\" />\n        </shape>\n    </item>\n    <item\n        android:bottom=\"1dp\"\n        android:top=\"1dp\">\n        <shape>\n            <gradient\n                android:angle=\"270\"\n                android:endColor=\"@color/section_end\"\n                android:startColor=\"@color/section_start\" />\n        </shape>\n    </item>\n\n</layer-list>\n"
  },
  {
    "path": "app/src/main/res/drawable/section_selected_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <item>\n        <shape>\n            <solid android:color=\"@color/section_border\" />\n        </shape>\n    </item>\n    <item\n        android:bottom=\"1dp\"\n        android:top=\"1dp\">\n        <shape>\n            <gradient\n                android:angle=\"270\"\n                android:endColor=\"@color/section_start\"\n                android:startColor=\"@color/section_end\" />\n        </shape>\n    </item>\n\n</layer-list>\n"
  },
  {
    "path": "app/src/main/res/drawable/section_selector.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item android:drawable=\"@drawable/section_selected_background\" android:state_pressed=\"true\"/>\n    <item android:drawable=\"@drawable/section_background\"/>\n\n</selector>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_commit_file_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Copyright (c) 2015 PocketHub\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     http://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <androidx.appcompat.widget.Toolbar\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:theme=\"@style/ToolbarTheme\"\n        android:minHeight=\"?attr/actionBarSize\"\n        android:background=\"?attr/colorPrimary\"\n        android:layout_alignParentTop=\"true\"\n        android:id=\"@+id/toolbar\" />\n\n    <WebView\n        android:id=\"@+id/wv_code\"\n        android:layout_below=\"@id/toolbar\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:visibility=\"gone\" />\n\n    <ProgressBar\n        android:id=\"@+id/pb_loading\"\n        style=\"@style/ListSpinner\"\n        android:layout_centerInParent=\"true\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_gist_create.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Copyright (c) 2015 PocketHub\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<androidx.coordinatorlayout.widget.CoordinatorLayout\n    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:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <com.google.android.material.appbar.AppBarLayout\n        android:id=\"@+id/appbar\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:theme=\"@style/ToolbarTheme\" >\n\n        <com.google.android.material.appbar.CollapsingToolbarLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:layout_scrollFlags=\"scroll|exitUntilCollapsed|snap\"\n            app:titleEnabled=\"false\"\n            app:toolbarId=\"@+id/toolbar\">\n\n            <LinearLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"?attr/actionBarSize\"\n                android:orientation=\"vertical\"\n                android:paddingLeft=\"@dimen/activity_content_padding\"\n                android:paddingRight=\"@dimen/activity_content_padding\"\n                app:layout_collapseMode=\"parallax\">\n\n                <com.google.android.material.textfield.TextInputLayout\n                    style=\"@style/InputTextLayout\">\n\n                    <EditText\n                        android:id=\"@+id/et_gist_description\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:hint=\"@string/description\"\n                        android:inputType=\"textCapSentences|textMultiLine\"\n                        android:maxLines=\"3\"\n                        android:nextFocusDown=\"@+id/et_gist_name\"\n                        android:nextFocusForward=\"@+id/et_gist_name\" />\n                </com.google.android.material.textfield.TextInputLayout>\n\n                <com.google.android.material.textfield.TextInputLayout\n                    style=\"@style/InputTextLayout\">\n\n                    <EditText\n                        android:id=\"@+id/et_gist_name\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:hint=\"@string/file_name\"\n                        android:inputType=\"textNoSuggestions|textUri\"\n                        android:nextFocusDown=\"@+id/cb_public\"\n                        android:nextFocusForward=\"@+id/cb_public\"\n                        android:nextFocusUp=\"@id/et_gist_description\"\n                        android:singleLine=\"true\" />\n                </com.google.android.material.textfield.TextInputLayout>\n\n                <CheckBox\n                    android:id=\"@+id/cb_public\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginBottom=\"8dp\"\n                    android:layout_marginTop=\"8dp\"\n                    android:minHeight=\"@dimen/touch_target\"\n                    android:nextFocusDown=\"@+id/et_gist_content\"\n                    android:nextFocusForward=\"@+id/et_gist_content\"\n                    android:nextFocusUp=\"@id/et_gist_name\"\n                    android:text=\"@string/make_public\" />\n            </LinearLayout>\n\n            <androidx.appcompat.widget.Toolbar\n                android:id=\"@+id/toolbar\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"?attr/actionBarSize\"\n                android:background=\"?attr/colorPrimary\"\n                app:layout_collapseMode=\"pin\"/>\n        </com.google.android.material.appbar.CollapsingToolbarLayout>\n    </com.google.android.material.appbar.AppBarLayout>\n\n    <androidx.core.widget.NestedScrollView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        app:layout_behavior=\"@string/appbar_scrolling_view_behavior\">\n\n        <EditText\n            android:id=\"@+id/et_gist_content\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:background=\"@android:color/transparent\"\n            android:elegantTextHeight=\"true\"\n            android:fitsSystemWindows=\"false\"\n            android:hint=\"@string/file_content\"\n            android:imeOptions=\"actionDone\"\n            android:inputType=\"textLongMessage|text|textMultiLine\"\n            android:nextFocusUp=\"@id/cb_public\"\n            android:padding=\"@dimen/activity_content_padding\"\n            android:scrollHorizontally=\"true\"\n            android:singleLine=\"false\"\n            android:typeface=\"monospace\"\n            tools:text=\"A very very very very very very very very very very very very very very very long line\">\n\n            <requestFocus/>\n        </EditText>\n\n    </androidx.core.widget.NestedScrollView>\n\n</androidx.coordinatorlayout.widget.CoordinatorLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_issue_edit.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Copyright (c) 2015 PocketHub\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<androidx.coordinatorlayout.widget.CoordinatorLayout\n    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\n    <com.google.android.material.appbar.AppBarLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:theme=\"@style/ToolbarTheme\">\n\n        <androidx.appcompat.widget.Toolbar\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:minHeight=\"?attr/actionBarSize\"\n            android:background=\"?attr/colorPrimary\"\n            android:layout_alignParentTop=\"true\"\n            android:id=\"@+id/toolbar\" />\n\n    </com.google.android.material.appbar.AppBarLayout>\n\n    <androidx.core.widget.NestedScrollView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        app:layout_behavior=\"@string/appbar_scrolling_view_behavior\"\n        >\n        <RelativeLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\">\n            <ProgressBar\n                android:layout_marginTop=\"10dp\"\n                android:id=\"@+id/pb_loading\"\n                style=\"@style/Spinner\"\n                android:layout_centerInParent=\"true\"\n                android:layout_width=\"64dp\"\n                android:layout_height=\"64dp\" />\n            <LinearLayout\n                android:id=\"@+id/sv_issue_content\"\n                android:visibility=\"gone\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"vertical\"\n                android:padding=\"10dp\">\n\n                <TextView\n                    style=\"@style/HeaderTitleText\"\n                    android:text=\"@string/title\" />\n\n                <EditText\n                    android:id=\"@+id/et_issue_title\"\n                    style=\"@style/FormalSingleLineEditText\"\n                    android:layout_width=\"match_parent\" />\n\n                <TextView\n                    android:id=\"@+id/tv_labels_label\"\n                    style=\"@style/HeaderTitleText\"\n                    android:paddingTop=\"5dp\"\n                    android:text=\"@string/labels\"\n                    android:visibility=\"gone\" />\n\n                <LinearLayout\n                    android:id=\"@+id/ll_labels\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:background=\"@drawable/inset_background\"\n                    android:gravity=\"center_vertical\"\n                    android:orientation=\"horizontal\"\n                    android:padding=\"10dp\"\n                    android:visibility=\"gone\">\n\n                    <TextView\n                        android:id=\"@+id/tv_labels\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:textColor=\"@color/text\" />\n                </LinearLayout>\n\n                <TextView\n                    android:id=\"@+id/tv_assignee_label\"\n                    style=\"@style/HeaderTitleText\"\n                    android:paddingTop=\"5dp\"\n                    android:text=\"@string/assignee\"\n                    android:visibility=\"gone\" />\n\n                <LinearLayout\n                    android:id=\"@+id/ll_assignee\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:background=\"@drawable/inset_background\"\n                    android:gravity=\"center_vertical\"\n                    android:orientation=\"horizontal\"\n                    android:padding=\"10dp\"\n                    android:visibility=\"gone\">\n\n                    <ImageView\n                        android:id=\"@+id/iv_assignee_avatar\"\n                        style=\"@style/AvatarMedium\"\n                        android:layout_marginEnd=\"5dp\"\n                        android:contentDescription=\"@string/avatar\" />\n\n                    <TextView\n                        android:id=\"@+id/tv_assignee_name\"\n                        style=\"@style/ListSubtitleText\"\n                        android:singleLine=\"true\"\n                        android:textColor=\"@color/text\" />\n                </LinearLayout>\n\n                <TextView\n                    android:id=\"@+id/tv_milestone_label\"\n                    style=\"@style/HeaderTitleText\"\n                    android:paddingTop=\"5dp\"\n                    android:text=\"@string/milestone\"\n                    android:visibility=\"gone\" />\n\n                <LinearLayout\n                    android:id=\"@+id/ll_milestone\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:background=\"@drawable/inset_background\"\n                    android:gravity=\"center_vertical\"\n                    android:orientation=\"vertical\"\n                    android:padding=\"10dp\"\n                    android:visibility=\"gone\">\n\n                    <TextView\n                        android:id=\"@+id/tv_milestone\"\n                        style=\"@style/ListSubtitleText\"\n                        android:singleLine=\"true\"\n                        android:textColor=\"@color/text\" />\n\n                    <include layout=\"@layout/milestone\" />\n                </LinearLayout>\n\n                <TextView\n                    style=\"@style/HeaderTitleText\"\n                    android:paddingTop=\"5dp\"\n                    android:text=\"@string/description\" />\n\n                <EditText\n                    android:id=\"@+id/et_issue_body\"\n                    style=\"@style/FormalMultiLineEditText\"\n                    android:layout_width=\"match_parent\"\n                    android:minLines=\"5\"\n                    android:scrollbars=\"horizontal|vertical\" />\n            </LinearLayout>\n        </RelativeLayout>\n    </androidx.core.widget.NestedScrollView>\n\n\n\n\n    <com.google.android.material.floatingactionbutton.FloatingActionButton\n        android:id=\"@+id/fab_add_image\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"bottom|end\"\n        android:layout_margin=\"16dp\"\n        app:srcCompat=\"@drawable/ic_add_a_photo\" />\n\n</androidx.coordinatorlayout.widget.CoordinatorLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_issue_search.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Copyright (c) 2015 PocketHub\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<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <androidx.appcompat.widget.Toolbar\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:theme=\"@style/ToolbarTheme\"\n        android:minHeight=\"?attr/actionBarSize\"\n        android:background=\"?attr/colorPrimary\"\n        android:layout_alignParentTop=\"true\"\n        android:id=\"@+id/toolbar\" />\n\n    <fragment\n        android:id=\"@+id/list\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_below=\"@id/toolbar\"\n        class=\"com.github.pockethub.android.ui.issue.SearchIssueListFragment\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_issues_filter_edit.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Copyright (c) 2015 PocketHub\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<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <androidx.appcompat.widget.Toolbar\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:theme=\"@style/ToolbarTheme\"\n        android:minHeight=\"?attr/actionBarSize\"\n        android:background=\"?attr/colorPrimary\"\n        android:layout_alignParentTop=\"true\"\n        android:id=\"@+id/toolbar\" />\n\n    <ScrollView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_below=\"@id/toolbar\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            android:padding=\"10dp\">\n\n            <TextView\n                style=\"@style/HeaderTitleText\"\n                android:text=\"@string/section_issue_status\" />\n\n            <RadioGroup\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:id=\"@+id/issue_filter_status\"\n                android:background=\"@drawable/inset_background\"\n                android:orientation=\"horizontal\">\n\n                <RadioButton\n                    android:id=\"@+id/rb_open\"\n                    style=\"@style/SubtitleText\"\n                    android:text=\"@string/status_open\"\n                    android:textColor=\"@color/text\" />\n\n                <RadioButton\n                    android:id=\"@+id/rb_closed\"\n                    style=\"@style/SubtitleText\"\n                    android:layout_marginStart=\"10dp\"\n                    android:text=\"@string/status_closed\"\n                    android:textColor=\"@color/text\" />\n            </RadioGroup>\n\n            <TextView\n                style=\"@style/HeaderTitleText\"\n                android:text=\"@string/section_issue_sort_order\" />\n\n            <RadioGroup\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:id=\"@+id/issue_sort_order\"\n                android:background=\"@drawable/inset_background\"\n                android:orientation=\"horizontal\">\n\n                <RadioButton\n                    android:id=\"@+id/rb_desc\"\n                    style=\"@style/SubtitleText\"\n                    android:text=\"@string/sort_order_descending\"\n                    android:textColor=\"@color/text\" />\n\n                <RadioButton\n                    android:id=\"@+id/rb_asc\"\n                    style=\"@style/SubtitleText\"\n                    android:layout_marginStart=\"10dp\"\n                    android:text=\"@string/sort_order_ascending\"\n                    android:textColor=\"@color/text\" />\n\n            </RadioGroup>\n\n            <TextView\n                style=\"@style/HeaderTitleText\"\n                android:text=\"@string/section_issue_sort_type\" />\n\n            <RadioGroup\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:id=\"@+id/issue_sort_type\"\n                android:background=\"@drawable/inset_background\"\n                android:orientation=\"horizontal\">\n\n                <RadioButton\n                    android:id=\"@+id/rb_created\"\n                    style=\"@style/SubtitleText\"\n                    android:text=\"@string/sort_created\"\n                    android:textColor=\"@color/text\" />\n\n                <RadioButton\n                    android:id=\"@+id/rb_updated\"\n                    style=\"@style/SubtitleText\"\n                    android:layout_marginStart=\"10dp\"\n                    android:text=\"@string/sort_updated\"\n                    android:textColor=\"@color/text\" />\n\n                <RadioButton\n                    android:id=\"@+id/rb_comments\"\n                    style=\"@style/SubtitleText\"\n                    android:layout_marginStart=\"10dp\"\n                    android:text=\"@string/sort_comments\"\n                    android:textColor=\"@color/text\" />\n            </RadioGroup>\n\n            <TextView\n                android:id=\"@+id/tv_assignee_label\"\n                style=\"@style/HeaderTitleText\"\n                android:paddingTop=\"5dp\"\n                android:text=\"@string/section_issue_assigned\" />\n\n            <LinearLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:background=\"@drawable/inset_background\"\n                android:gravity=\"center_vertical\"\n                android:orientation=\"horizontal\"\n                android:padding=\"10dp\">\n\n                <ImageView\n                    android:id=\"@+id/iv_avatar\"\n                    style=\"@style/AvatarLarge\"\n                    android:layout_marginEnd=\"10dp\"\n                    android:contentDescription=\"@string/avatar\" />\n\n                <TextView\n                    android:id=\"@+id/tv_assignee\"\n                    style=\"@style/SubtitleText\"\n                    android:layout_width=\"match_parent\"\n                    android:includeFontPadding=\"true\"\n                    android:maxLines=\"1\"\n                    android:text=\"@string/assignee_anyone\"\n                    android:textColor=\"@color/text\" />\n            </LinearLayout>\n\n            <TextView\n                android:id=\"@+id/tv_milestone_label\"\n                style=\"@style/HeaderTitleText\"\n                android:paddingTop=\"15dp\"\n                android:text=\"@string/section_issue_milestone\" />\n\n            <LinearLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:background=\"@drawable/inset_background\"\n                android:gravity=\"center_vertical\"\n                android:orientation=\"vertical\"\n                android:padding=\"10dp\">\n\n                <TextView\n                    android:id=\"@+id/tv_milestone\"\n                    style=\"@style/SubtitleText\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\"\n                    android:maxLines=\"1\"\n                    android:textColor=\"@color/text\" />\n            </LinearLayout>\n\n            <TextView\n                android:id=\"@+id/tv_labels_label\"\n                style=\"@style/HeaderTitleText\"\n                android:paddingTop=\"15dp\"\n                android:text=\"@string/section_issue_labels\" />\n\n            <LinearLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:background=\"@drawable/inset_background\"\n                android:gravity=\"center_vertical\"\n                android:orientation=\"vertical\"\n                android:padding=\"10dp\">\n\n                <TextView\n                    android:id=\"@+id/tv_labels\"\n                    style=\"@style/SubtitleText\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\"\n                    android:text=\"@string/none\"\n                    android:textColor=\"@color/text\" />\n            </LinearLayout>\n        </LinearLayout>\n    </ScrollView>\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     http://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<androidx.drawerlayout.widget.DrawerLayout\n    android:id=\"@+id/drawer_layout\"\n    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:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:fitsSystemWindows=\"true\"\n    tools:context=\".MainActivity\">\n\n    <RelativeLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <androidx.appcompat.widget.Toolbar\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:theme=\"@style/ToolbarTheme\"\n            android:minHeight=\"?attr/actionBarSize\"\n            android:background=\"?attr/colorPrimary\"\n            android:id=\"@+id/toolbar\" />\n\n        <FrameLayout\n            android:id=\"@+id/container\"\n            android:layout_below=\"@id/toolbar\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\" />\n\n    </RelativeLayout>\n\n    <com.google.android.material.navigation.NavigationView\n        android:id=\"@+id/navigation_view\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"match_parent\"\n        android:layout_gravity=\"start\"\n        app:headerLayout=\"@layout/drawer_header\"\n        app:menu=\"@menu/navigation\"\n        android:theme=\"@style/NavigationView\"/>\n</androidx.drawerlayout.widget.DrawerLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_pager.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Copyright (c) 2015 PocketHub\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<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_height=\"match_parent\"\n    android:layout_width=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <androidx.appcompat.widget.Toolbar\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:theme=\"@style/ToolbarTheme\"\n        android:minHeight=\"?attr/actionBarSize\"\n        android:background=\"?attr/colorPrimary\"\n        android:id=\"@+id/toolbar\" />\n\n    <com.github.pockethub.android.ui.ViewPager\n        android:id=\"@+id/vp_pages\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_pager_with_title.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Copyright (c) 2015 PocketHub\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<LinearLayout 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:gravity=\"center\"\n    android:orientation=\"vertical\">\n\n    <com.google.android.material.appbar.AppBarLayout\n        android:id=\"@+id/appbar\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:theme=\"@style/ThemeOverlay.AppCompat.Dark.ActionBar\">\n\n        <androidx.appcompat.widget.Toolbar\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:theme=\"@style/ToolbarTheme\"\n            android:layout_alignParentTop=\"true\"\n            android:minHeight=\"?attr/actionBarSize\"\n            android:background=\"?attr/colorPrimary\"\n            android:id=\"@+id/toolbar\" />\n\n        <com.google.android.material.tabs.TabLayout\n            android:layout_below=\"@id/toolbar\"\n            android:id=\"@+id/sliding_tabs_layout\"\n            app:tabIndicatorColor=\"@android:color/white\"\n            app:tabMode=\"scrollable\"\n            android:background=\"@color/primary\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\" />\n\n    </com.google.android.material.appbar.AppBarLayout>\n\n    <ProgressBar\n        android:id=\"@+id/pb_loading\"\n        style=\"@style/Spinner\"\n        android:layout_width=\"64dp\"\n        android:layout_height=\"64dp\"\n        android:visibility=\"gone\" />\n\n    <com.github.pockethub.android.ui.ViewPager\n        android:id=\"@+id/vp_pages\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_repo_contributors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Copyright (c) 2015 PocketHub\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<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <androidx.appcompat.widget.Toolbar\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:theme=\"@style/ToolbarTheme\"\n        android:minHeight=\"?attr/actionBarSize\"\n        android:background=\"?attr/colorPrimary\"\n        android:layout_alignParentTop=\"true\"\n        android:id=\"@+id/toolbar\" />\n\n    <fragment\n        android:id=\"@+id/list\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_alignParentStart=\"true\"\n        android:layout_below=\"@id/toolbar\"\n        class=\"com.github.pockethub.android.ui.repo.RepositoryContributorsFragment\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_repo_issue_list.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Copyright (c) 2015 PocketHub\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<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <androidx.appcompat.widget.Toolbar\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:theme=\"@style/ToolbarTheme\"\n        android:minHeight=\"?attr/actionBarSize\"\n        android:background=\"?attr/colorPrimary\"\n        android:layout_alignParentTop=\"true\"\n        android:id=\"@+id/toolbar\" />\n\n    <fragment\n        android:id=\"@+id/list\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_alignParentStart=\"true\"\n        android:layout_below=\"@id/toolbar\"\n        class=\"com.github.pockethub.android.ui.issue.IssuesFragment\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/adapter_fenced_code_block.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<HorizontalScrollView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:clipChildren=\"false\"\n    android:clipToPadding=\"false\"\n    android:fillViewport=\"true\"\n    android:paddingLeft=\"16dip\"\n    android:paddingRight=\"16dip\"\n    android:scrollbarStyle=\"outsideInset\">\n\n    <TextView\n        android:id=\"@+id/text\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"#0f000000\"\n        android:fontFamily=\"monospace\"\n        android:lineSpacingExtra=\"2dip\"\n        android:paddingLeft=\"16dip\"\n        android:paddingTop=\"8dip\"\n        android:paddingRight=\"16dip\"\n        android:paddingBottom=\"8dip\"\n        android:textAppearance=\"?android:attr/textAppearanceMedium\"\n        android:textSize=\"14sp\" />\n\n</HorizontalScrollView>"
  },
  {
    "path": "app/src/main/res/layout/blob_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Copyright (c) 2015 PocketHub\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<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    style=\"@style/ListItem\">\n\n    <com.github.pockethub.android.ui.view.OcticonTextView\n        android:id=\"@+id/tv_file_icon\"\n        style=\"@style/EventIcon\"\n        android:layout_alignParentStart=\"true\"\n        android:layout_alignParentTop=\"true\"\n        android:text=\"@string/icon_file\" />\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerVertical=\"true\"\n        android:layout_toEndOf=\"@id/tv_file_icon\"\n        android:orientation=\"horizontal\"\n        android:paddingStart=\"10dp\">\n\n        <TextView\n            android:id=\"@+id/tv_file\"\n            style=\"@style/ListTitleText\"\n            android:layout_width=\"0dp\"\n            android:layout_weight=\"1\"\n            android:paddingBottom=\"0dp\"\n            android:paddingEnd=\"5dp\"\n            android:textStyle=\"normal\" />\n\n        <TextView\n            android:id=\"@+id/tv_size\"\n            style=\"@style/ListSubtitleText\"\n            android:singleLine=\"true\" />\n    </LinearLayout>\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/collaborator_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Copyright (c) 2015 PocketHub\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<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    style=\"@style/ListItem\"\n    android:gravity=\"center_vertical\"\n    android:orientation=\"horizontal\">\n\n    <RadioButton\n        android:id=\"@+id/rb_selected\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:clickable=\"false\"\n        android:focusable=\"false\"\n        android:focusableInTouchMode=\"false\" />\n\n    <ImageView\n        android:id=\"@+id/iv_avatar\"\n        style=\"@style/AvatarLarge\"\n        android:contentDescription=\"@string/avatar\" />\n\n    <TextView\n        android:id=\"@+id/tv_login\"\n        style=\"@style/ListTitleText\"\n        android:layout_width=\"match_parent\"\n        android:includeFontPadding=\"true\"\n        android:paddingBottom=\"0dp\"\n        android:paddingStart=\"10dp\"\n        android:singleLine=\"true\"\n        android:textStyle=\"normal\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/comment.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Copyright (c) 2015 PocketHub\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<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    style=\"@style/ListItem\"\n    android:layout_width=\"match_parent\"\n    android:background=\"@drawable/inset_background\"\n    android:orientation=\"vertical\"\n    android:paddingLeft=\"10dp\"\n    android:paddingRight=\"10dp\">\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        android:paddingBottom=\"2dp\">\n\n        <ImageView\n            android:id=\"@+id/iv_avatar\"\n            style=\"@style/AvatarMedium\"\n            android:layout_weight=\".10\"\n            android:contentDescription=\"@string/avatar\" />\n\n        <LinearLayout\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_weight=\".70\"\n            android:orientation=\"vertical\"\n            android:paddingStart=\"8dp\">\n\n            <TextView\n                android:id=\"@+id/tv_comment_author\"\n                style=\"@style/ListTitleText\"\n                android:paddingBottom=\"0dp\"\n                android:singleLine=\"true\"\n                android:textSize=\"15sp\"\n                android:textStyle=\"bold\" />\n\n            <TextView\n                android:id=\"@+id/tv_comment_date\"\n                style=\"@style/ListSubtitleText\"\n                android:singleLine=\"true\" />\n        </LinearLayout>\n\n        <ImageView\n            android:id=\"@+id/iv_delete\"\n            style=\"@style/AvatarMedium\"\n            android:layout_weight=\".10\"\n            android:contentDescription=\"@string/delete\"\n            android:src=\"@drawable/ic_delete_white_24dp\"\n            android:tint=\"#757575\"\n            android:visibility=\"invisible\"/>\n\n        <ImageView\n            android:id=\"@+id/iv_edit\"\n            style=\"@style/AvatarMedium\"\n            android:layout_weight=\".10\"\n            android:contentDescription=\"@string/edit\"\n            android:visibility=\"invisible\"\n            android:tint=\"#757575\"\n            android:src=\"@drawable/ic_edit_white_24dp\" />\n\n    </LinearLayout>\n\n    <com.github.pockethub.android.ui.view.LinkTextView\n        android:id=\"@+id/tv_comment_body\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:paddingBottom=\"5dp\"\n        android:paddingTop=\"5dp\"\n        android:textColor=\"@color/text\"\n        android:textColorLink=\"@color/text_link\"\n        android:textSize=\"14sp\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/comment_event.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     http://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    style=\"@style/ListItem\"\n    android:paddingTop=\"5dp\"\n    android:orientation=\"horizontal\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <com.github.pockethub.android.ui.view.OcticonTextView\n        android:layout_centerVertical=\"true\"\n        style=\"@style/PrimaryIcon\"\n        android:id=\"@+id/tv_event_icon\"/>\n\n    <ImageView\n        android:id=\"@+id/iv_avatar\"\n        style=\"@style/AvatarSmall\"\n        android:layout_toEndOf=\"@id/tv_event_icon\"\n        android:layout_marginStart=\"16dp\"\n        android:contentDescription=\"@string/avatar\"\n        android:layout_centerVertical=\"true\"/>\n\n    <TextView\n        android:id=\"@+id/tv_event\"\n        style=\"@style/ListTitleText\"\n        android:layout_toEndOf=\"@id/iv_avatar\"\n        android:layout_marginStart=\"16dp\"\n        android:textSize=\"15sp\"\n        android:textStyle=\"normal\"\n        android:layout_centerVertical=\"true\"/>\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/comment_event_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     http://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    style=\"@style/CommentListItem\"\n    android:paddingBottom=\"5dp\"\n    android:paddingTop=\"0dp\" >\n\n    <include layout=\"@layout/comment_event\" />\n\n</FrameLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/comment_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    style=\"@style/CommentListItem\"\n    android:paddingBottom=\"5dp\"\n    android:paddingTop=\"0dp\" >\n\n    <include layout=\"@layout/comment\" />\n\n</FrameLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/commit_comment_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    style=\"@style/CommentListItem\"\n    android:paddingBottom=\"5dp\"\n    android:paddingTop=\"5dp\" >\n\n    <include layout=\"@layout/comment\" />\n\n</FrameLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/commit_compare.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Copyright (c) 2015 PocketHub\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<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <androidx.appcompat.widget.Toolbar\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:theme=\"@style/ToolbarTheme\"\n        android:minHeight=\"?attr/actionBarSize\"\n        android:background=\"?attr/colorPrimary\"\n        android:id=\"@+id/toolbar\" />\n\n    <fragment\n        android:id=\"@+id/list\"\n        android:layout_below=\"@id/toolbar\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        class=\"com.github.pockethub.android.ui.commit.CommitCompareListFragment\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/commit_compare_file_details_header.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    style=\"@style/ListItem\"\n    android:paddingBottom=\"0dp\" >\n\n    <TextView\n        android:id=\"@+id/tv_commit_file_summary\"\n        style=\"@style/SubtitleText\" />\n\n</FrameLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/commit_details_header.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    style=\"@style/ListItem\" >\n\n    <TextView\n        android:id=\"@+id/tv_commit_summary\"\n        style=\"@style/SubtitleText\" />\n\n</FrameLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/commit_diff_file_header.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    style=\"@style/ListItem\"\n    android:background=\"@color/background\"\n    android:paddingBottom=\"0dp\"\n    android:paddingLeft=\"0dp\"\n    android:paddingRight=\"0dp\" >\n\n    <LinearLayout\n        style=\"@style/ListItem\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:background=\"@drawable/section_selector\"\n        android:orientation=\"vertical\"\n        android:paddingBottom=\"5dp\"\n        android:paddingTop=\"5dp\" >\n\n        <TextView\n            android:id=\"@+id/tv_name\"\n            style=\"@style/ListTitleText\"\n            android:paddingBottom=\"0dp\"\n            android:singleLine=\"true\" />\n\n        <TextView\n            android:id=\"@+id/tv_folder\"\n            style=\"@style/ListSubtitleText\"\n            android:singleLine=\"true\"\n            android:textColor=\"@color/section_subtitle\" />\n\n        <TextView\n            android:id=\"@+id/tv_stats\"\n            style=\"@style/ListSubtitleText\"\n            android:singleLine=\"true\"\n            android:textColor=\"@color/section_subtitle\" />\n    </LinearLayout>\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/commit_diff_line.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<TextView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/tv_diff\"\n    style=\"@style/CodeText\"\n    android:layout_width=\"match_parent\"\n    android:background=\"?attr/selectableItemBackground\"\n    android:paddingBottom=\"1dp\"\n    android:paddingStart=\"15dp\"\n    android:paddingEnd=\"10dp\"\n    android:paddingTop=\"1dp\" />\n"
  },
  {
    "path": "app/src/main/res/layout/commit_file_details_header.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    style=\"@style/ListItem\"\n    android:paddingBottom=\"0dp\"\n    android:paddingTop=\"0dp\" >\n\n    <TextView\n        android:id=\"@+id/tv_commit_file_summary\"\n        style=\"@style/SubtitleText\" />\n\n</FrameLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/commit_header.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    style=\"@style/ListItem\"\n    android:layout_width=\"match_parent\"\n    android:orientation=\"vertical\"\n    android:paddingBottom=\"0dp\" >\n\n    <LinearLayout\n        android:id=\"@+id/ll_author\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:gravity=\"center_vertical\"\n        android:orientation=\"horizontal\"\n        android:paddingBottom=\"2dp\" >\n\n        <ImageView\n            android:id=\"@+id/iv_author\"\n            style=\"@style/AvatarMedium\"\n            android:contentDescription=\"@string/avatar\" />\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            android:paddingStart=\"8dp\">\n\n            <TextView\n                android:id=\"@+id/tv_author\"\n                style=\"@style/ListTitleText\"\n                android:paddingBottom=\"0dp\"\n                android:singleLine=\"true\"\n                android:textSize=\"15sp\"\n                android:textStyle=\"bold\" />\n\n            <TextView\n                android:id=\"@+id/tv_author_date\"\n                style=\"@style/ListSubtitleText\"\n                android:singleLine=\"true\" />\n        </LinearLayout>\n    </LinearLayout>\n\n    <LinearLayout\n        android:id=\"@+id/ll_committer\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:gravity=\"center_vertical\"\n        android:orientation=\"horizontal\"\n        android:paddingBottom=\"2dp\" >\n\n        <ImageView\n            android:id=\"@+id/iv_committer\"\n            style=\"@style/AvatarMedium\"\n            android:contentDescription=\"@string/avatar\" />\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            android:paddingStart=\"8dp\">\n\n            <TextView\n                android:id=\"@+id/tv_committer\"\n                style=\"@style/ListTitleText\"\n                android:paddingBottom=\"0dp\"\n                android:singleLine=\"true\"\n                android:textSize=\"15sp\"\n                android:textStyle=\"bold\" />\n\n            <TextView\n                android:id=\"@+id/tv_commit_date\"\n                style=\"@style/ListSubtitleText\"\n                android:singleLine=\"true\" />\n        </LinearLayout>\n    </LinearLayout>\n\n    <com.github.pockethub.android.ui.view.LinkTextView\n        android:id=\"@+id/tv_commit_message\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:lineSpacingExtra=\"3dp\"\n        android:paddingTop=\"5dp\"\n        android:textColor=\"@color/text\"\n        android:textColorLink=\"@color/text_link\"\n        android:textSize=\"13sp\"\n        android:typeface=\"monospace\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/commit_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    style=\"@style/ListItem\" >\n\n    <ImageView\n        android:id=\"@+id/iv_avatar\"\n        style=\"@style/AvatarLarge\"\n        android:layout_alignParentStart=\"true\"\n        android:layout_alignParentTop=\"true\"\n        android:layout_marginEnd=\"10dp\"\n        android:contentDescription=\"@string/avatar\" />\n\n    <TextView\n        android:id=\"@+id/tv_commit_id\"\n        style=\"@style/ListSubtitleText\"\n        android:layout_width=\"match_parent\"\n        android:layout_alignParentTop=\"true\"\n        android:layout_toEndOf=\"@id/iv_avatar\"\n        android:singleLine=\"true\" />\n\n    <TextView\n        android:id=\"@+id/tv_commit_message\"\n        style=\"@style/ListTitleText\"\n        android:layout_width=\"match_parent\"\n        android:layout_alignStart=\"@id/tv_commit_id\"\n        android:layout_below=\"@id/tv_commit_id\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"2\"\n        android:singleLine=\"false\" />\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_alignStart=\"@id/tv_commit_message\"\n        android:layout_below=\"@id/tv_commit_message\"\n        android:gravity=\"center_vertical\"\n        android:orientation=\"horizontal\" >\n\n        <TextView\n            android:id=\"@+id/tv_commit_author\"\n            style=\"@style/ListSubtitleText\"\n            android:layout_width=\"0dp\"\n            android:layout_weight=\"1\"\n            android:singleLine=\"true\" />\n\n        <com.github.pockethub.android.ui.view.OcticonTextView\n            android:id=\"@+id/tv_comment_icon\"\n            style=\"@style/ListIcon\"\n            android:text=\"@string/icon_comment\" />\n\n        <TextView\n            android:id=\"@+id/tv_commit_comments\"\n            style=\"@style/ListNumericSubtitleText\"\n            android:paddingStart=\"5dp\" />\n    </LinearLayout>\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/commit_parent_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    style=\"@style/ListItem\"\n    android:orientation=\"horizontal\"\n    android:paddingBottom=\"5dp\"\n    android:paddingTop=\"5dp\" >\n\n    <TextView\n        android:id=\"@+id/tv_commit_id\"\n        style=\"@style/SubtitleText\"\n        android:layout_width=\"match_parent\"\n        android:singleLine=\"true\"\n        android:textColor=\"@color/text_link\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/contributor_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    style=\"@style/ListItemTwoLines\"\n    android:gravity=\"center_vertical\"\n    android:orientation=\"horizontal\" >\n\n    <ImageView\n        android:id=\"@+id/iv_avatar\"\n        style=\"@style/AvatarXLarge\"\n        android:contentDescription=\"@string/avatar\" />\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\" >\n\n        <TextView\n            android:id=\"@+id/tv_login\"\n            style=\"@style/ListTitleText\"\n            android:paddingStart=\"10dp\"\n            android:paddingBottom=\"0dp\"\n            android:singleLine=\"true\"\n            android:textStyle=\"normal\" />\n\n        <TextView\n            android:id=\"@+id/tv_contributions\"\n            style=\"@style/ListSubtitleText\"\n            android:paddingStart=\"10dp\"\n            android:singleLine=\"true\"\n            android:textStyle=\"normal\" />\n\n    </LinearLayout>\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/dashboard_issue_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    style=\"@style/ListItem\"\n    android:paddingStart=\"0dp\">\n\n    <include\n        android:id=\"@+id/ll_issue_number\"\n        layout=\"@layout/issue_number\" />\n\n    <TextView\n        android:id=\"@+id/tv_issue_repo_name\"\n        style=\"@style/ListSubtitleText\"\n        android:layout_width=\"match_parent\"\n        android:layout_alignBaseline=\"@id/ll_issue_number\"\n        android:layout_toEndOf=\"@id/ll_issue_number\"\n        android:paddingStart=\"10dp\"\n        android:singleLine=\"true\" />\n\n    <TextView\n        android:id=\"@+id/tv_issue_title\"\n        style=\"@style/ListTitleText\"\n        android:layout_width=\"match_parent\"\n        android:layout_below=\"@id/tv_issue_repo_name\"\n        android:layout_toEndOf=\"@id/ll_issue_number\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"2\"\n        android:paddingStart=\"10dp\" />\n\n    <LinearLayout\n        android:id=\"@+id/ll_lines\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignStart=\"@id/tv_issue_title\"\n        android:layout_below=\"@id/tv_issue_title\"\n        android:gravity=\"center_vertical\"\n        android:includeFontPadding=\"false\"\n        android:orientation=\"horizontal\"\n        android:paddingStart=\"10dp\"\n        android:paddingTop=\"2dp\" >\n\n        <include layout=\"@layout/issue_details\" />\n    </LinearLayout>\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/diff_comment_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    style=\"@style/CommentListItem\"\n    android:background=\"?attr/selectableItemBackground\"\n    android:paddingBottom=\"5dp\"\n    android:paddingStart=\"15dp\"\n    android:paddingTop=\"5dp\" >\n\n    <include layout=\"@layout/comment\" />\n\n</FrameLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/diff_line_dialog.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     http://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<ScrollView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\" >\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\" >\n\n        <FrameLayout\n            style=\"@style/ListItem\"\n            android:layout_width=\"match_parent\" >\n\n            <TextView\n                style=\"@style/ListTitleText\"\n                android:text=\"@string/diff_line_message\"\n                android:textStyle=\"normal\" />\n        </FrameLayout>\n\n        <View style=\"@style/Separator\" />\n\n        <LinearLayout\n            android:id=\"@+id/ll_comment_area\"\n            style=\"@style/ListItem\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:clickable=\"true\"\n            android:orientation=\"vertical\" >\n\n            <TextView\n                style=\"@style/ListTitleText\"\n                android:text=\"@string/comment_on_line\" />\n\n            <TextView\n                android:id=\"@+id/tv_diff\"\n                style=\"@style/CodeText\"\n                android:layout_width=\"match_parent\"\n                android:singleLine=\"true\" />\n        </LinearLayout>\n\n        <View style=\"@style/Separator\" />\n\n        <LinearLayout\n            android:id=\"@+id/ll_view_area\"\n            style=\"@style/ListItem\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:clickable=\"true\"\n            android:orientation=\"vertical\" >\n\n            <TextView\n                style=\"@style/ListTitleText\"\n                android:text=\"@string/view_entire_file\" />\n\n            <TextView\n                android:id=\"@+id/tv_commit\"\n                style=\"@style/ListSubtitleText\"\n                android:singleLine=\"true\" />\n        </LinearLayout>\n    </LinearLayout>\n\n</ScrollView>\n"
  },
  {
    "path": "app/src/main/res/layout/drawer_header.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     http://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/navigation_drawer_header\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"@dimen/nav_drawer_header_height\">\n\n    <FrameLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:gravity=\"center\"\n        android:background=\"@color/primary_dark\"/>\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:paddingTop=\"@dimen/toolbar_top_padding\"\n        android:layout_margin=\"16dp\"\n        android:orientation=\"vertical\">\n\n        <FrameLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\">\n\n            <ImageView\n                android:id=\"@+id/user_picture\"\n                android:layout_width=\"72dp\"\n                android:layout_height=\"72dp\"\n                android:contentDescription=\"@string/avatar\" />\n\n            <ImageView\n                android:id=\"@+id/iv_notification\"\n                android:layout_width=\"24dp\"\n                android:layout_height=\"24dp\"\n                android:layout_gravity=\"bottom|end\"\n                android:tint=\"#fff\"\n                app:srcCompat=\"@drawable/ic_notifications_black\" />\n        </FrameLayout>\n\n        <TextView\n            android:id=\"@+id/user_real_name\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"8dp\"\n            android:textAppearance=\"@style/TextAppearance.AppCompat.Body2\"\n            android:textColor=\"#DEDEDE\" />\n\n        <TextView\n            android:id=\"@+id/user_name\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:textAppearance=\"@style/TextAppearance.AppCompat.Body1\"\n            android:textColor=\"#DEDEDE\" />\n\n    </LinearLayout>\n\n</FrameLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/folder_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    style=\"@style/ListItem\" >\n\n    <com.github.pockethub.android.ui.view.OcticonTextView\n        android:id=\"@+id/tv_folder_icon\"\n        style=\"@style/EventIcon\"\n        android:layout_alignParentStart=\"true\"\n        android:layout_alignParentTop=\"true\"\n        android:text=\"@string/icon_folder\" />\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerVertical=\"true\"\n        android:layout_toEndOf=\"@id/tv_folder_icon\"\n        android:orientation=\"horizontal\"\n        android:paddingStart=\"10dp\">\n\n        <TextView\n            android:id=\"@+id/tv_folder\"\n            style=\"@style/ListTitleText\"\n            android:layout_width=\"0dp\"\n            android:layout_weight=\"1\"\n            android:paddingEnd=\"5dp\" />\n\n        <com.github.pockethub.android.ui.view.OcticonTextView\n            android:id=\"@+id/tv_folders_icon\"\n            style=\"@style/ListIcon\"\n            android:text=\"@string/icon_folder\" />\n\n        <TextView\n            android:id=\"@+id/tv_folders\"\n            style=\"@style/ListNumericSubtitleText\"\n            android:paddingStart=\"5dp\"\n            android:paddingEnd=\"10dp\" />\n\n        <com.github.pockethub.android.ui.view.OcticonTextView\n            android:id=\"@+id/tv_files_icon\"\n            style=\"@style/ListIcon\"\n            android:paddingStart=\"5dp\"\n            android:text=\"@string/icon_file\" />\n\n        <TextView\n            android:id=\"@+id/tv_files\"\n            style=\"@style/ListNumericSubtitleText\"\n            android:paddingStart=\"5dp\" />\n    </LinearLayout>\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_comment_create.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<RelativeLayout 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\n    <EditText\n        android:id=\"@+id/et_comment\"\n        style=\"@style/FormalMultiLineEditText\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_alignParentStart=\"true\"\n        android:layout_alignParentTop=\"true\"\n        android:layout_margin=\"10dp\"\n        android:hint=\"@string/comment_hint\"\n        android:scrollbars=\"horizontal|vertical\" >\n\n        <requestFocus/>\n    </EditText>\n\n    <com.google.android.material.floatingactionbutton.FloatingActionButton\n        android:id=\"@+id/fab_add_image\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentBottom=\"true\"\n        android:layout_alignParentEnd=\"true\"\n        android:layout_margin=\"16dp\"\n        app:srcCompat=\"@drawable/ic_add_a_photo\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_comment_list.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Copyright (c) 2015 PocketHub\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<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/list\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_alignParentTop=\"true\"\n        android:clipToPadding=\"false\"\n        android:paddingBottom=\"10dp\" />\n\n    <ProgressBar\n        android:id=\"@+id/pb_loading\"\n        style=\"@style/ListSpinner\"\n        android:layout_centerInParent=\"true\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_comment_preview.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    style=\"@style/CommentListItem\" >\n\n    <RelativeLayout\n        android:id=\"@+id/ll_comment_area\"\n        style=\"@style/ListItem\"\n        android:layout_width=\"match_parent\"\n        android:layout_alignParentStart=\"true\"\n        android:layout_alignParentTop=\"true\"\n        android:background=\"@drawable/inset_background\"\n        android:paddingLeft=\"10dp\"\n        android:paddingRight=\"10dp\" >\n\n        <ProgressBar\n            android:id=\"@+id/pb_loading\"\n            style=\"@style/ListSpinner\"\n            android:layout_centerInParent=\"true\" />\n\n        <com.github.pockethub.android.ui.view.LinkTextView\n            android:id=\"@+id/tv_comment_body\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentStart=\"true\"\n            android:layout_alignParentTop=\"true\"\n            android:paddingBottom=\"5dp\"\n            android:paddingTop=\"5dp\"\n            android:textColor=\"@color/text\"\n            android:textColorLink=\"@color/text_link\"\n            android:textSize=\"14sp\" />\n    </RelativeLayout>\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_commit_diff_list.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\" >\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/list\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_alignParentTop=\"true\"\n        android:paddingBottom=\"10dp\"\n        android:clipToPadding=\"false\" />\n\n    <ProgressBar\n        android:id=\"@+id/pb_loading\"\n        style=\"@style/ListSpinner\"\n        android:layout_centerInParent=\"true\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_commit_list.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\" >\n\n    <TextView\n        android:id=\"@+id/empty\"\n        style=\"@style/ListSubtitleText\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:gravity=\"center\"\n        android:visibility=\"gone\" />\n\n    <include\n        android:id=\"@+id/rl_branch\"\n        layout=\"@layout/ref_footer\" />\n\n    <androidx.swiperefreshlayout.widget.SwipeRefreshLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:id=\"@+id/swipe_item\"\n        android:layout_above=\"@id/rl_branch\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <androidx.recyclerview.widget.RecyclerView\n            android:id=\"@+id/list\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentStart=\"true\"\n            android:layout_alignParentTop=\"true\" />\n\n    </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_gist_file_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<com.github.pockethub.android.ui.WebView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/wv_code\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\" />\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_item_list.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\" >\n\n    <androidx.swiperefreshlayout.widget.SwipeRefreshLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:id=\"@+id/swipe_item\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <androidx.recyclerview.widget.RecyclerView\n            android:id=\"@+id/list\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\" />\n\n    </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>\n\n    <TextView\n        android:id=\"@+id/empty\"\n        style=\"@style/ListSubtitleText\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:gravity=\"center\"\n        android:visibility=\"gone\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_repo_code.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\" >\n\n    <ProgressBar\n        android:id=\"@+id/pb_loading\"\n        style=\"@style/ListSpinner\"\n        android:layout_centerInParent=\"true\" />\n\n    <include\n        android:id=\"@+id/rl_branch\"\n        layout=\"@layout/ref_footer\" />\n\n    <androidx.recyclerview.widget.RecyclerView\n        android:id=\"@+id/list\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_above=\"@id/rl_branch\"\n        android:layout_alignParentStart=\"true\"\n        android:layout_alignParentTop=\"true\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/gist_file_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    style=\"@style/ListItem\" >\n\n    <com.github.pockethub.android.ui.view.OcticonTextView\n        android:id=\"@+id/tv_file_icon\"\n        style=\"@style/PrimaryIcon\"\n        android:layout_alignParentStart=\"true\"\n        android:layout_alignParentTop=\"true\"\n        android:text=\"@string/icon_file\" />\n\n    <TextView\n        android:id=\"@+id/tv_file\"\n        style=\"@style/ListTitleText\"\n        android:layout_width=\"match_parent\"\n        android:layout_centerVertical=\"true\"\n        android:layout_toEndOf=\"@id/tv_file_icon\"\n        android:paddingBottom=\"0dp\"\n        android:paddingStart=\"10dp\"\n        android:singleLine=\"true\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/gist_header.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"?attr/selectableItemBackground\"\n    android:orientation=\"vertical\"\n    android:paddingTop=\"5dp\" >\n\n    <TextView\n        android:id=\"@+id/tv_gist_creation\"\n        style=\"@style/ListSubtitleText\"\n        android:layout_width=\"match_parent\"\n        android:gravity=\"center_vertical\"\n        android:paddingLeft=\"10dp\"\n        android:paddingRight=\"10dp\"\n        android:singleLine=\"true\" />\n\n    <com.github.pockethub.android.ui.view.LinkTextView\n        android:id=\"@+id/tv_gist_description\"\n        style=\"@style/ListTitleText\"\n        android:layout_width=\"match_parent\"\n        android:paddingBottom=\"5dp\"\n        android:paddingLeft=\"10dp\"\n        android:paddingRight=\"10dp\"\n        android:paddingTop=\"5dp\"\n        android:textColorLink=\"@color/text_link\" />\n\n    <TextView\n        android:id=\"@+id/tv_gist_updated\"\n        style=\"@style/ListSubtitleText\"\n        android:layout_width=\"match_parent\"\n        android:gravity=\"center_vertical\"\n        android:paddingBottom=\"5dp\"\n        android:paddingLeft=\"10dp\"\n        android:paddingRight=\"10dp\"\n        android:singleLine=\"true\" />\n\n    <View style=\"@style/Separator\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/gist_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    style=\"@style/ListItem\" >\n\n    <ImageView\n        android:id=\"@+id/iv_avatar\"\n        style=\"@style/AvatarLarge\"\n        android:layout_alignParentStart=\"true\"\n        android:layout_alignParentTop=\"true\"\n        android:layout_marginEnd=\"10dp\"\n        android:contentDescription=\"@string/avatar\" />\n\n    <TextView\n        android:id=\"@+id/tv_gist_title\"\n        style=\"@style/ListTitleText\"\n        android:layout_width=\"match_parent\"\n        android:layout_alignParentTop=\"true\"\n        android:layout_toEndOf=\"@id/iv_avatar\"\n        android:singleLine=\"true\" />\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_alignStart=\"@id/tv_gist_title\"\n        android:layout_below=\"@id/tv_gist_title\"\n        android:gravity=\"center_vertical\"\n        android:orientation=\"horizontal\" >\n\n        <TextView\n            android:id=\"@+id/tv_gist_author\"\n            style=\"@style/ListSubtitleText\"\n            android:layout_width=\"0dp\"\n            android:layout_weight=\"1\"\n            android:singleLine=\"true\" />\n\n        <com.github.pockethub.android.ui.view.OcticonTextView\n            android:id=\"@+id/tv_file_icon\"\n            style=\"@style/ListIcon\"\n            android:paddingStart=\"5dp\"\n            android:text=\"@string/icon_file\" />\n\n        <TextView\n            android:id=\"@+id/tv_gist_files\"\n            style=\"@style/ListNumericSubtitleText\"\n            android:paddingStart=\"5dp\"\n            android:paddingEnd=\"10dp\" />\n\n        <com.github.pockethub.android.ui.view.OcticonTextView\n            android:id=\"@+id/tv_comment_icon\"\n            style=\"@style/ListIcon\"\n            android:text=\"@string/icon_comment\" />\n\n        <TextView\n            android:id=\"@+id/tv_gist_comments\"\n            style=\"@style/ListNumericSubtitleText\"\n            android:paddingStart=\"5dp\" />\n    </LinearLayout>\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/issue_details.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<merge xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <ImageView\n        android:id=\"@+id/iv_avatar\"\n        style=\"@style/AvatarMedium\"\n        android:contentDescription=\"@string/avatar\" />\n\n    <TextView\n        android:id=\"@+id/tv_issue_creation\"\n        style=\"@style/ListSubtitleText\"\n        android:layout_width=\"0dp\"\n        android:layout_weight=\"1\"\n        android:paddingStart=\"10dp\"\n        android:paddingEnd=\"2dp\"\n        android:singleLine=\"true\" />\n\n    <com.github.pockethub.android.ui.view.OcticonTextView\n        android:id=\"@+id/tv_pull_request_icon\"\n        style=\"@style/ListIcon\"\n        android:paddingEnd=\"5dp\"\n        android:text=\"@string/icon_pull_request\" />\n\n    <com.github.pockethub.android.ui.view.OcticonTextView\n        android:id=\"@+id/tv_comment_icon\"\n        style=\"@style/ListIcon\"\n        android:text=\"@string/icon_comment\" />\n\n    <TextView\n        android:id=\"@+id/tv_issue_comments\"\n        style=\"@style/ListNumericSubtitleText\"\n        android:paddingStart=\"5dp\" />\n\n</merge>\n"
  },
  {
    "path": "app/src/main/res/layout/issue_header.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"?attr/selectableItemBackground\"\n    android:orientation=\"vertical\" >\n\n    <TextView\n        android:id=\"@+id/tv_state\"\n        style=\"@style/SubtitleText\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"@color/state_background_closed\"\n        android:gravity=\"center\"\n        android:padding=\"8dp\"\n        android:textColor=\"@color/state_text\" />\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginLeft=\"10dp\"\n        android:layout_marginRight=\"10dp\"\n        android:gravity=\"center_vertical\"\n        android:orientation=\"horizontal\"\n        android:paddingBottom=\"10dp\"\n        android:paddingTop=\"10dp\" >\n\n        <ImageView\n            android:id=\"@+id/iv_avatar\"\n            style=\"@style/AvatarLarge\"\n            android:contentDescription=\"@string/avatar\" />\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            android:paddingStart=\"10dp\">\n\n            <TextView\n                android:id=\"@+id/tv_issue_author\"\n                style=\"@style/ListSubtitleText\"\n                android:singleLine=\"true\"\n                android:textIsSelectable=\"true\"\n                android:textStyle=\"bold\" />\n\n            <TextView\n                android:id=\"@+id/tv_issue_creation_date\"\n                style=\"@style/ListSubtitleText\"\n                android:singleLine=\"true\" />\n        </LinearLayout>\n    </LinearLayout>\n\n    <TextView\n        android:id=\"@+id/tv_issue_title\"\n        style=\"@style/ListTitleText\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:paddingBottom=\"10dp\"\n        android:paddingLeft=\"10dp\"\n        android:paddingRight=\"10dp\"\n        android:paddingTop=\"5dp\"\n        android:textIsSelectable=\"true\" />\n\n    <TextView\n        android:id=\"@+id/tv_labels\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:paddingBottom=\"10dp\"\n        android:paddingLeft=\"10dp\"\n        android:paddingRight=\"10dp\"\n        android:textIsSelectable=\"true\" />\n\n    <LinearLayout\n        android:id=\"@+id/ll_milestone\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"10dp\"\n        android:layout_marginLeft=\"10dp\"\n        android:layout_marginRight=\"10dp\"\n        android:background=\"@drawable/inset_background\"\n        android:gravity=\"center_vertical\"\n        android:orientation=\"vertical\"\n        android:padding=\"10dp\" >\n\n        <TextView\n            android:id=\"@+id/tv_milestone\"\n            style=\"@style/ListSubtitleText\"\n            android:singleLine=\"true\"\n            android:textColor=\"@color/text\" />\n\n        <include layout=\"@layout/milestone\" />\n    </LinearLayout>\n\n    <LinearLayout\n        android:id=\"@+id/ll_assignee\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"5dp\"\n        android:layout_marginLeft=\"10dp\"\n        android:layout_marginRight=\"10dp\"\n        android:background=\"@drawable/inset_background\"\n        android:gravity=\"center_vertical\"\n        android:orientation=\"horizontal\"\n        android:paddingBottom=\"15dp\"\n        android:paddingLeft=\"10dp\"\n        android:paddingRight=\"10dp\"\n        android:paddingTop=\"15dp\" >\n\n        <ImageView\n            android:id=\"@+id/iv_assignee_avatar\"\n            style=\"@style/AvatarMedium\"\n            android:layout_marginEnd=\"5dp\"\n            android:contentDescription=\"@string/avatar\" />\n\n        <TextView\n            android:id=\"@+id/tv_assignee_name\"\n            style=\"@style/ListSubtitleText\"\n            android:singleLine=\"true\"\n            android:textColor=\"@color/text\" />\n    </LinearLayout>\n\n    <com.github.pockethub.android.ui.view.LinkTextView\n        android:id=\"@+id/tv_issue_body\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:paddingBottom=\"10dp\"\n        android:paddingLeft=\"10dp\"\n        android:paddingRight=\"10dp\"\n        android:paddingTop=\"5dp\"\n        android:textColor=\"@color/text\"\n        android:textColorLink=\"@color/text_link\"\n        android:textIsSelectable=\"true\"\n        android:focusable=\"true\" />\n\n    <LinearLayout\n        android:id=\"@+id/ll_issue_commits\"\n        style=\"@style/HeaderListItem\"\n        android:layout_width=\"match_parent\"\n        android:layout_marginLeft=\"10dp\"\n        android:layout_marginRight=\"10dp\"\n        android:background=\"@drawable/inset_background\"\n        android:orientation=\"horizontal\"\n        android:visibility=\"gone\" >\n\n        <com.github.pockethub.android.ui.view.OcticonTextView\n            android:id=\"@+id/tv_commit_icon\"\n            style=\"@style/PrimaryIcon\"\n            android:paddingEnd=\"5dp\" />\n\n        <TextView\n            android:id=\"@+id/tv_pull_request_commits\"\n            style=\"@style/ListTitleText\"\n            android:paddingBottom=\"0dp\"\n            android:layout_gravity=\"center_vertical\"\n            android:singleLine=\"true\"\n            android:textIsSelectable=\"true\" />\n\n    </LinearLayout>\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/issue_number.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:layout_alignParentStart=\"true\"\n    android:layout_alignParentTop=\"true\"\n    android:orientation=\"vertical\" >\n\n    <TextView\n        android:id=\"@+id/tv_issue_number\"\n        style=\"@style/IssueNumber\" />\n\n    <View\n        android:id=\"@+id/v_label0\"\n        style=\"@style/ListLabel\" />\n\n    <View\n        android:id=\"@+id/v_label1\"\n        style=\"@style/ListLabel\" />\n\n    <View\n        android:id=\"@+id/v_label2\"\n        style=\"@style/ListLabel\" />\n\n    <View\n        android:id=\"@+id/v_label3\"\n        style=\"@style/ListLabel\" />\n\n    <View\n        android:id=\"@+id/v_label4\"\n        style=\"@style/ListLabel\" />\n\n    <View\n        android:id=\"@+id/v_label5\"\n        style=\"@style/ListLabel\" />\n\n    <View\n        android:id=\"@+id/v_label6\"\n        style=\"@style/ListLabel\" />\n\n    <View\n        android:id=\"@+id/v_label7\"\n        style=\"@style/ListLabel\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/issues_filter_details.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<merge xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <TextView\n        android:id=\"@+id/tv_filter_state\"\n        style=\"@style/ListTitleText\"\n        android:paddingBottom=\"0dp\"\n        android:singleLine=\"true\" />\n\n    <LinearLayout\n        android:id=\"@+id/ll_assignee\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"4dp\"\n        android:gravity=\"center_vertical\"\n        android:paddingBottom=\"2dp\" >\n\n        <ImageView\n            android:id=\"@+id/iv_assignee_avatar\"\n            style=\"@style/AvatarMedium\"\n            android:contentDescription=\"@string/avatar\" />\n\n        <TextView\n            android:id=\"@+id/tv_filter_assignee\"\n            style=\"@style/ListSubtitleText\"\n            android:paddingStart=\"5dp\"\n            android:singleLine=\"true\"\n            android:textStyle=\"bold\" />\n\n        <TextView\n            style=\"@style/ListSubtitleText\"\n            android:paddingStart=\"5dp\"\n            android:singleLine=\"true\"\n            android:text=\"@string/assigned\" />\n    </LinearLayout>\n\n    <TextView\n        android:id=\"@+id/tv_filter_labels\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:lineSpacingExtra=\"5dp\" />\n\n    <TextView\n        android:id=\"@+id/tv_filter_milestone\"\n        style=\"@style/ListSubtitleText\"\n        android:paddingTop=\"2dp\"\n        android:singleLine=\"true\"\n        android:textStyle=\"bold\" />\n\n</merge>\n"
  },
  {
    "path": "app/src/main/res/layout/issues_filter_header.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    style=\"@style/HeaderListItem\"\n    android:orientation=\"vertical\" >\n\n    <include layout=\"@layout/issues_filter_details\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/issues_filter_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    style=\"@style/ListItem\"\n    android:orientation=\"horizontal\" >\n\n    <ImageView\n        android:id=\"@+id/iv_avatar\"\n        style=\"@style/AvatarLarge\"\n        android:layout_alignParentStart=\"true\"\n        android:layout_alignParentTop=\"true\"\n        android:layout_marginEnd=\"10dp\"\n        android:layout_marginTop=\"4dp\"\n        android:contentDescription=\"@string/avatar\" />\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_alignParentTop=\"true\"\n        android:layout_toEndOf=\"@id/iv_avatar\"\n        android:orientation=\"vertical\" >\n\n        <TextView\n            android:id=\"@+id/tv_repo_name\"\n            style=\"@style/ListSubtitleText\"\n            android:singleLine=\"true\" />\n\n        <include layout=\"@layout/issues_filter_details\" />\n    </LinearLayout>\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/issues_filter_list.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Copyright (c) 2015 PocketHub\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<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <androidx.appcompat.widget.Toolbar\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:theme=\"@style/ToolbarTheme\"\n        android:minHeight=\"?attr/actionBarSize\"\n        android:background=\"?attr/colorPrimary\"\n        android:layout_alignParentTop=\"true\"\n        android:id=\"@+id/toolbar\" />\n\n    <fragment\n        android:id=\"@+id/list\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_below=\"@id/toolbar\"\n        class=\"com.github.pockethub.android.ui.issue.FilterListFragment\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/label_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    style=\"@style/ListItem\"\n    android:gravity=\"center_vertical\"\n    android:orientation=\"horizontal\" >\n\n    <CheckBox\n        android:id=\"@+id/cb_selected\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:clickable=\"false\"\n        android:focusable=\"false\"\n        android:focusableInTouchMode=\"false\" />\n\n    <TextView\n        android:id=\"@+id/tv_label_name\"\n        style=\"@style/ListTitleText\"\n        android:paddingBottom=\"0dp\"\n        android:paddingStart=\"10dp\"\n        android:textStyle=\"normal\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/loading_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    style=\"@style/ListItem\">\n\n    <ProgressBar\n        android:layout_gravity=\"center\"\n        android:id=\"@+id/pb_loading\"\n        style=\"@style/Spinner\"\n        android:layout_width=\"32dp\"\n        android:layout_height=\"32dp\" />\n\n</FrameLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/login.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Copyright (c) 2015 PocketHub\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<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <androidx.appcompat.widget.Toolbar\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:theme=\"@style/ToolbarTheme\"\n        android:minHeight=\"?attr/actionBarSize\"\n        android:background=\"?attr/colorPrimary\"\n        android:id=\"@+id/toolbar\" />\n\n    <TextView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"16dp\"\n        android:gravity=\"center_horizontal\"\n        android:textColor=\"@color/primary_dark\"\n        style=\"@style/TextAppearance.AppCompat.Subhead\"\n        android:text=\"@string/temporary_login_message\"\n        android:linksClickable=\"true\"\n        android:autoLink=\"web\"/>\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/markwon_adapter.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<TextView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/text\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_marginLeft=\"16dip\"\n    android:layout_marginRight=\"16dip\"\n    android:lineSpacingExtra=\"2dip\"\n    android:paddingTop=\"8dip\"\n    android:paddingBottom=\"8dip\"\n    android:textAppearance=\"?android:attr/textAppearanceMedium\"\n    android:textColor=\"#000\"\n    android:textSize=\"14sp\"\n    tools:text=\"Hello\" />"
  },
  {
    "path": "app/src/main/res/layout/markwon_adapter_test.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<TextView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/text\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_marginLeft=\"16dip\"\n    android:layout_marginRight=\"16dip\"\n    android:lineSpacingExtra=\"2dip\"\n    android:textAppearance=\"?android:attr/textAppearanceMedium\"\n    android:textColor=\"#000\"\n    android:textSize=\"14sp\"\n    tools:text=\"Hello\" />"
  },
  {
    "path": "app/src/main/res/layout/markwon_table_block.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<HorizontalScrollView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:clipChildren=\"false\"\n    android:clipToPadding=\"false\"\n    android:paddingLeft=\"16dip\"\n    android:paddingTop=\"8dip\"\n    android:paddingRight=\"16dip\"\n    android:paddingBottom=\"8dip\"\n    android:scrollbarStyle=\"outsideInset\">\n\n    <TableLayout\n        android:id=\"@+id/table_layout\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:stretchColumns=\"*\" />\n\n</HorizontalScrollView>"
  },
  {
    "path": "app/src/main/res/layout/markwon_table_cell.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<TextView 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:lineSpacingExtra=\"2dip\"\n    android:paddingTop=\"8dip\"\n    android:paddingBottom=\"8dip\"\n    android:textAppearance=\"?android:attr/textAppearanceMedium\"\n    android:textColor=\"#000\"\n    android:textSize=\"14sp\"\n    tools:text=\"Hello\" />"
  },
  {
    "path": "app/src/main/res/layout/milestone.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/ll_milestone_graph\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"16dp\"\n    android:layout_marginTop=\"5dp\"\n    android:background=\"@drawable/milestone_background\"\n    android:orientation=\"horizontal\"\n    android:padding=\".5dp\"\n    android:weightSum=\"1.0\" >\n\n    <View\n        android:id=\"@+id/v_closed\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"match_parent\"\n        android:layout_weight=\"0\"\n        android:background=\"@drawable/milestone_closed_background\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/milestone_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    style=\"@style/ListItem\" >\n\n    <RadioButton\n        android:id=\"@+id/rb_selected\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentStart=\"true\"\n        android:layout_centerVertical=\"true\"\n        android:clickable=\"false\"\n        android:focusable=\"false\"\n        android:focusableInTouchMode=\"false\" />\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerVertical=\"true\"\n        android:layout_toEndOf=\"@id/rb_selected\"\n        android:orientation=\"vertical\"\n        android:paddingStart=\"5dp\">\n\n        <TextView\n            android:id=\"@+id/tv_milestone_title\"\n            style=\"@style/ListTitleText\"\n            android:singleLine=\"true\" />\n\n        <TextView\n            android:id=\"@+id/tv_milestone_description\"\n            style=\"@style/ListSubtitleText\"\n            android:singleLine=\"true\" />\n    </LinearLayout>\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/news_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    style=\"@style/ListItem\" >\n\n    <ImageView\n        android:id=\"@+id/iv_avatar\"\n        style=\"@style/AvatarLarge\"\n        android:layout_alignParentStart=\"true\"\n        android:layout_alignParentTop=\"true\"\n        android:layout_marginEnd=\"10dp\"\n        android:contentDescription=\"@string/avatar\" />\n\n    <com.github.pockethub.android.ui.view.LinkTextView\n        android:id=\"@+id/tv_event\"\n        style=\"@style/ListTitleText\"\n        android:layout_alignParentTop=\"true\"\n        android:layout_toEndOf=\"@id/iv_avatar\"\n        android:paddingBottom=\"5dp\"\n        android:textSize=\"15sp\"\n        android:textStyle=\"normal\" />\n\n    <TextView\n        android:id=\"@+id/tv_event_details\"\n        style=\"@style/ListTitleText\"\n        android:layout_alignStart=\"@id/tv_event\"\n        android:layout_below=\"@+id/tv_event\"\n        android:lineSpacingExtra=\"3dp\"\n        android:maxLines=\"3\"\n        android:paddingBottom=\"5dp\"\n        android:textColor=\"@color/text_news_details\"\n        android:textSize=\"14sp\"\n        android:textStyle=\"normal\" />\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignStart=\"@id/tv_event_details\"\n        android:layout_below=\"@+id/tv_event_details\"\n        android:gravity=\"center_vertical\"\n        android:orientation=\"horizontal\" >\n\n        <com.github.pockethub.android.ui.view.OcticonTextView\n            android:id=\"@+id/tv_event_icon\"\n            style=\"@style/EventIcon\" />\n\n        <TextView\n            android:id=\"@+id/tv_event_date\"\n            style=\"@style/ListSubtitleText\"\n            android:paddingStart=\"5dp\"\n            android:singleLine=\"true\" />\n    </LinearLayout>\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/notification_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"horizontal\"\n    android:padding=\"16dp\">\n\n    <com.github.pockethub.android.ui.view.OcticonTextView\n        android:id=\"@+id/tv_notification_icon\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center_vertical\"\n        android:textColor=\"@color/accent\"\n        style=\"@style/PrimaryIcon\"/>\n\n    <LinearLayout\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_weight=\"1\"\n        android:orientation=\"vertical\"\n        android:paddingLeft=\"16dp\"\n        android:paddingRight=\"16dp\">\n\n        <TextView\n            android:id=\"@+id/tv_notification_title\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"/>\n\n        <TextView\n            android:id=\"@+id/tv_notification_date\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"8dp\"/>\n    </LinearLayout>\n\n    <com.github.pockethub.android.ui.view.OcticonTextView\n        android:id=\"@+id/tv_notification_read_icon\"\n        android:layout_width=\"24dp\"\n        android:layout_height=\"24dp\"\n        android:layout_gravity=\"center_vertical\"/>\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/notification_item_header.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:orientation=\"horizontal\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:padding=\"16dp\">\n\n    <TextView\n        android:id=\"@+id/tv_name\"\n        style=\"@style/TextAppearance.AppCompat.Subhead\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center_vertical\"\n        android:layout_marginEnd=\"16dp\"\n        android:layout_weight=\"1\" />\n\n    <com.github.pockethub.android.ui.view.OcticonTextView\n        android:id=\"@+id/tv_notifications_read_icon\"\n        android:layout_width=\"24dp\"\n        android:layout_height=\"24dp\"\n        android:layout_gravity=\"center_vertical\"/>\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/pager_with_tabs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Copyright (c) 2015 PocketHub\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     http://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<androidx.coordinatorlayout.widget.CoordinatorLayout\n    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    <com.google.android.material.appbar.AppBarLayout\n        android:id=\"@+id/appbar\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:theme=\"@style/ThemeOverlay.AppCompat.Dark.ActionBar\">\n\n        <androidx.appcompat.widget.Toolbar\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:theme=\"@style/ToolbarTheme\"\n            android:layout_alignParentTop=\"true\"\n            android:minHeight=\"?attr/actionBarSize\"\n            android:background=\"?attr/colorPrimary\"\n            android:id=\"@+id/toolbar\" />\n\n        <com.google.android.material.tabs.TabLayout\n            android:layout_below=\"@id/toolbar\"\n            android:id=\"@+id/sliding_tabs_layout\"\n            app:tabIndicatorColor=\"@android:color/white\"\n            app:tabMode=\"scrollable\"\n            android:background=\"@color/primary\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\" />\n\n    </com.google.android.material.appbar.AppBarLayout>\n\n    <com.github.pockethub.android.ui.ViewPager\n        android:id=\"@+id/vp_pages\"\n        app:layout_behavior=\"@string/appbar_scrolling_view_behavior\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n</androidx.coordinatorlayout.widget.CoordinatorLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/path_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     http://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/rl_path\"\n    style=\"@style/HeaderListItem\" >\n\n    <com.github.pockethub.android.ui.view.OcticonTextView\n        android:id=\"@+id/tv_folder_icon\"\n        style=\"@style/PrimaryIcon\"\n        android:layout_alignParentStart=\"true\"\n        android:layout_centerVertical=\"true\"\n        android:text=\"@string/icon_folders\" />\n\n    <com.github.pockethub.android.ui.view.LinkTextView\n        android:id=\"@+id/tv_path\"\n        style=\"@style/HeaderTitleText\"\n        android:layout_centerVertical=\"true\"\n        android:layout_toEndOf=\"@id/tv_folder_icon\"\n        android:lineSpacingExtra=\"2dp\"\n        android:paddingTop=\"2dp\"\n        android:singleLine=\"false\"\n        android:textColorLink=\"@color/text_link\"\n        android:textStyle=\"normal\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/ref_footer.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    style=\"@style/ListItem\"\n    android:layout_width=\"match_parent\"\n    android:layout_alignParentBottom=\"true\"\n    android:layout_alignParentStart=\"true\"\n    android:background=\"@drawable/footer_selector\"\n    android:paddingBottom=\"8dp\"\n    android:paddingTop=\"8dp\"\n    android:visibility=\"gone\" >\n\n    <com.github.pockethub.android.ui.view.OcticonTextView\n        android:id=\"@+id/tv_branch_icon\"\n        style=\"@style/PrimaryIcon\"\n        android:layout_alignParentStart=\"true\"\n        android:layout_alignParentTop=\"true\"\n        android:text=\"@string/icon_fork\"\n        android:textColor=\"@color/actionbar_text\" />\n\n    <TextView\n        android:id=\"@+id/tv_branch\"\n        style=\"@style/HeaderTitleText\"\n        android:layout_centerVertical=\"true\"\n        android:layout_toEndOf=\"@id/tv_branch_icon\"\n        android:paddingBottom=\"0dp\"\n        android:textColor=\"@color/actionbar_text\"\n        android:textSize=\"15sp\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/ref_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    style=\"@style/ListItem\" >\n\n    <RadioButton\n        android:id=\"@+id/rb_selected\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentStart=\"true\"\n        android:layout_centerVertical=\"true\"\n        android:clickable=\"false\"\n        android:focusable=\"false\"\n        android:focusableInTouchMode=\"false\"\n        android:paddingEnd=\"10dp\" />\n\n    <com.github.pockethub.android.ui.view.OcticonTextView\n        android:id=\"@+id/tv_ref_icon\"\n        style=\"@style/PrimaryIcon\"\n        android:layout_centerVertical=\"true\"\n        android:layout_toEndOf=\"@id/rb_selected\"\n        android:text=\"@string/icon_fork\" />\n\n    <TextView\n        android:id=\"@+id/tv_ref\"\n        style=\"@style/ListTitleText\"\n        android:layout_width=\"match_parent\"\n        android:layout_centerVertical=\"true\"\n        android:layout_toEndOf=\"@id/tv_ref_icon\"\n        android:paddingBottom=\"0dp\"\n        android:paddingStart=\"10dp\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/repo_details.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<merge xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <TextView\n        android:id=\"@+id/tv_repo_name\"\n        style=\"@style/ListTitleText\"\n        android:paddingBottom=\"0dp\"\n        android:singleLine=\"true\"\n        android:textStyle=\"normal\" />\n\n    <TextView\n        android:id=\"@+id/tv_repo_description\"\n        style=\"@style/ListSubtitleText\"\n        android:singleLine=\"true\"\n        android:textColor=\"@color/text_description\" />\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        android:paddingTop=\"6dp\" >\n\n        <TextView\n            android:id=\"@+id/tv_language\"\n            style=\"@style/ListSubtitleText\"\n            android:paddingEnd=\"15dp\" />\n\n        <com.github.pockethub.android.ui.view.OcticonTextView\n            android:id=\"@+id/tv_watchers_icon\"\n            style=\"@style/ListIcon\"\n            android:text=\"@string/icon_star\" />\n\n        <TextView\n            android:id=\"@+id/tv_watchers\"\n            style=\"@style/ListNumericSubtitleText\"\n            android:paddingStart=\"3dp\"\n            android:paddingEnd=\"15dp\" />\n\n        <com.github.pockethub.android.ui.view.OcticonTextView\n            android:id=\"@+id/tv_forks_icon\"\n            style=\"@style/ListIcon\"\n            android:text=\"@string/icon_fork\" />\n\n        <TextView\n            android:id=\"@+id/tv_forks\"\n            style=\"@style/ListNumericSubtitleText\"\n            android:paddingStart=\"3dp\" />\n    </LinearLayout>\n\n</merge>\n"
  },
  {
    "path": "app/src/main/res/layout/repo_dialog.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<ScrollView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:overScrollMode=\"ifContentScrolls\" >\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\" >\n\n        <LinearLayout\n            android:id=\"@+id/ll_owner_area\"\n            style=\"@style/ListItem\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:clickable=\"true\"\n            android:gravity=\"center_vertical\"\n            android:orientation=\"horizontal\" >\n\n            <ImageView\n                android:id=\"@+id/iv_owner_avatar\"\n                style=\"@style/AvatarLarge\"\n                android:contentDescription=\"@string/avatar\" />\n\n            <TextView\n                android:id=\"@+id/tv_owner_name\"\n                style=\"@style/ListTitleText\"\n                android:layout_width=\"match_parent\"\n                android:includeFontPadding=\"true\"\n                android:singleLine=\"true\"\n                android:paddingBottom=\"0dp\"\n                android:paddingStart=\"10dp\"\n                android:textStyle=\"normal\" />\n        </LinearLayout>\n\n        <View\n            android:id=\"@+id/divider\"\n            style=\"@style/Separator\"\n            android:visibility=\"gone\" />\n\n        <LinearLayout\n            android:id=\"@+id/ll_recent_repo_area\"\n            style=\"@style/ListItem\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:clickable=\"true\"\n            android:gravity=\"center_vertical\"\n            android:orientation=\"horizontal\"\n            android:visibility=\"gone\" >\n\n            <ImageView\n                android:id=\"@+id/iv_recent_repo_avatar\"\n                style=\"@style/AvatarLarge\"\n                android:src=\"@drawable/ic_history_white_24dp\"\n                android:contentDescription=\"@string/recent_remove\" />\n\n            <TextView\n                android:id=\"@+id/tv_recent_repo_remove\"\n                style=\"@style/ListTitleText\"\n                android:text=\"@string/recent_list_remove\"\n                android:layout_width=\"match_parent\"\n                android:includeFontPadding=\"true\"\n                android:maxLines=\"2\"\n                android:paddingBottom=\"0dp\"\n                android:paddingStart=\"10dp\"\n                android:textStyle=\"normal\" />\n        </LinearLayout>\n    </LinearLayout>\n\n</ScrollView>\n"
  },
  {
    "path": "app/src/main/res/layout/repo_header_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n              android:orientation=\"vertical\"\n              android:layout_width=\"match_parent\"\n              android:layout_height=\"wrap_content\"\n              android:background=\"@color/background\"\n              android:paddingTop=\"10dp\" >\n\n    <TextView\n        android:id=\"@+id/tv_header\"\n        style=\"@style/ListSubtitleText\"\n        android:paddingBottom=\"5dp\"\n        android:paddingStart=\"10dp\"\n        android:textColor=\"@color/text_recent\" />\n\n    <View\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"1dp\"\n        android:background=\"@color/text_recent\" />\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/repo_issue_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    style=\"@style/ListItem\"\n    android:paddingStart=\"0dp\">\n\n    <include\n        android:id=\"@+id/ll_issue_number\"\n        layout=\"@layout/issue_number\" />\n\n    <TextView\n        android:id=\"@+id/tv_issue_title\"\n        style=\"@style/ListTitleText\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignTop=\"@id/ll_issue_number\"\n        android:layout_toEndOf=\"@id/ll_issue_number\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"2\"\n        android:paddingStart=\"10dp\" />\n\n    <LinearLayout\n        android:id=\"@+id/ll_lines\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignStart=\"@id/tv_issue_title\"\n        android:layout_below=\"@id/tv_issue_title\"\n        android:gravity=\"center_vertical\"\n        android:includeFontPadding=\"false\"\n        android:orientation=\"horizontal\"\n        android:paddingStart=\"10dp\"\n        android:paddingTop=\"2dp\" >\n\n        <include layout=\"@layout/issue_details\" />\n    </LinearLayout>\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/tabbed_progress_pager.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:gravity=\"center\"\n    android:orientation=\"vertical\" >\n\n    <include layout=\"@layout/pager_with_tabs\" />\n\n    <ProgressBar\n        android:id=\"@+id/pb_loading\"\n        style=\"@style/ListSpinner\"\n        android:visibility=\"gone\"\n        android:layout_gravity=\"center\"/>\n\n</FrameLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/user_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    style=\"@style/ListItem\"\n    android:gravity=\"center_vertical\"\n    android:orientation=\"horizontal\">\n\n    <ImageView\n        android:id=\"@+id/iv_avatar\"\n        style=\"@style/AvatarLarge\"\n        android:src=\"@drawable/gravatar_icon\"\n        android:contentDescription=\"@string/avatar\" />\n\n    <TextView\n        android:id=\"@+id/tv_login\"\n        style=\"@style/ListTitleText\"\n        android:layout_width=\"match_parent\"\n        android:paddingStart=\"10dp\"\n        android:paddingTop=\"4dp\"\n        android:singleLine=\"true\"\n        android:textStyle=\"normal\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/user_repo_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    style=\"@style/ListItem\"\n    android:gravity=\"center_vertical\" >\n\n    <com.github.pockethub.android.ui.view.OcticonTextView\n        android:id=\"@+id/tv_repo_icon\"\n        style=\"@style/PrimaryIcon\"\n        android:layout_alignParentStart=\"true\"\n        android:layout_alignParentTop=\"true\" />\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_alignParentTop=\"true\"\n        android:layout_toEndOf=\"@id/tv_repo_icon\"\n        android:orientation=\"vertical\"\n        android:paddingStart=\"10dp\">\n\n        <include layout=\"@layout/repo_details\" />\n    </LinearLayout>\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/menu/activity_comment.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\" >\n\n    <item\n        android:id=\"@+id/m_apply\"\n        android:enabled=\"false\"\n        android:icon=\"@drawable/ic_done_white_24dp\"\n        app:showAsAction=\"ifRoom\"\n        android:title=\"@string/comment\"/>\n\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/activity_create_gist.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n      xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <item\n        android:id=\"@+id/create_gist\"\n        android:titleCondensed=\"@string/create\"\n        android:title=\"@string/create_gist\"\n        android:icon=\"@drawable/ic_done_white_24dp\"\n        app:showAsAction=\"ifRoom\"/>\n</menu>"
  },
  {
    "path": "app/src/main/res/menu/activity_file_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\" >\n\n  <item\n    android:id=\"@+id/m_wrap\"\n    app:showAsAction=\"never\"\n    android:title=\"@string/enable_wrapping\"/>\n  <item\n    android:id=\"@+id/m_render_markdown\"\n    android:enabled=\"false\"\n    app:showAsAction=\"never\"\n    android:title=\"@string/render_markdown\"\n    android:visible=\"false\"/>\n  <item\n    android:id=\"@+id/m_share\"\n    android:icon=\"@android:drawable/ic_menu_share\"\n    app:showAsAction=\"never\"\n    android:title=\"@string/share\"/>\n\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/activity_issue_edit.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\" >\n\n    <item\n        android:id=\"@+id/m_apply\"\n        android:enabled=\"false\"\n        android:icon=\"@drawable/ic_done_white_24dp\"\n        app:showAsAction=\"ifRoom\"\n        android:title=\"@string/save\"/>\n\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/activity_issue_filter.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\" >\n\n    <item\n        android:id=\"@+id/m_apply\"\n        android:icon=\"@drawable/ic_done_white_24dp\"\n        app:showAsAction=\"ifRoom\"\n        android:title=\"@string/save\"/>\n\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/activity_login.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\" >\n\n    <item\n        android:id=\"@+id/m_login\"\n        app:showAsAction=\"always\"\n        android:title=\"@string/log_in\"/>\n\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\" >\n\n    <item\n        android:id=\"@+id/m_search\"\n        android:icon=\"@drawable/ic_search_white_24dp\"\n        app:showAsAction=\"ifRoom|collapseActionView\"\n        android:title=\"@string/find_repositories\"\n        app:actionViewClass=\"androidx.appcompat.widget.SearchView\"\n        />\n\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/activity_repository.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\" >\n\n    <item\n        android:id=\"@+id/m_star\"\n        app:showAsAction=\"never\"\n        android:title=\"@string/star\"/>\n    <item\n        android:id=\"@+id/m_fork\"\n        app:showAsAction=\"never\"\n        android:title=\"@string/fork\" />\n    <item\n        android:id=\"@+id/m_contributors\"\n        app:showAsAction=\"never\"\n        android:title=\"@string/contributors\"/>\n    <item\n        android:id=\"@+id/m_share\"\n        app:showAsAction=\"never\"\n        android:title=\"@string/share\"/>\n    <item\n        android:id=\"@+id/m_parent_repo\"\n        app:showAsAction=\"never\"\n        android:title=\"@string/parent_repo\"/>\n    <item\n        android:id=\"@+id/m_delete\"\n        app:showAsAction=\"never\"\n        android:title=\"@string/delete\"\n        />\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/activity_search.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\" >\n\n    <item\n        android:id=\"@+id/m_search\"\n        android:icon=\"@drawable/ic_search_white_24dp\"\n        app:showAsAction=\"ifRoom|collapseActionView\"\n        app:actionViewClass=\"androidx.appcompat.widget.SearchView\"\n        android:title=\"@string/find_repositories\"/>\n    <item\n        android:id=\"@+id/m_clear\"\n        app:showAsAction=\"never\"\n        android:title=\"@string/clear_search_history\"/>\n\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/activity_user_follow.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\" >\n\n    <item\n        android:id=\"@+id/m_follow\"\n        app:showAsAction=\"never\"\n        android:title=\"@string/follow\" />\n\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/fragment_code_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <item\n        android:id=\"@+id/m_wrap\"\n        app:showAsAction=\"never\"\n        android:title=\"@string/enable_wrapping\"/>\n\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/fragment_commit_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\" >\n\n    <item\n        android:id=\"@+id/m_comment\"\n        android:icon=\"@drawable/ic_comment_white_24dp\"\n        app:showAsAction=\"ifRoom\"\n        android:title=\"@string/comment\"/>\n    <item\n        android:id=\"@+id/m_copy_hash\"\n        app:showAsAction=\"never\"\n        android:title=\"@string/copy_hash\" />\n    <item\n        android:id=\"@+id/m_share\"\n        android:icon=\"@android:drawable/ic_menu_share\"\n        app:showAsAction=\"never\"\n        android:title=\"@string/share\"/>\n    <item\n        android:id=\"@+id/m_refresh\"\n        android:icon=\"@drawable/ic_refresh_white_24dp\"\n        app:showAsAction=\"never\"\n        android:title=\"@string/refresh\"/>\n\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/fragment_gist_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\" >\n\n    <item\n        android:id=\"@+id/m_comment\"\n        android:icon=\"@drawable/ic_comment_white_24dp\"\n        app:showAsAction=\"ifRoom\"\n        android:title=\"@string/comment\"/>\n    <item\n        android:id=\"@+id/m_delete\"\n        android:icon=\"@drawable/ic_delete_white_24dp\"\n        app:showAsAction=\"never\"\n        android:title=\"@string/delete\"/>\n    <item\n        android:id=\"@+id/m_star\"\n        android:icon=\"@drawable/ic_star_white_24dp\"\n        app:showAsAction=\"never\"\n        android:title=\"@string/star\"/>\n    <item\n        android:id=\"@+id/m_share\"\n        android:icon=\"@android:drawable/ic_menu_share\"\n        app:showAsAction=\"never\"\n        android:title=\"@string/share\"/>\n    <item\n        android:id=\"@+id/m_refresh\"\n        android:icon=\"@drawable/ic_refresh_white_24dp\"\n        app:showAsAction=\"never\"\n        android:title=\"@string/refresh\"/>\n\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/fragment_gists.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\" >\n\n    <item\n        android:id=\"@+id/m_create\"\n        android:icon=\"@drawable/ic_add_white_24dp\"\n        app:showAsAction=\"ifRoom\"\n        android:title=\"@string/create_gist\"/>\n\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/fragment_issue_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\" >\n\n    <item\n        android:id=\"@+id/m_comment\"\n        android:icon=\"@drawable/ic_comment_white_24dp\"\n        app:showAsAction=\"ifRoom\"\n        android:title=\"@string/comment\"/>\n    <item\n        android:id=\"@+id/m_edit\"\n        android:icon=\"@drawable/ic_edit_white_24dp\"\n        app:showAsAction=\"never\"\n        android:title=\"@string/edit\"/>\n    <item\n        android:id=\"@+id/m_state\"\n        android:icon=\"@drawable/ic_github_issue_closed_white_24dp\"\n        app:showAsAction=\"never\"\n        android:title=\"@string/close\"/>\n    <item\n        android:id=\"@+id/m_share\"\n        android:icon=\"@android:drawable/ic_menu_share\"\n        app:showAsAction=\"never\"\n        android:title=\"@string/share\"/>\n    <item\n        android:id=\"@+id/m_refresh\"\n        android:icon=\"@drawable/ic_refresh_white_24dp\"\n        app:showAsAction=\"never\"\n        android:title=\"@string/refresh\"/>\n\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/fragment_issues.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\" >\n\n    <item\n        android:id=\"@+id/m_bookmark\"\n        android:icon=\"@drawable/ic_bookmark_white_24dp\"\n        app:showAsAction=\"never\"\n        android:title=\"@string/bookmark\"/>\n    <item\n        android:id=\"@+id/m_filter\"\n        android:icon=\"@drawable/ic_filter_list_white_24dp\"\n        app:showAsAction=\"never\"\n        android:title=\"@string/filter\"/>\n    <item\n        android:id=\"@+id/create_issue\"\n        android:icon=\"@drawable/ic_add_white_24dp\"\n        app:showAsAction=\"ifRoom\"\n        android:title=\"@string/create\"/>\n    <item\n        android:id=\"@+id/m_search\"\n        android:icon=\"@drawable/ic_search_white_24dp\"\n        app:showAsAction=\"ifRoom|collapseActionView\"\n        app:actionViewClass=\"androidx.appcompat.widget.SearchView\"\n        android:title=\"@string/find_issues\"/>\n    <item\n        android:id=\"@+id/m_refresh\"\n        android:icon=\"@drawable/ic_refresh_white_24dp\"\n        app:showAsAction=\"never\"\n        android:title=\"@string/refresh\"/>\n\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/fragment_refresh.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\" >\n\n    <item\n        android:id=\"@+id/m_refresh\"\n        android:icon=\"@drawable/ic_refresh_white_24dp\"\n        app:showAsAction=\"ifRoom\"\n        android:title=\"@string/refresh\"/>\n\n</menu>\n"
  },
  {
    "path": "app/src/main/res/menu/navigation.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     http://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <group android:checkableBehavior=\"single\">\n        <item\n            android:id=\"@+id/navigation_home\"\n            android:icon=\"@drawable/ic_github_home_black_24dp\"\n            android:checked=\"true\"\n            android:title=\"@string/home\" />\n        <item\n            android:id=\"@+id/navigation_gists\"\n            android:icon=\"@drawable/ic_github_gist_black_24dp\"\n            android:title=\"@string/gists\" />\n        <item\n            android:id=\"@+id/navigation_issue_dashboard\"\n            android:icon=\"@drawable/ic_github_dashboard_black_24dp\"\n            android:title=\"@string/issue_dashboard\" />\n        <item\n            android:id=\"@+id/navigation_bookmarks\"\n            android:icon=\"@drawable/ic_github_bookmark_black_24dp\"\n            android:title=\"@string/bookmarks\" />\n    </group>\n    <item\n        android:id=\"@+id/navigation_organizations\"\n        android:title=\"@string/organizations\">\n        <menu/>\n    </item>\n    <group\n        android:id=\"@+id/navigation_secondary\"\n        android:checkableBehavior=\"none\">\n        <item\n            android:id=\"@+id/navigation_log_out\"\n            android:checkable=\"false\"\n            android:icon=\"@drawable/ic_github_sign_out_black_24dp\"\n            android:title=\"@string/log_out\"/>\n    </group>\n</menu>\n"
  },
  {
    "path": "app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Copyright (c) 2015 PocketHub\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<resources>\n\n    <color name=\"background\">#F9F9F9</color>\n    <color name=\"background_id\">#E3E3E3</color>\n    <color name=\"background_selected\">#E8E8E8</color>\n    <color name=\"inset_background\">#F8F8F8</color>\n    <color name=\"inset_outer\">#C7C7C7</color>\n    <color name=\"inset_inner\">#FFFFFF</color>\n    <color name=\"text\">#1E1E1E</color>\n    <color name=\"text_light\">#AEAEAE</color>\n    <color name=\"text_icon\">#A8A8A8</color>\n    <color name=\"text_recent\">#3797C7</color>\n    <color name=\"text_description\">#666666</color>\n    <color name=\"footer\">#282828</color>\n    <color name=\"footer_pressed\">#515252</color>\n    <color name=\"actionbar_text\">#F4F2F1</color>\n    <color name=\"pager_title_background_top_start\">#1A4D6B</color>\n    <color name=\"pager_title_background_end\">#22688F</color>\n    <color name=\"edit_text_background\">#F8F8F8</color>\n    <color name=\"edit_text_inner\">#EDEDED</color>\n    <color name=\"edit_text_outer\">#959595</color>\n    <color name=\"edit_text_cursor\">#A6A6A6</color>\n    <color name=\"text_link\">#4183C4</color>\n    <color name=\"text_news_details\">#666666</color>\n    <color name=\"label_outer\">#55000000</color>\n    <color name=\"label_inner\">#55FFFFFF</color>\n    <color name=\"milestone_border\">#ABABAB</color>\n    <color name=\"milestone_opened_start\">#BEBEBE</color>\n    <color name=\"milestone_opened_end\">#DCDCDC</color>\n    <color name=\"milestone_closed_start\">#6AA811</color>\n    <color name=\"milestone_closed_end\">#6EB807</color>\n    <color name=\"state_background_closed\">#BD2C00</color>\n    <color name=\"state_text\">#FFFFFF</color>\n    <color name=\"diff_marker_bg\">#EAF2F5</color>\n    <color name=\"diff_marker_text\">#999999</color>\n    <color name=\"diff_add\">#DDFFDD</color>\n    <color name=\"diff_add_text\">#528E4C</color>\n    <color name=\"diff_remove\">#FFDDDD</color>\n    <color name=\"diff_remove_text\">#932121</color>\n    <color name=\"section_border\">#D0D0D0</color>\n    <color name=\"section_start\">#F9F9F9</color>\n    <color name=\"section_end\">#E0E0E0</color>\n    <color name=\"section_subtitle\">#555555</color>\n    <color name=\"issue_event_merged\">#6e5494</color>\n    <color name=\"issue_event_closed\">#bd2c00</color>\n    <color name=\"issue_event_reopened\">#6cc644</color>\n    <color name=\"issue_event_lock\">#333333</color>\n\n    <color name=\"primary\">#3D3D3D</color>\n    <color name=\"primary_dark\">#313131</color>\n    <color name=\"accent\">#3797C7</color>\n\n    <color name=\"appcompat_secondary_text_default_material_light\">#8a000000</color>\n    <color name=\"appcompat_secondary_text_disabled_material_light\">#24000000</color>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/dimens.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     http://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<resources>\n    <dimen name=\"toolbar_top_padding\">0dp</dimen>\n    <dimen name=\"nav_drawer_header_height\">152dp</dimen>\n    <dimen name=\"touch_target\">48dp</dimen>\n    <dimen name=\"activity_content_padding\">16dp</dimen>\n    <dimen name=\"label_padding_left\">10dp</dimen>\n    <dimen name=\"label_padding_right\">10dp</dimen>\n    <dimen name=\"label_padding_top\">8dp</dimen>\n    <dimen name=\"label_padding_bottom\">8dp</dimen>\n    <dimen name=\"image_loading_size\">24dp</dimen>\n    <dimen name=\"blob_indentation\">16dp</dimen>\n    <dimen name=\"folder_indentation\">16dp</dimen>\n</resources>"
  },
  {
    "path": "app/src/main/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Copyright (c) 2015 PocketHub\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<resources>\n\n    <!-- Error messages -->\n    <string name=\"error_orgs_load\">Loading account &amp; organizations failed</string>\n    <string name=\"error_issues_load\">Loading issues failed</string>\n    <string name=\"error_repos_load\">Loading repositories failed</string>\n    <string name=\"error_repo_load\">Loading repository failed</string>\n    <string name=\"error_contributors_load\">Loading contributors failed</string>\n    <string name=\"error_gist_load\">Loading Gist failed</string>\n    <string name=\"error_news_load\">Loading news failed</string>\n    <string name=\"error_followers_load\">Loading followers failed</string>\n    <string name=\"error_people_load\">Loading people failed</string>\n    <string name=\"error_person_load\">Loading person failed</string>\n    <string name=\"error_gist_file_load\">Loading Gist file content failed</string>\n    <string name=\"error_gists_load\">Loading Gists failed</string>\n    <string name=\"error_issue_load\">Loading issue failed</string>\n    <string name=\"error_collaborators_load\">Loading collaborators failed</string>\n    <string name=\"error_milestones_load\">Loading milestones failed</string>\n    <string name=\"error_labels_load\">Loading labels failed</string>\n    <string name=\"error_bookmarks_load\">Loading bookmarks failed</string>\n    <string name=\"error_members_load\">Loading members failed</string>\n    <string name=\"error_commits_load\">Loading commits failed</string>\n    <string name=\"error_commit_load\">Loading commit failed</string>\n    <string name=\"error_file_load\">Loading file failed</string>\n    <string name=\"error_code_load\">Loading code failed</string>\n    <string name=\"error_refs_load\">Loading branches &amp; tags failed</string>\n    <string name=\"error_following_person\">Following failed</string>\n    <string name=\"error_unfollowing_person\">Unfollowing failed</string>\n    <string name=\"error_checking_following_status\">Checking following status failed</string>\n    <string name=\"error_starring_repository\">Starring failed</string>\n    <string name=\"error_unstarring_repository\">Unstarring failed</string>\n    <string name=\"error_forking_repository\">Forking failed</string>\n    <string name=\"error_deleting_repository\">Deleting failed</string>\n    <string name=\"error_checking_starring_status\">Checking starring status failed</string>\n    <string name=\"error_rendering_markdown\">Rendering markdown failed</string>\n    <string name=\"error_users_search\">Searching users failed</string>\n    <!--  -->\n\n\n    <!-- Loading messages -->\n    <string name=\"loading_gist\">Loading Gist…</string>\n    <string name=\"loading_more_issues\">Loading More Issues…</string>\n    <string name=\"loading_issues\">Loading Issues…</string>\n    <string name=\"loading_comments\">Loading Comments…</string>\n    <string name=\"loading_repositories\">Loading Repositories…</string>\n    <string name=\"loading_issue\">Loading Issue…</string>\n    <string name=\"loading_news\">Loading News…</string>\n    <string name=\"loading_followers\">Loading Followers…</string>\n    <string name=\"loading_people\">Loading People…</string>\n    <string name=\"loading_gists\">Loading Gists…</string>\n    <string name=\"loading_collaborators\">Loading Collaborators…</string>\n    <string name=\"loading_milestones\">Loading Milestones…</string>\n    <string name=\"loading_labels\">Loading Labels…</string>\n    <string name=\"loading_commits\">Loading Commits…</string>\n    <string name=\"loading_files_and_comments\">Loading Files &amp; Comments…</string>\n    <string name=\"loading_refs\">Loading Branches &amp; Tags…</string>\n    <string name=\"loading\">Loading…</string>\n    <!--  -->\n\n\n    <!-- Empty messages -->\n    <string name=\"no_bookmarks\">No Bookmarks</string>\n    <string name=\"no_repositories\">No Repositories</string>\n    <string name=\"no_contributors\">No contributors</string>\n    <string name=\"no_issues\">No Issues</string>\n    <string name=\"no_gists\">No Gists</string>\n    <string name=\"no_people\">No People</string>\n    <string name=\"no_followers\">No Followers</string>\n    <string name=\"no_members\">No Members</string>\n    <string name=\"no_news\">No News</string>\n    <string name=\"no_commits\">No Commits</string>\n    <!--  -->\n\n\n    <!-- Updating messages -->\n    <string name=\"updating_assignee\">Updating Assignee…</string>\n    <string name=\"updating_issue\">Updating Issue…</string>\n    <string name=\"updating_labels\">Updating Labels…</string>\n    <string name=\"updating_milestone\">Updating Milestone…</string>\n    <!--  -->\n\n    <string name=\"app_name\" translatable=\"false\">PocketHub</string>\n    <string name=\"home\">Home</string>\n    <string name=\"log_out\">Log Out</string>\n    <string name=\"news\">News</string>\n    <string name=\"issues\">Issues</string>\n    <string name=\"gists\">Gists</string>\n    <string name=\"commits\">Commits</string>\n    <string name=\"global_search\">GitHub search</string>\n    <string name=\"find_repositories\">Find Repositories</string>\n    <string name=\"find_issues\">Find Issues</string>\n    <string name=\"search_title\">Search…</string>\n    <string name=\"clear_search_history\">Clear History</string>\n    <string name=\"search_history_cleared\">Search history cleared</string>\n    <string name=\"login_activity_authenticating\">Logging in…</string>\n    <string name=\"loading_user\">Loading user profile…</string>\n    <string name=\"creating_gist\">Creating Gist…</string>\n    <string name=\"create\">Create</string>\n    <string name=\"create_gist\">Create Gist</string>\n    <string name=\"make_public\">Make this Gist public</string>\n    <string name=\"gist_file_name_hint\">file.rb</string>\n    <string name=\"gist\">Gist</string>\n    <string name=\"comments\">Comments</string>\n    <string name=\"files\">Files</string>\n    <string name=\"open\">Open</string>\n    <string name=\"random\">Random</string>\n    <string name=\"file_name\">File Name</string>\n    <string name=\"file_content\">File Content</string>\n    <string name=\"new_gist\">New Gist</string>\n    <string name=\"filter\">Filter</string>\n    <string name=\"bookmark\">Bookmark</string>\n    <string name=\"comment\">Comment</string>\n    <string name=\"delete\">Delete</string>\n    <string name=\"delete_cap\">DELETE</string>\n    <string name=\"refresh\">Refresh</string>\n    <string name=\"dashboard_issues_title\">Issue Dashboard</string>\n    <string name=\"bookmarks\">Bookmarks</string>\n    <string name=\"gists_title\">Gists</string>\n    <string name=\"issue_title\">Issue #</string>\n    <string name=\"pull_request_title\">Pull Request #</string>\n    <string name=\"gist_title\">Gist\\u0020</string>\n    <string name=\"filter_issues_title\">Filter Issues</string>\n    <string name=\"create_comment_title\">Create Comment</string>\n    <string name=\"comment_hint\">Enter a comment</string>\n    <string name=\"show_more\">Show More…</string>\n    <string name=\"repositories\">Repositories</string>\n    <string name=\"contributors\">Contributors</string>\n    <string name=\"issues_title\">Issues</string>\n    <string name=\"edit_labels\">Edit Labels</string>\n    <string name=\"milestone_prefix\">Milestone:</string>\n    <string name=\"edit_milestone\">Edit Milestone</string>\n    <string name=\"edit_assignee\">Edit Assignee</string>\n    <string name=\"description\">Description</string>\n    <string name=\"gist_description_hint\">Android created Gist</string>\n    <string name=\"title\">Title</string>\n    <string name=\"edit\">Edit</string>\n    <string name=\"starring_gist\">Starring Gist…</string>\n    <string name=\"unstarring_gist\">Unstarring Gist…</string>\n    <string name=\"accounts_label\">Accounts</string>\n    <string name=\"select_assignee\">Select Assignee</string>\n    <string name=\"select_milestone\">Select Milestone</string>\n    <string name=\"select_labels\">Select Labels</string>\n    <string name=\"select_ref\">Select Branch or Tag</string>\n    <string name=\"no_milestone\">No milestone</string>\n    <string name=\"unassigned\">No one is assigned</string>\n    <string name=\"assigned\">is assigned</string>\n    <string name=\"no_gists_found\">No Gists found</string>\n    <string name=\"confirm_gist_delete_title\">Confirm Delete</string>\n    <string name=\"confirm_gist_delete_message\">Are you sure you want to delete this Gist?</string>\n    <string name=\"deleting_gist\">Deleting Gist…</string>\n    <string name=\"creating_comment\">Creating comment…</string>\n    <string name=\"editing_comment\">Editing comment…</string>\n    <string name=\"deleting_comment\">Deleting comment…</string>\n    <string name=\"confirm_comment_delete_title\">Remove Comment</string>\n    <string name=\"confirm_comment_delete_message\">Are you sure you want to delete this Comment?</string>\n    <string name=\"confirm_bookmark_delete_message\">Are you sure you want to remove this bookmark?</string>\n    <string name=\"issue_dashboard\">Issue Dashboard</string>\n    <string name=\"new_issue\">New Issue</string>\n    <string name=\"anonymous\">Anonymous</string>\n    <string name=\"message_filter_saved\">Issue filter saved to bookmarks</string>\n    <string name=\"recently_viewed\">RECENTLY VIEWED</string>\n    <string name=\"recent\">Recent</string>\n    <string name=\"recent_remove\">Remove Recent</string>\n    <string name=\"recent_list_remove\">Remove from recently viewed</string>\n    <string name=\"section_issue_status\">Status:</string>\n    <string name=\"status_open\">Open</string>\n    <string name=\"status_closed\">Closed</string>\n    <string name=\"section_issue_assigned\">Assigned To:</string>\n    <string name=\"assignee_anyone\">Anyone</string>\n    <string name=\"section_issue_milestone\">Milestone:</string>\n    <string name=\"none\">None</string>\n    <string name=\"section_issue_labels\">Labels:</string>\n    <string name=\"log_in\">Log in</string>\n    <string name=\"signup_link\">New to GitHub? &lt;a href=\\\"https://github.com/join\\\">Click here&lt;/a> to sign up</string>\n    <string name=\"signup_link_two_factor_auth\">Not sure what to do? &lt;a href=\\\"https://help.github.com/articles/about-two-factor-authentication\\\">Get some help.&lt;/a></string>\n    <string name=\"connection_failed\">Unable to connect to GitHub</string>\n    <string name=\"code_authentication_failed\">Authentication failed! Incorrect verification code</string>\n    <string name=\"invalid_login_or_password\">Please enter a valid login &amp; password</string>\n    <string name=\"invalid_password\">Please enter a valid password.</string>\n    <string name=\"password\">Password</string>\n    <string name=\"username_or_email\">Username or Email</string>\n    <string name=\"followers\">Followers</string>\n    <string name=\"following\">Following</string>\n    <string name=\"followers_self\">Followers</string>\n    <string name=\"following_self\">Following</string>\n    <string name=\"follow\">Follow</string>\n    <string name=\"unfollow\">Unfollow</string>\n    <string name=\"star\">Star</string>\n    <string name=\"unstar\">Unstar</string>\n    <string name=\"fork\">Fork</string>\n    <string name=\"members\">Members</string>\n    <string name=\"closing_issue\">Closing Issue…</string>\n    <string name=\"reopening_issue\">Reopening Issue…</string>\n    <string name=\"avatar\">Avatar</string>\n    <string name=\"creating_issue\">Creating Issue…</string>\n    <string name=\"prefix_created\">created\\u0020</string>\n    <string name=\"prefix_updated\">updated\\u0020</string>\n    <string name=\"prefix_opened\">opened\\u0020</string>\n    <string name=\"clear\">Clear</string>\n    <string name=\"pull_request_commits\">Commits: %d</string>\n    <string name=\"open_issues\">Open Issues</string>\n    <string name=\"closed_issues\">Closed Issues</string>\n    <string name=\"confirm_bookmark_delete_title\">Remove Bookmark</string>\n    <string name=\"save\">Save</string>\n    <string name=\"apply\">Apply</string>\n    <string name=\"labels_prefix\">Labels:</string>\n    <string name=\"assignee\">Assignee</string>\n    <string name=\"milestone\">Milestone</string>\n    <string name=\"labels\">Labels</string>\n    <string name=\"issue_confirm_close_message\">Are you sure you want to close this issue?</string>\n    <string name=\"issue_confirm_reopen_message\">Are you sure you want to reopen this issue?</string>\n    <string name=\"issue_confirm_close_title\">Close Issue</string>\n    <string name=\"issue_confirm_reopen_title\">Reopen Issue</string>\n    <string name=\"closed\">Closed</string>\n    <string name=\"no_description_given\">No description given.</string>\n    <string name=\"close\">Close</string>\n    <string name=\"reopen\">Reopen</string>\n    <string name=\"title_invalid_github_url\">Invalid GitHub URL</string>\n    <string name=\"message_invalid_github_url\">The following URL could not be opened by this application:\\n{0}</string>\n    <string name=\"cancel\">Cancel</string>\n    <string name=\"not_sure\">NOT SURE</string>\n    <string name=\"authenticator_conflict_title\">App Conflict</string>\n    <string name=\"authenticator_conflict_message\">Another installed app is already configured for PocketHub authentication.\\n\\nYou must remove the other app from the Accounts &amp; sync settings and uninstall it before the PocketHub app can be used.</string>\n    <string name=\"opening_repository\">Opening {0}…</string>\n    <string name=\"commit_compare_title\">Commit Compare</string>\n    <string name=\"commit_prefix\">Commit\\u0020</string>\n    <string name=\"parent_prefix\">Parent\\u0020</string>\n    <string name=\"authored\">authored</string>\n    <string name=\"committed\">committed</string>\n    <string name=\"diff_line_message\">What would you like to do?</string>\n    <string name=\"comment_on_line\">Comment on line</string>\n    <string name=\"view_entire_file\">View entire file</string>\n    <string name=\"comparing_commits\">Comparing {0} commits</string>\n    <string name=\"enable_wrapping\">Enable wrapping</string>\n    <string name=\"disable_wrapping\">Disable wrapping</string>\n    <string name=\"code\">Code</string>\n    <string name=\"following_user\">Following…</string>\n    <string name=\"unfollowing_user\">Unfollowing…</string>\n    <string name=\"starring_repository\">Starring…</string>\n    <string name=\"unstarring_repository\">Unstarring…</string>\n    <string name=\"forking_repository\">Forking…</string>\n    <string name=\"deleting_repository\">Deleting…</string>\n    <string name=\"navigate_to_user\">Navigate to %s</string>\n    <string name=\"contributions\">%d commits</string>\n\n    <!-- Tab titles, should be as short as possible -->\n    <string name=\"tab_repositories\">repositories</string>\n    <string name=\"tab_users\">users</string>\n    <string name=\"tab_news\">news</string>\n    <string name=\"tab_following_self\">following</string>\n    <string name=\"tab_followers_self\">followers</string>\n    <string name=\"tab_following\">following</string>\n    <string name=\"tab_followers\">followers</string>\n    <string name=\"tab_members\">members</string>\n    <string name=\"tab_code\">code</string>\n    <string name=\"tab_commits\">commits</string>\n    <string name=\"tab_issues\">issues</string>\n    <string name=\"tab_watched\">watched</string>\n    <string name=\"tab_assigned\">assigned</string>\n    <string name=\"tab_created\">created</string>\n    <string name=\"tab_mentioned\">mentioned</string>\n    <string name=\"tab_mine\">mine</string>\n    <string name=\"tab_starred\">starred</string>\n    <string name=\"tab_readme\">readme</string>\n    <string name=\"tab_all\">all</string>\n    <string name=\"tab_unread\">Unread</string>\n    <string name=\"tab_participating\">Participating</string>\n    <!--  -->\n    <string name=\"share\">Share</string>\n    <string name=\"show_password\">Show password</string>\n    <string name=\"write\">Write</string>\n    <string name=\"preview\">Preview</string>\n    <string name=\"show_raw_markdown\">Show raw markdown</string>\n    <string name=\"render_markdown\">Render markdown</string>\n    <string name=\"copy_hash\">Copy hash</string>\n    <string name=\"toast_msg_copied\">Copied to clipboard</string>\n\n    <!-- Navigation drawer strings -->\n    <string name=\"navigation_drawer_open\">Open navigation drawer</string>\n    <string name=\"navigation_drawer_close\">Close navigation drawer</string>\n    <string name=\"navigation_drawer_subheader\">Subheader</string>\n\n    <!-- Deleting repo -->\n    <string name=\"are_you_sure\">Are you absolutely sure?</string>\n    <string name=\"unexpected_bad_things\">This action CANNOT be undone.\n        This will permanently delete the repository, wiki, issues,\n        and comments, and remove all collaborator associations.</string>\n    <string name=\"delete_successful\">Repository is deleted</string>\n    <string name=\"login_or_email\">Login or Email</string>\n\n    <string name=\"temporary_login_message\"><b>Authenticating is now done through the website,\n        press the log in button to continue.</b>\n        \\n\\n Since GitHub has added third-party restrictions we are unable to write\n        to certain organizations. You can read more here:\\n\n        https://help.github.com/articles/about-third-party-application-restrictions/</string>\n    <string name=\"organizations\">Organizations</string>\n    <string name=\"error_oauth_not_configured\">You won\\'t be able to login, because the oauth client and secret aren\\'t set\nRead the README.md: https://github.com/pockethub/PocketHub#setup-environment</string>\n    <string name=\"error_image_upload\">Unable to upload image</string>\n    <string name=\"read_permission_title\">Let us explain</string>\n    <string name=\"read_permission_content\">For us to for example upload images we need to be able to read your storage.</string>\n    <string name=\"no_notifications\">No notifications found</string>\n    <string name=\"error_notifications_load\">Error loading notifications</string>\n    <string name=\"releases_not_yet_in_app\">Sorry, we don\\'t support releases in the app yet</string>\n    <string name=\"error_edit_issue\">Could not edit issue</string>\n    <string name=\"error_issue_state\">Could not change state</string>\n    <string name=\"section_issue_sort_order\">Sort order</string>\n    <string name=\"section_issue_sort_type\">Sort by</string>\n    <string name=\"sort_order_ascending\">Ascending</string>\n    <string name=\"sort_order_descending\">Descending</string>\n    <string name=\"sort_created\">Created</string>\n    <string name=\"sort_updated\">Updated</string>\n    <string name=\"sort_comments\">Comments</string>\n    <string name=\"parent_repo\">Parent repository</string>\n    <string name=\"message_filter_save_failed\">Failed to add issue filter</string>\n\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Copyright (c) 2015 PocketHub\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<resources xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <style name=\"AvatarXLarge\">\n        <item name=\"android:layout_width\">40dp</item>\n        <item name=\"android:layout_height\">40dp</item>\n    </style>\n\n    <style name=\"AvatarLarge\">\n        <item name=\"android:layout_width\">32dp</item>\n        <item name=\"android:layout_height\">32dp</item>\n    </style>\n\n    <style name=\"AvatarMedium\">\n        <item name=\"android:layout_width\">24dp</item>\n        <item name=\"android:layout_height\">24dp</item>\n    </style>\n\n    <style name=\"AvatarSmall\">\n        <item name=\"android:layout_width\">16dp</item>\n        <item name=\"android:layout_height\">16dp</item>\n    </style>\n\n    <style name=\"EditText\">\n        <item name=\"android:layout_width\">wrap_content</item>\n        <item name=\"android:layout_height\">wrap_content</item>\n        <item name=\"android:textColor\">@color/text</item>\n        <item name=\"android:textCursorDrawable\">@drawable/edit_text_cursor</item>\n        <item name=\"android:textSize\">14sp</item>\n        <item name=\"android:padding\">10dp</item>\n        <item name=\"android:background\">@drawable/edit_text_background</item>\n    </style>\n\n    <style name=\"FormalMultiLineEditText\" parent=\"EditText\">\n        <item name=\"android:gravity\">top</item>\n        <item name=\"android:inputType\">textMultiLine|textAutoCorrect|textCapSentences</item>\n    </style>\n\n    <style name=\"FormalSingleLineEditText\" parent=\"EditText\">\n        <item name=\"android:singleLine\">true</item>\n        <item name=\"android:inputType\">text|textAutoCorrect|textCapSentences</item>\n    </style>\n\n    <style name=\"TextIcon\">\n        <item name=\"android:layout_height\">wrap_content</item>\n        <item name=\"android:layout_width\">wrap_content</item>\n        <item name=\"android:singleLine\">true</item>\n        <item name=\"android:textColor\">@color/text_icon</item>\n    </style>\n\n    <style name=\"ListIcon\" parent=\"TextIcon\">\n        <item name=\"android:textSize\">14sp</item>\n        <item name=\"android:layout_marginTop\">-2dp</item>\n        <item name=\"android:layout_height\">18dp</item>\n    </style>\n\n    <style name=\"EventIcon\" parent=\"TextIcon\">\n        <item name=\"android:textSize\">22sp</item>\n        <item name=\"android:layout_marginTop\">-4dp</item>\n        <item name=\"android:layout_height\">28dp</item>\n    </style>\n\n    <style name=\"PrimaryIcon\" parent=\"TextIcon\">\n        <item name=\"android:layout_height\">35dp</item>\n        <item name=\"android:layout_marginTop\">-7dp</item>\n        <item name=\"android:textSize\">28sp</item>\n    </style>\n\n    <style name=\"IssueNumber\">\n        <item name=\"android:layout_width\">wrap_content</item>\n        <item name=\"android:layout_height\">wrap_content</item>\n        <item name=\"android:background\">@color/background_id</item>\n        <item name=\"android:gravity\">right</item>\n        <item name=\"android:includeFontPadding\">false</item>\n        <item name=\"android:paddingBottom\">2dp</item>\n        <item name=\"android:paddingLeft\">5dp</item>\n        <item name=\"android:paddingRight\">2dp</item>\n        <item name=\"android:paddingTop\">2dp</item>\n        <item name=\"android:singleLine\">true</item>\n        <item name=\"android:textSize\">13sp</item>\n        <item name=\"android:textColor\">@color/text</item>\n    </style>\n\n    <style name=\"ListLabel\">\n        <item name=\"android:layout_height\">2dp</item>\n        <item name=\"android:layout_marginTop\">2dp</item>\n        <item name=\"android:layout_width\">match_parent</item>\n    </style>\n\n    <style name=\"Separator\">\n        <item name=\"android:layout_width\">match_parent</item>\n        <item name=\"android:layout_height\">1dp</item>\n        <item name=\"android:background\">@null</item>\n    </style>\n\n    <style name=\"TitleText\">\n        <item name=\"android:textSize\">17sp</item>\n        <item name=\"android:paddingBottom\">2dp</item>\n        <item name=\"android:textStyle\">bold</item>\n        <item name=\"android:textColor\">@color/text</item>\n        <item name=\"android:layout_height\">wrap_content</item>\n        <item name=\"android:layout_width\">wrap_content</item>\n    </style>\n\n    <style name=\"HeaderTitleText\" parent=\"TitleText\">\n        <item name=\"android:paddingLeft\">10dp</item>\n        <item name=\"android:singleLine\">true</item>\n    </style>\n\n    <style name=\"ListTitleText\" parent=\"TitleText\"/>\n\n    <style name=\"SubtitleText\">\n        <item name=\"android:textSize\">14sp</item>\n        <item name=\"android:textColor\">@color/text_light</item>\n        <item name=\"android:layout_height\">wrap_content</item>\n        <item name=\"android:layout_width\">wrap_content</item>\n    </style>\n\n    <style name=\"ListSubtitleText\" parent=\"SubtitleText\"/>\n\n    <style name=\"CodeText\">\n        <item name=\"android:textSize\">12sp</item>\n        <item name=\"android:typeface\">monospace</item>\n        <item name=\"android:textColor\">@color/text</item>\n        <item name=\"android:layout_height\">wrap_content</item>\n        <item name=\"android:layout_width\">wrap_content</item>\n    </style>\n\n    <style name=\"ListNumericSubtitleText\" parent=\"ListSubtitleText\">\n        <item name=\"android:singleLine\">true</item>\n    </style>\n\n    <style name=\"ListItem\">\n        <item name=\"android:layout_height\">wrap_content</item>\n        <item name=\"android:layout_width\">match_parent</item>\n        <item name=\"android:paddingLeft\">10dp</item>\n        <item name=\"android:paddingRight\">10dp</item>\n        <item name=\"android:paddingTop\">10dp</item>\n        <item name=\"android:paddingBottom\">10dp</item>\n        <item name=\"android:background\">?android:attr/selectableItemBackground</item>\n    </style>\n\n    <style name=\"ListItemTwoLines\" parent=\"ListItem\">\n        <item name=\"android:paddingTop\">5dp</item>\n        <item name=\"android:paddingBottom\">5dp</item>\n    </style>\n\n    <style name=\"HeaderListItem\" parent=\"ListItem\"/>\n\n    <style name=\"CommentListItem\" parent=\"ListItem\">\n        <item name=\"android:layout_width\">match_parent</item>\n        <item name=\"android:background\">@color/background</item>\n    </style>\n\n    <style name=\"Spinner\">\n        <item name=\"android:indeterminate\">true</item>\n        <item name=\"android:indeterminateDuration\">2000</item>\n        <item name=\"android:indeterminateOnly\">true</item>\n    </style>\n\n    <style name=\"ListSpinner\" parent=\"Spinner\">\n        <item name=\"android:layout_width\">64dp</item>\n        <item name=\"android:layout_height\">64dp</item>\n    </style>\n\n    <style name=\"NavigationView\">\n        <item name=\"android:textColorSecondary\">?attr/colorAccent</item>\n        <item name=\"itemTextColor\">@android:color/black</item>\n        <item name=\"itemIconTint\">@color/color_navigation_view_icon</item>\n    </style>\n\n    <style name=\"InputTextLayout\" parent=\"Widget.Design.TextInputLayout\">\n        <item name=\"android:layout_height\">wrap_content</item>\n        <item name=\"android:layout_width\">match_parent</item>\n        <item name=\"android:paddingTop\">16dp</item>\n    </style>\n\n</resources>"
  },
  {
    "path": "app/src/main/res/values/theme.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<resources xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <style name=\"Theme.PocketHub\" parent=\"@style/Theme.AppCompat.Light.NoActionBar\">\n\n        <item name=\"colorPrimary\">@color/primary</item>\n        <item name=\"colorPrimaryDark\">@color/primary_dark</item>\n        <item name=\"colorAccent\">@color/accent</item>\n\n        <item name=\"actionBarPopupTheme\">@style/ThemeOverlay.AppCompat.Dark</item>\n\n        <item name=\"actionBarStyle\">@style/Widget.Styled.ActionBar</item>\n        <item name=\"android:actionBarStyle\">@style/Widget.Styled.ActionBar</item>\n        <item name=\"android:windowBackground\">@color/background</item>\n        <item name=\"windowActionBar\">false</item>\n\n    </style>\n\n    <style name=\"Theme.PocketHub.NavigationDrawer\" parent=\"Theme.PocketHub\" />\n\n    <style name=\"Widget.Styled.ActionBar\" parent=\"Widget.AppCompat.ActionBar.Solid\">\n        <item name=\"indeterminateProgressStyle\">@style/IndeterminateProgress</item>\n        <item name=\"android:indeterminateProgressStyle\">@style/IndeterminateProgress</item>\n    </style>\n\n    <style name=\"IndeterminateProgress\" parent=\"@android:style/Widget.ProgressBar\">\n        <item name=\"android:indeterminateDrawable\">@drawable/actionbar_spinner</item>\n        <item name=\"android:minWidth\">16dp</item>\n    </style>\n\n    <style name=\"ToolbarTheme\" parent=\"@style/ThemeOverlay.AppCompat.Dark.ActionBar\">\n        <item name=\"colorControlNormal\">@android:color/white</item>\n        <item name=\"colorControlHighlight\">@color/ripple_material_dark</item>\n        <item name=\"colorAccent\">#FFFFFF</item>\n    </style>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/typeface.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<resources>\n\n    <string name=\"icon_pull_request\" translatable=\"false\">\\uf20E</string>\n    <string name=\"icon_comment\" translatable=\"false\">\\uf04f</string>\n    <string name=\"icon_file\" translatable=\"false\">\\uf011</string>\n    <string name=\"icon_tag\" translatable=\"false\">\\uf215</string>\n    <string name=\"icon_folder\" translatable=\"false\">\\uf216</string>\n    <string name=\"icon_folders\" translatable=\"false\">\\uf217</string>\n    <string name=\"icon_star\" translatable=\"false\">\\uf02a</string>\n    <string name=\"icon_fork\" translatable=\"false\">\\uf020</string>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-bg/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<resources>\n\n    <!-- Съобщения за грешка -->\n    <string name=\"error_orgs_load\">Грешка при зареждане на профила и организациите</string>\n    <string name=\"error_issues_load\">Грешка при зареждане на заданията</string>\n    <string name=\"error_repos_load\">Грешка при зареждане на хранилищата</string>\n    <string name=\"error_repo_load\">Грешка при зареждане на хранилището</string>\n    <string name=\"error_gist_load\">Грешка при зареждане на Gist</string>\n    <string name=\"error_news_load\">Грешка при зареждане на новините</string>\n    <string name=\"error_followers_load\">Грешка при зареждане на феновете</string>\n    <string name=\"error_people_load\">Грешка при зареждане на хората</string>\n    <string name=\"error_person_load\">Грешка при зареждане на лицето</string>\n    <string name=\"error_gist_file_load\">Грешка при зареждане на съдържанието на Gist</string>\n    <string name=\"error_gists_load\">Грешка при зареждане на наличните Gist</string>\n    <string name=\"error_issue_load\">Грешка при зареждане на заданието</string>\n    <string name=\"error_collaborators_load\">Грешка при зареждане на сътрудниците</string>\n    <string name=\"error_milestones_load\">Грешка при зареждане на етапите</string>\n    <string name=\"error_labels_load\">Грешка при зареждане на етикетите</string>\n    <string name=\"error_bookmarks_load\">Грешка при зареждане на показалците</string>\n    <string name=\"error_members_load\">Грешка при зареждане на членовете</string>\n    <string name=\"error_commits_load\">Грешка при зареждане на промените</string>\n    <string name=\"error_commit_load\">Грешка при зареждане на промяната</string>\n    <string name=\"error_file_load\">Грешка при зареждане на файла</string>\n    <string name=\"error_code_load\">Грешка при зареждане на кода</string>\n    <string name=\"error_refs_load\">Грешка при зареждане на разклоненията и маркерите</string>\n    <!--  -->\n\n\n    <!-- Съобщения за зареждане -->\n    <string name=\"loading_gist\">Зарежда се Gist…</string>\n    <string name=\"loading_more_issues\">Зареждат се още задания…</string>\n    <string name=\"loading_issues\">Зареждат се заданията…</string>\n    <string name=\"loading_comments\">Зареждат се коментарите…</string>\n    <string name=\"loading_repositories\">Зареждат се хранилищата…</string>\n    <string name=\"loading_issue\">Зарежда се заданието…</string>\n    <string name=\"loading_news\">Зареждат се новините…</string>\n    <string name=\"loading_followers\">Зареждат се феновете…</string>\n    <string name=\"loading_people\">Зареждат се хората…</string>\n    <string name=\"loading_gists\">Зареждат се Gists…</string>\n    <string name=\"loading_collaborators\">Зареждат се сътрудниците…</string>\n    <string name=\"loading_milestones\">Зареждат се етапите…</string>\n    <string name=\"loading_labels\">Зареждат се етикетите…</string>\n    <string name=\"loading_commits\">Зареждат се промените…</string>\n    <string name=\"loading_files_and_comments\">Зареждат се файловете и коментарите…</string>\n    <string name=\"loading_refs\">Зареждат се разклоненията и маркерите…</string>\n    <!--  -->\n\n\n    <!-- Съобщения за липса на съдържание -->\n    <string name=\"no_bookmarks\">Няма показалци</string>\n    <string name=\"no_repositories\">Няма хранилища</string>\n    <string name=\"no_issues\">Няма задания</string>\n    <string name=\"no_gists\">Няма налични Gist</string>\n    <string name=\"no_people\">Няма хора</string>\n    <string name=\"no_followers\">Няма фенове</string>\n    <string name=\"no_members\">Няма членове</string>\n    <string name=\"no_news\">Няма новини</string>\n    <string name=\"no_commits\">Няма промени</string>\n    <!--  -->\n\n\n    <!-- Съобщения за обновяване -->\n    <string name=\"updating_assignee\">Обновяване на изпълнителя…</string>\n    <string name=\"updating_issue\">Обновяване на заданието…</string>\n    <string name=\"updating_labels\">Обновяване на етикетите…</string>\n    <string name=\"updating_milestone\">Обновяване на етапа…</string>\n    <!--  -->\n\n    <string name=\"news\">Новини</string>\n    <string name=\"issues\">Задания</string>\n    <string name=\"gists\">Gists</string>\n    <string name=\"commits\">Промени</string>\n    <string name=\"find_repositories\">Търсене на хранилища</string>\n    <string name=\"find_issues\">Търсене на задания</string>\n    <string name=\"search_title\">Търсене…</string>\n    <string name=\"clear_search_history\">Изтриване на миналите търсения</string>\n    <string name=\"search_history_cleared\">Миналите търсения са изтрити</string>\n    <string name=\"login_activity_authenticating\">Легитимиране…</string>\n    <string name=\"creating_gist\">Създава се нов Gist…</string>\n    <string name=\"create\">Създаване</string>\n    <string name=\"create_gist\">Създаване на Gist</string>\n    <string name=\"make_public\">общодостъпен</string>\n    <string name=\"gist_file_name_hint\">file.rb</string>\n    <string name=\"gist\">Gist</string>\n    <string name=\"comments\">Коментари</string>\n    <string name=\"files\">Файлове</string>\n    <string name=\"open\">Отваряне</string>\n    <string name=\"random\">Случаен</string>\n    <string name=\"file_name\">Име на файла</string>\n    <string name=\"file_content\">Съдържание</string>\n    <string name=\"new_gist\">Нов Gist</string>\n    <string name=\"filter\">Филтър</string>\n    <string name=\"bookmark\">Показалец</string>\n    <string name=\"comment\">Добавяне на коментар</string>\n    <string name=\"delete\">Изтриване</string>\n    <string name=\"refresh\">Опресняване</string>\n    <string name=\"dashboard_issues_title\">Табло със задания</string>\n    <string name=\"bookmarks\">Показалци</string>\n    <string name=\"gists_title\">Gists</string>\n    <string name=\"issue_title\">Задание #</string>\n    <string name=\"pull_request_title\">Заявка за промяна #</string>\n    <string name=\"gist_title\">Gist\\u0020</string>\n    <string name=\"filter_issues_title\">Филтриране на заданията</string>\n    <string name=\"create_comment_title\">Добавяне на коментар</string>\n    <string name=\"comment_hint\">Напишете коментар</string>\n    <string name=\"show_more\">Още…</string>\n    <string name=\"repositories\">Хранилища</string>\n    <string name=\"issues_title\">Задания</string>\n    <string name=\"edit_labels\">Промяна на етикетите</string>\n    <string name=\"milestone_prefix\">Етап:</string>\n    <string name=\"edit_milestone\">Промяна на етапа</string>\n    <string name=\"edit_assignee\">Промяна на изпълнителя</string>\n    <string name=\"description\">Описание</string>\n    <string name=\"gist_description_hint\">Gist, създаден с Android</string>\n    <string name=\"title\">Заглавие</string>\n    <string name=\"edit\">Редактиране</string>\n    <string name=\"star\">Любим</string>\n    <string name=\"starring_gist\">Отбелязване на този Gist като любим…</string>\n    <string name=\"unstar\">Премахване от любими</string>\n    <string name=\"unstarring_gist\">Премахване на този Gist от любимите…</string>\n    <string name=\"accounts_label\">Accounts</string>\n    <string name=\"select_assignee\">Възлагане</string>\n    <string name=\"select_milestone\">Включване в етап</string>\n    <string name=\"select_labels\">Маркиране с етикети</string>\n    <string name=\"select_ref\">Избиране на разклонение или маркер</string>\n    <string name=\"no_milestone\">Няма етапи</string>\n    <string name=\"unassigned\">Няма изпълнител</string>\n    <string name=\"assigned\">е назначен</string>\n    <string name=\"no_gists_found\">Не е намерен такъв Gist</string>\n    <string name=\"confirm_gist_delete_title\">Потвърдете изтриването</string>\n    <string name=\"confirm_gist_delete_message\">Наистина ли искате да изтриете този Gist?</string>\n    <string name=\"deleting_gist\">Изтрива се Gist…</string>\n    <string name=\"creating_comment\">Добавя се коментар…</string>\n    <string name=\"confirm_bookmark_delete_message\">Наистина ли искате да премахнете този показалец?</string>\n    <string name=\"issue_dashboard\">Табло със задания</string>\n    <string name=\"new_issue\">Ново задание</string>\n    <string name=\"anonymous\">Анонимен</string>\n    <string name=\"message_filter_saved\">Филтърът на заданията е запазаен като показалец</string>\n    <string name=\"recent\">Доскорошни</string>\n    <string name=\"section_issue_status\">Състояние:</string>\n    <string name=\"status_open\">Отворен</string>\n    <string name=\"status_closed\">Приключен</string>\n    <string name=\"section_issue_assigned\">Възложен на:</string>\n    <string name=\"assignee_anyone\">Който и да е</string>\n    <string name=\"section_issue_milestone\">Етап:</string>\n    <string name=\"none\">Няма</string>\n    <string name=\"section_issue_labels\">Етикети:</string>\n    <string name=\"log_in\">Влизане</string>\n    <string name=\"signup_link\">За първи път в GitHub? &lt;a href=\\\"https://github.com/join\\\">Щракнете тук&lt;/a> за записване</string>\n    <string name=\"connection_failed\">Не може да се осъществи връзка с GitHub.</string>\n    <string name=\"invalid_login_or_password\">Моля, въведете коректно име и парола</string>\n    <string name=\"invalid_password\">Моля, въведете коректна парола.</string>\n    <string name=\"password\">Парола</string>\n    <string name=\"login_or_email\">Име или имейл</string>\n    <string name=\"followers\">Фенове</string>\n    <string name=\"following\">Следва</string>\n    <string name=\"followers_self\">Фенове</string>\n    <string name=\"following_self\">Следвате</string>\n    <string name=\"members\">Членове</string>\n    <string name=\"closing_issue\">Заданието се затваря…</string>\n    <string name=\"reopening_issue\">Заданието се връща за доработка…</string>\n    <string name=\"avatar\">Портрет</string>\n    <string name=\"creating_issue\">Заданието се създава…</string>\n    <string name=\"prefix_created\">създаден на\\u0020</string>\n    <string name=\"prefix_updated\">обновен на\\u0020</string>\n    <string name=\"prefix_opened\">отворено на\\u0020</string>\n    <string name=\"clear\">Изчистване</string>\n    <string name=\"open_issues\">Отворени задания</string>\n    <string name=\"closed_issues\">Приключени задания</string>\n    <string name=\"confirm_bookmark_delete_title\">Премахване на показалеца</string>\n    <string name=\"save\">Запис</string>\n    <string name=\"apply\">Прилагане</string>\n    <string name=\"labels_prefix\">Етикети:</string>\n    <string name=\"assignee\">Изпълнител</string>\n    <string name=\"milestone\">Етап</string>\n    <string name=\"labels\">Етикети</string>\n    <string name=\"issue_confirm_close_message\">Наистина ли искате да приключите това задание?</string>\n    <string name=\"issue_confirm_reopen_message\">Наистина ли искате върнете това задание обратно за доработка?</string>\n    <string name=\"issue_confirm_close_title\">Приключване на заданието</string>\n    <string name=\"issue_confirm_reopen_title\">Връщане на заданието за доработка</string>\n    <string name=\"closed\">Приключено</string>\n    <string name=\"no_description_given\">Без описание</string>\n    <string name=\"close\">Приключване</string>\n    <string name=\"reopen\">Връщане за доработка</string>\n    <string name=\"title_invalid_github_url\">Невалиден адрес</string>\n    <string name=\"message_invalid_github_url\">Този адрес не може да бъде зареден:\\n{0}</string>\n    <string name=\"recently_viewed\">ПОСЛЕДНО ПОСЕТЕНИ</string>\n    <string name=\"cancel\">Отказ</string>\n    <string name=\"authenticator_conflict_title\">Конфликт между приложенията</string>\n    <string name=\"authenticator_conflict_message\">Друго приложение е вече настроено за удостоверяване към GitHub.\\n\\nТекущото приложение може да се използва след като премахнете другото приложение от профила си в GitHub и опресните настройките.</string>\n    <string name=\"opening_repository\">Отваряне на {0}…</string>\n    <string name=\"commit_compare_title\">Сравняване на промени</string>\n    <string name=\"commit_prefix\">Промяна\\u0020</string>\n    <string name=\"parent_prefix\">Произлязла от\\u0020</string>\n    <string name=\"authored\">създадена на</string>\n    <string name=\"committed\">изпратена на</string>\n    <string name=\"diff_line_message\">Какво искаш да направиш?</string>\n    <string name=\"comment_on_line\">Добавяне на коментар към реда</string>\n    <string name=\"view_entire_file\">Показване на целия файл</string>\n    <string name=\"comparing_commits\">Сравняване на {0} промени</string>\n    <string name=\"enable_wrapping\">С пренасяне</string>\n    <string name=\"disable_wrapping\">Без пренасяне</string>\n    <string name=\"code\">Код</string>\n\n    <!-- Етикети на разделите - трябва да са възможно най-кратки -->\n    <string name=\"tab_repositories\">хранилища</string>\n    <string name=\"tab_news\">новини</string>\n    <string name=\"tab_following_self\">следите</string>\n    <string name=\"tab_followers_self\">фенове</string>\n    <string name=\"tab_following\">следи</string>\n    <string name=\"tab_followers\">фенове</string>\n    <string name=\"tab_members\">членове</string>\n    <string name=\"tab_code\">код</string>\n    <string name=\"tab_commits\">промени</string>\n    <string name=\"tab_issues\">задания</string>\n    <string name=\"tab_watched\">наблюдавани</string>\n    <string name=\"tab_assigned\">назначени</string>\n    <string name=\"tab_created\">създадени</string>\n    <string name=\"tab_mentioned\">споменати</string>\n    <string name=\"tab_mine\">мои</string>\n    <string name=\"tab_starred\">любими</string>\n    <string name=\"tab_all\">всички</string>\n    <!--  -->\n    <string name=\"share\">Сподели</string>\n    <string name=\"show_password\">Покажи паролата</string>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-cs/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<resources>\n\n    <!-- Error messages -->\n    <string name=\"error_orgs_load\">Načítání účtu &amp; organizací selhalo</string>\n    <string name=\"error_issues_load\">Načítání seznamu návrhů selhalo</string>\n    <string name=\"error_repos_load\">Načítání repozitářů selhalo</string>\n    <string name=\"error_repo_load\">Načítání repozitáře selhalo</string>\n    <string name=\"error_contributors_load\">Načítání přispěvatelů selhalo</string>\n    <string name=\"error_gist_load\">Načítání Gistu selhalo</string>\n    <string name=\"error_news_load\">Načítání novinek selhalo</string>\n    <string name=\"error_followers_load\">Načítání followerů selhalo</string>\n    <string name=\"error_people_load\">Načítání lidí selhalo</string>\n    <string name=\"error_person_load\">Načítání osoby selhalo</string>\n    <string name=\"error_gist_file_load\">Načítání obsahu Gistu selhalo</string>\n    <string name=\"error_gists_load\">Načítání Gistů selhalo</string>\n    <string name=\"error_issue_load\">Načítání návrhů selhalo</string>\n    <string name=\"error_collaborators_load\">Načítání spolupracovníků selhalo</string>\n    <string name=\"error_milestones_load\">Načítání milníků selhalo</string>\n    <string name=\"error_labels_load\">Načítání štítků selhalo</string>\n    <string name=\"error_bookmarks_load\">Načítání záložek selhalo</string>\n    <string name=\"error_members_load\">Načítání členů selhalo</string>\n    <string name=\"error_commits_load\">Načítání commitů selhalo</string>\n    <string name=\"error_commit_load\">Načítání commitu selhalo</string>\n    <string name=\"error_file_load\">Načítání souboru selhalo</string>\n    <string name=\"error_code_load\">Načítání kódu selhalo</string>\n    <string name=\"error_refs_load\">Načítání větví &amp; tagů selhalo</string>\n    <string name=\"error_following_person\">Následování selhalo</string>\n    <string name=\"error_unfollowing_person\">Zrušení následování selhalo</string>\n    <string name=\"error_checking_following_status\">Nepodařilo se zjistit stav následování</string>\n    <string name=\"error_starring_repository\">Označování oblíbeného selhalo</string>\n    <string name=\"error_unstarring_repository\">Zrušení oblíbeného selhalo</string>\n    <string name=\"error_checking_starring_status\">Kontrola stavu oblíbeného selhala</string>\n    <string name=\"error_rendering_markdown\">Renderování markdownu selhalo</string>\n    <string name=\"error_users_search\">Vyhledávání uživatelů selhalo</string>\n    <!-- -->\n\n\n    <!-- Loading messages -->\n    <string name=\"loading_gist\">Načítání Gistu…</string>\n    <string name=\"loading_more_issues\">Načítání více návrhů…</string>\n    <string name=\"loading_issues\">Načítání návrhů…</string>\n    <string name=\"loading_comments\">Načítání komentářů…</string>\n    <string name=\"loading_repositories\">Načítání repozitářů…</string>\n    <string name=\"loading_issue\">Načítání návrhu…</string>\n    <string name=\"loading_news\">Načítání novinek…</string>\n    <string name=\"loading_followers\">Načítání followerů…</string>\n    <string name=\"loading_people\">Načítání lidí…</string>\n    <string name=\"loading_gists\">Načítání Gistů…</string>\n    <string name=\"loading_collaborators\">Načítání spolupracovníků…</string>\n    <string name=\"loading_milestones\">Načítání milníků…</string>\n    <string name=\"loading_labels\">Načítání štítků…</string>\n    <string name=\"loading_commits\">Načítání commitů…</string>\n    <string name=\"loading_files_and_comments\">Načítání souborů &amp; komentářů…</string>\n    <string name=\"loading_refs\">Načítání větví &amp; tagů…</string>\n    <!-- -->\n\n\n    <!-- Empty messages -->\n    <string name=\"no_bookmarks\">Žádné záložky</string>\n    <string name=\"no_repositories\">Žádné repozitáře</string>\n    <string name=\"no_contributors\">Žádní přispěvatelé</string>\n    <string name=\"no_issues\">Žádné návrhy</string>\n    <string name=\"no_gists\">Žádné Gisty</string>\n    <string name=\"no_people\">Žádní lidé</string>\n    <string name=\"no_followers\">Žádní sledující</string>\n    <string name=\"no_members\">Žádní členové</string>\n    <string name=\"no_news\">Žádné novinky</string>\n    <string name=\"no_commits\">Žádné commity</string>\n    <!-- -->\n\n\n    <!-- Updating messages -->\n    <string name=\"updating_assignee\">Aktualizace přiřazených…</string>\n    <string name=\"updating_issue\">Aktualizace návrhu…</string>\n    <string name=\"updating_labels\">Aktualizace štítků…</string>\n    <string name=\"updating_milestone\">Aktualizace milníku…</string>\n    <!-- -->\n\n    <string name=\"news\">Novinky</string>\n    <string name=\"issues\">Návrhy</string>\n    <string name=\"gists\">Gisty</string>\n    <string name=\"commits\">Commity</string>\n    <string name=\"global_search\">GitHub vyhledávání</string>\n    <string name=\"find_repositories\">Hledat v repozitářích</string>\n    <string name=\"find_issues\">Hledat v návrzích</string>\n    <string name=\"search_title\">Hledat…</string>\n    <string name=\"clear_search_history\">Vymazat historii</string>\n    <string name=\"search_history_cleared\">Historie hledání byla vymazána</string>\n    <string name=\"login_activity_authenticating\">Přihlašování…</string>\n    <string name=\"creating_gist\">Vytváření Gistu…</string>\n    <string name=\"create\">Vytvořit</string>\n    <string name=\"create_gist\">Vytvořit Gist</string>\n    <string name=\"make_public\">Zveřejnit tento Gist</string>\n    <string name=\"gist_file_name_hint\">soubor.rb</string>\n    <string name=\"gist\">Gist</string>\n    <string name=\"comments\">Komentáře</string>\n    <string name=\"files\">Soubory</string>\n    <string name=\"open\">Otevřít</string>\n    <string name=\"random\">Náhodný</string>\n    <string name=\"file_name\">Název souboru</string>\n    <string name=\"file_content\">Obsah souboru</string>\n    <string name=\"new_gist\">Nový Gist</string>\n    <string name=\"filter\">Filtr</string>\n    <string name=\"bookmark\">Záložka</string>\n    <string name=\"comment\">Komentář</string>\n    <string name=\"delete\">Odstranit</string>\n    <string name=\"refresh\">Obnovit</string>\n    <string name=\"dashboard_issues_title\">Přehled návrhů</string>\n    <string name=\"bookmarks\">Záložky</string>\n    <string name=\"gists_title\">Gisty</string>\n    <string name=\"issue_title\">Návrh #</string>\n    <string name=\"pull_request_title\">Požadavek na sloučení #</string>\n    <string name=\"gist_title\">Gist\\u0020</string>\n    <string name=\"filter_issues_title\">Filtrovat návrhy</string>\n    <string name=\"create_comment_title\">Vytvořit komentář</string>\n    <string name=\"comment_hint\">Zadejte komentář</string>\n    <string name=\"show_more\">Zobrazit více…</string>\n    <string name=\"repositories\">Repozitáře</string>\n    <string name=\"contributors\">Přispěvatelé</string>\n    <string name=\"issues_title\">Návrhy</string>\n    <string name=\"edit_labels\">Upravit štítky</string>\n    <string name=\"milestone_prefix\">Milník:</string>\n    <string name=\"edit_milestone\">Upravit milník</string>\n    <string name=\"edit_assignee\">Upravit přiřazení</string>\n    <string name=\"description\">Popis</string>\n    <string name=\"gist_description_hint\">Gist vytvořený v Androidu</string>\n    <string name=\"title\">Název</string>\n    <string name=\"edit\">Upravit</string>\n    <string name=\"starring_gist\">Přidávání Gistu do oblíbených…</string>\n    <string name=\"unstarring_gist\">Odebírání Gistu z oblíbených…</string>\n    <string name=\"accounts_label\">Účty</string>\n    <string name=\"select_assignee\">Zvolit přiřazení</string>\n    <string name=\"select_milestone\">Zvolit milník</string>\n    <string name=\"select_labels\">Zvolit štítky</string>\n    <string name=\"select_ref\">Zvolit větev nebo tag</string>\n    <string name=\"no_milestone\">Žádný milník</string>\n    <string name=\"unassigned\">Nikdo není přiřazen</string>\n    <string name=\"assigned\">je přiřazen</string>\n    <string name=\"no_gists_found\">Nebyly nalezeny žádné Gisty</string>\n    <string name=\"confirm_gist_delete_title\">Potvrdit odstranění</string>\n    <string name=\"confirm_gist_delete_message\">Jste si jisti, že chcete odstranit tento Gist?</string>\n    <string name=\"deleting_gist\">Odstraňování Gistu…</string>\n    <string name=\"creating_comment\">Vytváření komentáře…</string>\n    <string name=\"confirm_bookmark_delete_message\">Jste si jisti, že chcete odstranit tuto záložku?</string>\n    <string name=\"issue_dashboard\">Přehled návrhů</string>\n    <string name=\"new_issue\">Nový návrh</string>\n    <string name=\"anonymous\">Anonymní</string>\n    <string name=\"message_filter_saved\">Filtr návrhů uložen do záložek</string>\n    <string name=\"recently_viewed\">NEDÁVNO ZOBRAZENÉ</string>\n    <string name=\"recent\">Nedávné</string>\n    <string name=\"recent_remove\">Odstranit nedávné</string>\n    <string name=\"recent_list_remove\">Odstranit z nedávno použitých</string>\n    <string name=\"section_issue_status\">Stav:</string>\n    <string name=\"status_open\">Otevřené</string>\n    <string name=\"status_closed\">Uzavřené</string>\n    <string name=\"section_issue_assigned\">Přiřazené k:</string>\n    <string name=\"assignee_anyone\">Kdokoliv</string>\n    <string name=\"section_issue_milestone\">Milník:</string>\n    <string name=\"none\">Žádný</string>\n    <string name=\"section_issue_labels\">Štítky:</string>\n    <string name=\"log_in\">Přihlásit se</string>\n    <string name=\"signup_link\">Jste nový na GitHubu? &lt;a href=\\\"https://github.com/join\\\">Klikněte sem&lt;/a> a zaregistrujte se</string>\n    <string name=\"signup_link_two_factor_auth\">Nejste si jistí, co máte dělat? &lt;a href=\\\"https://help.github.com/articles/about-two-factor-authentication\\\">Zde získáte pomoc.&lt;/a></string>\n    <string name=\"connection_failed\">Není možné se připojit na GitHub</string>\n    <string name=\"invalid_login_or_password\">Zadejte prosím platné uživatelské jméno &amp; heslo</string>\n    <string name=\"invalid_password\">Zadejte prosím platné heslo.</string>\n    <string name=\"password\">Heslo</string>\n    <string name=\"username_or_email\">Uživatelské jméno nebo E-mail</string>\n    <string name=\"followers\">Sledující</string>\n    <string name=\"following\">Sleduje</string>\n    <string name=\"followers_self\">Sledující</string>\n    <string name=\"following_self\">Sleduji</string>\n    <string name=\"follow\">Sledovat</string>\n    <string name=\"unfollow\">Přestat sledovat</string>\n    <string name=\"star\">Označit oblíbený</string>\n    <string name=\"unstar\">Zrušit oblíbený</string>\n    <string name=\"members\">Členové</string>\n    <string name=\"closing_issue\">Uzavírání návrhu…</string>\n    <string name=\"reopening_issue\">Znovu otevření návrhu…</string>\n    <string name=\"avatar\">Avatar</string>\n    <string name=\"creating_issue\">Vytváření návrhu…</string>\n    <string name=\"prefix_created\">vytvořeno\\u0020</string>\n    <string name=\"prefix_updated\">aktualizováno\\u0020</string>\n    <string name=\"prefix_opened\">otevřeno\\u0020</string>\n    <string name=\"clear\">Vyčistit</string>\n    <string name=\"pull_request_commits\">Commity: %d</string>\n    <string name=\"open_issues\">Otevřené návrhy</string>\n    <string name=\"closed_issues\">Uzavřené návrhy</string>\n    <string name=\"confirm_bookmark_delete_title\">Odstranit záložku</string>\n    <string name=\"save\">Uložit</string>\n    <string name=\"apply\">Použít</string>\n    <string name=\"labels_prefix\">Štítky:</string>\n    <string name=\"assignee\">Přiřazení</string>\n    <string name=\"milestone\">Milník</string>\n    <string name=\"labels\">Štítky</string>\n    <string name=\"issue_confirm_close_message\">Jste si jisti, že chcete tento návrh uzavřít?</string>\n    <string name=\"issue_confirm_reopen_message\">Jste si jisti, že chcete znovu otevřít tento návrh?</string>\n    <string name=\"issue_confirm_close_title\">Uzavřít návrh</string>\n    <string name=\"issue_confirm_reopen_title\">Znovu otevřít návrh</string>\n    <string name=\"closed\">Uzavřeno</string>\n    <string name=\"no_description_given\">Žádný dostupný popis.</string>\n    <string name=\"close\">Uzavřít</string>\n    <string name=\"reopen\">Znovu otevřít</string>\n    <string name=\"title_invalid_github_url\">Neplatná GitHub adresa</string>\n    <string name=\"message_invalid_github_url\">Následující adresa nemohla být otevřena touto aplikací:\\n{0}</string>\n    <string name=\"cancel\">Zrušit</string>\n    <string name=\"authenticator_conflict_title\">Konflikt aplikací</string>\n    <string name=\"authenticator_conflict_message\">Jiná nainstalovaná aplikace již používá GitHub ověření.\\n\\nMusíte tuto aplikaci odstranit z účtů &amp; synchronizovat nastavení a odinstalovat jí předtím, než použijete tuto GitHub aplikaci.</string>\n    <string name=\"opening_repository\">Otevírání {0}…</string>\n    <string name=\"commit_compare_title\">Porovnání commitů</string>\n    <string name=\"commit_prefix\">Commit\\u0020</string>\n    <string name=\"parent_prefix\">Rodič\\u0020</string>\n    <string name=\"authored\">přidal</string>\n    <string name=\"committed\">commitované</string>\n    <string name=\"diff_line_message\">Co byste chtěli udělat?</string>\n    <string name=\"comment_on_line\">Komentář na řádku</string>\n    <string name=\"view_entire_file\">Zobrazit celý soubor</string>\n    <string name=\"comparing_commits\">Porovnávání {0} commitů</string>\n    <string name=\"enable_wrapping\">Zapnout zalamování řádků</string>\n    <string name=\"disable_wrapping\">Vypnout zalamování řádků</string>\n    <string name=\"code\">Kód</string>\n    <string name=\"following_user\">Začíná sledování…</string>\n    <string name=\"unfollowing_user\">Končí sledování…</string>\n    <string name=\"starring_repository\">Přidávání do oblíbených…</string>\n    <string name=\"unstarring_repository\">Odebírání z oblíbených…</string>\n    <string name=\"navigate_to_user\">Navigovat na %s</string>\n    <string name=\"contributions\">%d commitů</string>\n\n    <!-- Tab titles, should be as short as possible -->\n    <string name=\"tab_repositories\">repozitáře</string>\n    <string name=\"tab_users\">uživatelé</string>\n    <string name=\"tab_news\">novinky</string>\n    <string name=\"tab_following_self\">sleduji</string>\n    <string name=\"tab_followers_self\">sledující</string>\n    <string name=\"tab_following\">sleduji</string>\n    <string name=\"tab_followers\">sledující</string>\n    <string name=\"tab_members\">členové</string>\n    <string name=\"tab_code\">kód</string>\n    <string name=\"tab_commits\">commity</string>\n    <string name=\"tab_issues\">návrhy</string>\n    <string name=\"tab_watched\">sledováno</string>\n    <string name=\"tab_assigned\">přiřazeno</string>\n    <string name=\"tab_created\">vytvořeno</string>\n    <string name=\"tab_mentioned\">zmíněno</string>\n    <string name=\"tab_mine\">mé</string>\n    <string name=\"tab_starred\">oblíbené</string>\n    <string name=\"tab_all\">vše</string>\n    <!-- -->\n    <string name=\"share\">Sdílet</string>\n    <string name=\"show_password\">Ukázat heslo</string>\n    <string name=\"write\">Napsat</string>\n    <string name=\"preview\">Náhled</string>\n    <string name=\"show_raw_markdown\">Zobrazit surový markdown</string>\n    <string name=\"render_markdown\">Renderovat markdown</string>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-de/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Copyright (c) 2015 PocketHub\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<resources>\n\n    <!-- Error messages -->\n    <string name=\"error_orgs_load\">Laden von Konto &amp; Organisation fehlgeschlagen</string>\n    <string name=\"error_issues_load\">Laden der Tickets fehlgeschlagen</string>\n    <string name=\"error_repos_load\">Laden der Repositories fehlgeschlagen</string>\n    <string name=\"error_repo_load\">Laden des Repositories fehlgeschlagen</string>\n    <string name=\"error_contributors_load\">Laden der Mitwirkenden fehlgeschlagen</string>\n    <string name=\"error_gist_load\">Laden des Gists fehlgeschlagen</string>\n    <string name=\"error_news_load\">Laden der Neuigkeiten fehlgeschlagen</string>\n    <string name=\"error_followers_load\">Laden der Anhänger fehlgeschlagen</string>\n    <string name=\"error_people_load\">Laden der Personen fehlgeschlagen</string>\n    <string name=\"error_person_load\">Laden der Person fehlgeschlagen</string>\n    <string name=\"error_gist_file_load\">Laden der Dateiinhalte des Gists fehlgeschlagen</string>\n    <string name=\"error_gists_load\">Laden der Gists fehlgeschlagen</string>\n    <string name=\"error_issue_load\">Laden der Tickets fehlgeschlagen</string>\n    <string name=\"error_collaborators_load\">Laden der Mitarbeiter fehlgeschlagen</string>\n    <string name=\"error_milestones_load\">Laden der Meilensteine fehlgeschlagen</string>\n    <string name=\"error_labels_load\">Laden der Markierungen fehlgeschlagen</string>\n    <string name=\"error_bookmarks_load\">Laden der Lesezeichen fehlgeschlagen</string>\n    <string name=\"error_members_load\">Laden der Mitglieder fehlgeschlagen</string>\n    <string name=\"error_commits_load\">Laden der Commits fehlgeschlagen</string>\n    <string name=\"error_commit_load\">Laden des Commits fehlgeschlagen</string>\n    <string name=\"error_file_load\">Laden der Datei fehlgeschlagen</string>\n    <string name=\"error_code_load\">Laden des Codes fehlgeschlagen</string>\n    <string name=\"error_refs_load\">Laden der Branches &amp; Tags fehlgeschlagen</string>\n    <string name=\"error_following_person\">Folgen fehlgeschlagen</string>\n    <string name=\"error_unfollowing_person\">Entfolgen fehlgeschlagen</string>\n    <string name=\"error_checking_following_status\">Prüfen des Folgestatus fehlgeschlagen</string>\n    <string name=\"error_starring_repository\">Favorisieren fehlgeschlagen</string>\n    <string name=\"error_unstarring_repository\">Defavorisieren fehlgeschlagen</string>\n    <string name=\"error_forking_repository\">Forking fehlgeschlagen</string>\n    <string name=\"error_deleting_repository\">Löschen fehlgeschlagen</string>\n    <string name=\"error_checking_starring_status\">Prüfen des Favoritenstatus fehlgeschlagen</string>\n    <string name=\"error_rendering_markdown\">Rendern der Markdown-Vorschau fehlgeschlagen</string>\n    <string name=\"error_users_search\">Suche nach Usern fehlgeschlagen</string>\n    <!--  -->\n\n\n    <!-- Loading messages -->\n    <string name=\"loading_gist\">Lade Gist…</string>\n    <string name=\"loading_more_issues\">Lade weitere Tickets…</string>\n    <string name=\"loading_issues\">Lade Tickets…</string>\n    <string name=\"loading_comments\">Lade Kommentare…</string>\n    <string name=\"loading_repositories\">Lade Repositories…</string>\n    <string name=\"loading_issue\">Lade Ticket…</string>\n    <string name=\"loading_news\">Lade Neuigkeiten…</string>\n    <string name=\"loading_followers\">Lade Anhänger…</string>\n    <string name=\"loading_people\">Lade Personen…</string>\n    <string name=\"loading_gists\">Lade Gists…</string>\n    <string name=\"loading_collaborators\">Lade Mitarbeiter…</string>\n    <string name=\"loading_milestones\">Lade Meilensteine…</string>\n    <string name=\"loading_labels\">Lade Markierungen…</string>\n    <string name=\"loading_commits\">Lade Commits…</string>\n    <string name=\"loading_files_and_comments\">Lade Dateien &amp; Kommentare…</string>\n    <string name=\"loading_refs\">Lade Branches &amp; Tags…</string>\n    <string name=\"loading\">Lade…</string>\n    <!--  -->\n\n\n    <!-- Empty messages -->\n    <string name=\"no_bookmarks\">Keine Lesezeichen</string>\n    <string name=\"no_repositories\">Keine Repositories</string>\n    <string name=\"no_contributors\">Keine Mitwirkende</string>\n    <string name=\"no_issues\">Keine Tickets</string>\n    <string name=\"no_gists\">Keine Gists</string>\n    <string name=\"no_people\">Keine Personen</string>\n    <string name=\"no_followers\">Keine Anhänger</string>\n    <string name=\"no_members\">Keine Mitglieder</string>\n    <string name=\"no_news\">Keine Neuigkeiten</string>\n    <string name=\"no_commits\">Keine Commits</string>\n    <!--  -->\n\n\n    <!-- Updating messages -->\n    <string name=\"updating_assignee\">Aktualisiere Verantwortlichen…</string>\n    <string name=\"updating_issue\">Aktualisiere Ticket…</string>\n    <string name=\"updating_labels\">Aktualisiere Markierungen…</string>\n    <string name=\"updating_milestone\">Aktualisiere Meilensteine…</string>\n    <!--  -->\n\n    <string name=\"home\">Home</string>\n    <string name=\"news\">Neuigkeiten</string>\n    <string name=\"issues\">Tickets</string>\n    <string name=\"gists\">Gists</string>\n    <string name=\"organizations\">Organisationen</string>\n    <string name=\"commits\">Commits</string>\n    <string name=\"global_search\">GitHub Suche</string>\n    <string name=\"find_repositories\">Repositories suchen</string>\n    <string name=\"find_issues\">Tickets finden</string>\n    <string name=\"search_title\">Suchen…</string>\n    <string name=\"clear_search_history\">Historie leeren</string>\n    <string name=\"search_history_cleared\">Suchhistorie geleert</string>\n    <string name=\"login_activity_authenticating\">Anmelden…</string>\n    <string name=\"creating_gist\">Erstelle Gist…</string>\n    <string name=\"create\">Erstellen</string>\n    <string name=\"create_gist\">Gist erstellen</string>\n    <string name=\"make_public\">Öffentlicher Gist</string>\n    <string name=\"gist_file_name_hint\">dateiname.rb</string>\n    <string name=\"gist\">Gist</string>\n    <string name=\"comments\">Kommentare</string>\n    <string name=\"files\">Dateien</string>\n    <string name=\"open\">Öffnen</string>\n    <string name=\"random\">Zufälliger Eintrag</string>\n    <string name=\"file_name\">Dateiname</string>\n    <string name=\"file_content\">Dateiinhalt</string>\n    <string name=\"new_gist\">Neuen Gist erstellen</string>\n    <string name=\"filter\">Filter</string>\n    <string name=\"bookmark\">Lesezeichen hinzufügen</string>\n    <string name=\"comment\">Kommentar</string>\n    <string name=\"delete\">Löschen</string>\n    <string name=\"delete_cap\">LÖSCHEN</string>\n    <string name=\"refresh\">Aktualisieren</string>\n    <string name=\"dashboard_issues_title\">Ticket-Übersicht</string>\n    <string name=\"bookmarks\">Lesezeichen</string>\n    <string name=\"gists_title\">Gists</string>\n    <string name=\"issue_title\">Ticket #</string>\n    <string name=\"pull_request_title\">Pull Request #</string>\n    <string name=\"gist_title\">Gist\\u0020</string>\n    <string name=\"filter_issues_title\">Tickets filtern</string>\n    <string name=\"create_comment_title\">Kommentar erstellen</string>\n    <string name=\"comment_hint\">Ihren Kommentar eingeben</string>\n    <string name=\"show_more\">Mehr zeigen…</string>\n    <string name=\"repositories\">Repositories</string>\n    <string name=\"contributors\">Mitwirkende</string>\n    <string name=\"issues_title\">Tickets</string>\n    <string name=\"edit_labels\">Markierungen bearbeiten</string>\n    <string name=\"milestone_prefix\">Meilenstein:</string>\n    <string name=\"edit_milestone\">Meilenstein bearbeiten</string>\n    <string name=\"edit_assignee\">Verantwortlichen bearbeiten</string>\n    <string name=\"description\">Beschreibung</string>\n    <string name=\"gist_description_hint\">erstellt mit Android</string>\n    <string name=\"title\">Titel</string>\n    <string name=\"edit\">Bearbeiten</string>\n    <string name=\"starring_gist\">Favorisiere Gist…</string>\n    <string name=\"unstarring_gist\">Defavorisiere Gist…</string>\n    <string name=\"accounts_label\">Konten</string>\n    <string name=\"select_assignee\">Verantwortlichen wählen</string>\n    <string name=\"select_milestone\">Meilenstein wählen</string>\n    <string name=\"select_labels\">Markierung wählen</string>\n    <string name=\"select_ref\">Branch oder Tag wählen</string>\n    <string name=\"no_milestone\">Keine Meilensteine</string>\n    <string name=\"unassigned\">Niemand zugewiesen</string>\n    <string name=\"assigned\">ist zugewiesen</string>\n    <string name=\"no_gists_found\">Keine Gists gefunden</string>\n    <string name=\"confirm_gist_delete_title\">Löschen bestätigen</string>\n    <string name=\"confirm_gist_delete_message\">Sind Sie sicher, dass Sie diesen Gist löschen möchten?</string>\n    <string name=\"deleting_gist\">Lösche Gist…</string>\n    <string name=\"creating_comment\">Erstelle Kommentar…</string>\n    <string name=\"editing_comment\">Editiere Kommentar…</string>\n    <string name=\"deleting_comment\">Lösche Kommentar…</string>\n    <string name=\"confirm_comment_delete_title\">Remove Comment</string>\n    <string name=\"confirm_comment_delete_message\">Are you sure you want to delete this Comment?</string>\n    <string name=\"confirm_bookmark_delete_message\">Sind Sie sicher, dass Sie dieses Lesezeichen löschen möchten?</string>\n    <string name=\"issue_dashboard\">Ticket-Übersicht</string>\n    <string name=\"new_issue\">Neues Ticket</string>\n    <string name=\"anonymous\">Anonym</string>\n    <string name=\"message_filter_saved\">Filter als Lesezeichen gespeichert</string>\n    <string name=\"recently_viewed\">ZULETZT ANGESEHEN</string>\n    <string name=\"recent\">Letzte</string>\n    <string name=\"recent_remove\">Liste leeren</string>\n    <string name=\"recent_list_remove\">Von Liste entfernen</string>\n    <string name=\"section_issue_status\">Status:</string>\n    <string name=\"status_open\">Offen</string>\n    <string name=\"status_closed\">Geschlossen</string>\n    <string name=\"section_issue_assigned\">Zugewiesen an:</string>\n    <string name=\"assignee_anyone\">Jeder</string>\n    <string name=\"section_issue_milestone\">Meilenstein:</string>\n    <string name=\"none\">Keine(r)</string>\n    <string name=\"section_issue_labels\">Markierungen:</string>\n    <string name=\"log_in\">Einloggen</string>\n    <string name=\"log_out\">Ausloggen</string>\n    <string name=\"signup_link\">Neu bei GitHub? &lt;a href=\\\"https://github.com/join\\\">Hier klicken&lt;/a> um sich anzumelden</string>\n    <string name=\"signup_link_two_factor_auth\">Nicht sicher was zu tun ist? &lt;a href=\\\"https://help.github.com/articles/about-two-factor-authentication\\\">Hilfe bekommen.&lt;/a></string>\n    <string name=\"connection_failed\">Kann nicht zu GitHub verbinden</string>\n    <string name=\"code_authentication_failed\">Authentifizierung fehlgeschlagen! Falscher Verifizierungsschlüssel</string>\n    <string name=\"invalid_login_or_password\">Bitte geben Sie einen gültigen Login &amp; Passwort an</string>\n    <string name=\"invalid_password\">Bitte geben Sie ein gültiges Passwort an.</string>\n    <string name=\"password\">Passwort</string>\n    <string name=\"username_or_email\">Benutzername oder E-Mail</string>\n    <string name=\"followers\">Meine Anhänger</string>\n    <string name=\"following\">Ich folge</string>\n    <string name=\"followers_self\">Meine Anhänger</string>\n    <string name=\"following_self\">Ich folge</string>\n    <string name=\"follow\">Folgen</string>\n    <string name=\"unfollow\">Entfolgen</string>\n    <string name=\"star\">Favorisieren</string>\n    <string name=\"unstar\">Defavorisieren</string>\n    <string name=\"fork\">Fork</string>\n    <string name=\"members\">Mitglieder</string>\n    <string name=\"closing_issue\">Schließe Ticket…</string>\n    <string name=\"reopening_issue\">Ticket neu öffnen…</string>\n    <string name=\"avatar\">Avatar</string>\n    <string name=\"creating_issue\">Erstelle Ticket…</string>\n    <string name=\"prefix_created\">erstellt\\u0020</string>\n    <string name=\"prefix_updated\">aktualisiert\\u0020</string>\n    <string name=\"prefix_opened\">eröffnet\\u0020</string>\n    <string name=\"clear\">Leeren</string>\n    <string name=\"pull_request_commits\">Commits: %d</string>\n    <string name=\"open_issues\">Offene Tickets</string>\n    <string name=\"closed_issues\">Geschlossene Tickets</string>\n    <string name=\"confirm_bookmark_delete_title\">Lesezeichen entfernen</string>\n    <string name=\"save\">Speichern</string>\n    <string name=\"apply\">Annehmen</string>\n    <string name=\"labels_prefix\">Markierungen:</string>\n    <string name=\"assignee\">Verantwortlicher</string>\n    <string name=\"milestone\">Meilenstein</string>\n    <string name=\"labels\">Markierungen</string>\n    <string name=\"issue_confirm_close_message\">Sind Sie sicher, dass Sie dieses Ticket schließen möchten?</string>\n    <string name=\"issue_confirm_reopen_message\">Sind Sie sicher, dass Sie dieses Ticket neu öffnen möchten?</string>\n    <string name=\"issue_confirm_close_title\">Ticket schließen</string>\n    <string name=\"issue_confirm_reopen_title\">Ticket neu öffnen</string>\n    <string name=\"closed\">Geschlossen</string>\n    <string name=\"no_description_given\">Keine Beschreibung angegeben.</string>\n    <string name=\"close\">Schließen</string>\n    <string name=\"reopen\">Neu öffnen</string>\n    <string name=\"title_invalid_github_url\">Ungültige GitHub URL</string>\n    <string name=\"message_invalid_github_url\">Die folgende URL konnte von der Anwendung nicht geöffnet werden:\\n{0}</string>\n    <string name=\"cancel\">Abbrechen</string>\n    <string name=\"not_sure\">NICHT SICHER</string>\n    <string name=\"authenticator_conflict_title\">App Konflikt</string>\n    <string name=\"authenticator_conflict_message\">Eine andere App ist derzeit für die Anmeldung bei GitHub konfiguriert.\\n\\nSie müssen diese App aus dem Bereich Konten &amp; Synchronisierung entfernen und diese App deinstallieren, bevor Sie die GitHub App verwenden können.</string>\n    <string name=\"opening_repository\">Öffne {0}…</string>\n    <string name=\"commit_compare_title\">Commit-Vergleich</string>\n    <string name=\"commit_prefix\">Commit\\u0020</string>\n    <string name=\"parent_prefix\">Vorgänger\\u0020</string>\n    <string name=\"authored\">verfasst</string>\n    <string name=\"committed\">eingespielt</string>\n    <string name=\"diff_line_message\">Was möchten Sie nun tun?</string>\n    <string name=\"comment_on_line\">Kommentar zu Zeile</string>\n    <string name=\"view_entire_file\">Zeige gesamte Datei</string>\n    <string name=\"comparing_commits\">Vergleiche {0} Commits</string>\n    <string name=\"enable_wrapping\">Zeilenumbruch aktivieren</string>\n    <string name=\"disable_wrapping\">Zeilenumbruch deaktivieren</string>\n    <string name=\"code\">Code</string>\n    <string name=\"following_user\">Folgen…</string>\n    <string name=\"unfollowing_user\">Entfolgen…</string>\n    <string name=\"starring_repository\">Favorisiere Repository…</string>\n    <string name=\"unstarring_repository\">Defavorisiere Repository…</string>\n    <string name=\"forking_repository\">Forking…</string>\n    <string name=\"deleting_repository\">Löschen…</string>\n    <string name=\"navigate_to_user\">Navigiere zu %s</string>\n    <string name=\"contributions\">%d Commits</string>\n\n    <!-- Tab titles, should be as short as possible -->\n    <string name=\"tab_repositories\">Repositories</string>\n    <string name=\"tab_users\">Users</string>\n    <string name=\"tab_news\">Neuigkeiten</string>\n    <string name=\"tab_following_self\">Ich folge</string>\n    <string name=\"tab_followers_self\">Anhänger</string>\n    <string name=\"tab_following\">Folgt</string>\n    <string name=\"tab_followers\">Anhänger</string>\n    <string name=\"tab_members\">Mitglieder</string>\n    <string name=\"tab_code\">Code</string>\n    <string name=\"tab_commits\">Commits</string>\n    <string name=\"tab_issues\">Tickets</string>\n    <string name=\"tab_watched\">beobachtet</string>\n    <string name=\"tab_assigned\">zugewiesen</string>\n    <string name=\"tab_created\">erstellt</string>\n    <string name=\"tab_mentioned\">erwähnt</string>\n    <string name=\"tab_mine\">eigene</string>\n    <string name=\"tab_starred\">favoriten</string>\n    <string name=\"tab_all\">alle</string>\n    <!--  -->\n    <string name=\"share\">Teilen</string>\n    <string name=\"show_password\">Passwort anzeigen</string>\n    <string name=\"write\">Schreiben</string>\n    <string name=\"preview\">Vorschau</string>\n    <string name=\"show_raw_markdown\">Zeige reines Markdown</string>\n    <string name=\"render_markdown\">Zeige gerendertes Markdown</string>\n\n    <string name=\"copy_hash\">Hash kopieren</string>\n    <string name=\"toast_msg_copied\">In Zwischenablage kopiert</string>\n\n    <!-- Navigation drawer strings -->\n    <string name=\"navigation_drawer_open\">Öffne navigation drawer</string>\n    <string name=\"navigation_drawer_close\">Schließe navigation drawer</string>\n    <string name=\"navigation_drawer_subheader\">Untertitel</string>\n\n    <!-- Deleting repo -->\n    <string name=\"are_you_sure\">Sind sich absolut sicher?</string>\n    <string name=\"unexpected_bad_things\">Diese Aktion kann NICHT rückgängig gemacht werden.\n        Dies wird dauerhaft das Repository, das Wiki, die Tickets, Kommentare\n        und zusätzlich alle Mitarbeiterverbände löschen.</string>\n    <string name=\"delete_successful\">Repository ist gelöscht</string>\n\n    <string name=\"login_or_email\">Benutzername oder E-Mail-Adresse</string>\n    <string name=\"loading_user\">Lade Benutzerprofil…</string>\n    <string name=\"temporary_login_message\"><b>Die Authentifizierung wird nun über die Website durchgeführt,\n        drücke den Einloggen-Button um fortzufahren.</b>\n        \\n\\n Da GitHub Restriktionen für Drittanbieter hinzugefügt hat,\n        ist es uns nicht möglich in bestimmten Organisationen zu schreiben.\n        Mehr Informationen darüber hier:\\n\n        https://help.github.com/articles/about-third-party-application-restrictions/</string>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-el/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<resources>\n\n    <!-- Error messages -->\n    <string name=\"error_orgs_load\">Η φόρτωση λογαριασμού &amp; οργανισμών απέτυχε</string>\n    <string name=\"error_issues_load\">Η φόρτωση ζητημάτων απέτυχε</string>\n    <string name=\"error_repos_load\">Η φόρτωση αποθετηρίων απέτυχε</string>\n    <string name=\"error_repo_load\">Η φόρτωση αποθετηρίου απέτυχε</string>\n    <string name=\"error_contributors_load\">Η φόρτωση συνεισφέροντων απέτυχε</string>\n    <string name=\"error_gist_load\">Η φόρτωση Gist απέτυχε</string>\n    <string name=\"error_news_load\">Η φόρτωση νέων απέτυχε</string>\n    <string name=\"error_followers_load\">Η φόρτωση ακόλουθων απέτυχε</string>\n    <string name=\"error_people_load\">Η φόρτωση κόσμου απέτυχε</string>\n    <string name=\"error_person_load\">Η φόρτωση προσώπου απέτυχε</string>\n    <string name=\"error_gist_file_load\">Η φόρτωση του περιεχομένου του αρχείου Gist απέτυχε</string>\n    <string name=\"error_gists_load\">Η φόρτωση Gists απέτυχε</string>\n    <string name=\"error_issue_load\">Η φόρτωση ζητήματος απέτυχε</string>\n    <string name=\"error_collaborators_load\">Η φόρτωση συνεργατών απέτυχε</string>\n    <string name=\"error_milestones_load\">Η φόρτωση οροσήμων απέτυχε</string>\n    <string name=\"error_labels_load\">Η φόρτωση ετικετών απέτυχε</string>\n    <string name=\"error_bookmarks_load\">Η φόρτωση σελιδοδεικτών απέτυχε</string>\n    <string name=\"error_members_load\">Η φόρτωση μελών απέτυχε</string>\n    <string name=\"error_commits_load\">Η φόρτωση υποβολών απέτυχε</string>\n    <string name=\"error_commit_load\">Η φόρτωση υποβολής απέτυχε</string>\n    <string name=\"error_file_load\">Η φόρτωση αρχείου απέτυχε</string>\n    <string name=\"error_code_load\">Η φόρτωση κώδικα απέτυχε</string>\n    <string name=\"error_refs_load\">Η φόρτωση κλάδων &amp; tags απέτυχε</string>\n    <string name=\"error_following_person\">Η ακολούθηση απέτυχε</string>\n    <string name=\"error_unfollowing_person\">Η αναίρεση ακολούθησης απέτυχε</string>\n    <string name=\"error_checking_following_status\">Ο έλεγχος κατάστασης ακολούθησης απέτυχε</string>\n    <string name=\"error_starring_repository\">Η επισήμανση απέτυχε</string>\n    <string name=\"error_unstarring_repository\">Η αναίρεση επισήμανσης απέτυχε</string>\n    <string name=\"error_checking_starring_status\">Ο έλεγχος κατάστασης επισήμανσης απέτυχε</string>\n    <string name=\"error_rendering_markdown\">Η απόδοση περιεχομένου markdown απέτυχε</string>\n    <string name=\"error_users_search\">Η αναζήτηση χρηστών απέτυχε</string>\n    <!--  -->\n\n\n    <!-- Loading messages -->\n    <string name=\"loading_gist\">Φορτώνεται Gist…</string>\n    <string name=\"loading_more_issues\">Φορτώνονται Περισσότερα Ζητήματα…</string>\n    <string name=\"loading_issues\">Φορτώνονται Ζητήματα…</string>\n    <string name=\"loading_comments\">Φορτώνονται Σχόλια…</string>\n    <string name=\"loading_repositories\">Φορτώνονται Αποθετήρια…</string>\n    <string name=\"loading_issue\">Φορτώνεται Ζήτημα…</string>\n    <string name=\"loading_news\">Φορτώνονται Νέα…</string>\n    <string name=\"loading_followers\">Φορτώνονται Ακόλουθοι…</string>\n    <string name=\"loading_people\">Φορτώνονται Άνθρωποι…</string>\n    <string name=\"loading_gists\">Φορτώνονται Gists…</string>\n    <string name=\"loading_collaborators\">Φορτώνονται Συνεργάτες…</string>\n    <string name=\"loading_milestones\">Φορτώνονται Ορόσημα…</string>\n    <string name=\"loading_labels\">Φορτώνονται Ετικέτες…</string>\n    <string name=\"loading_commits\">Φορτώνονται Υποβολές…</string>\n    <string name=\"loading_files_and_comments\">Φορτώνονται Αρχεία &amp; Σχόλια…</string>\n    <string name=\"loading_refs\">Φορτώνονται Κλάδοι &amp; Tags…</string>\n    <!--  -->\n\n\n    <!-- Empty messages -->\n    <string name=\"no_bookmarks\">Δεν υπάρχουν Σελιδοδείκτες</string>\n    <string name=\"no_repositories\">Δεν υπάρχουν Αποθετήρια</string>\n    <string name=\"no_contributors\">Δεν υπάρχουν συνεισφέροντες</string>\n    <string name=\"no_issues\">Δεν υπάρχουν Ζητήματα</string>\n    <string name=\"no_gists\">Δεν υπάρχουν Gists</string>\n    <string name=\"no_people\">Δεν υπάρχουν Άνθρωποι</string>\n    <string name=\"no_followers\">Δεν υπάρχουν Ακόλουθοι</string>\n    <string name=\"no_members\">Δεν υπάρχουν Μέλη</string>\n    <string name=\"no_news\">Δεν υπάρχουν Νέα</string>\n    <string name=\"no_commits\">Δεν υπάρχουν Υποβολές</string>\n    <!--  -->\n\n\n    <!-- Updating messages -->\n    <string name=\"updating_assignee\">Ενημέρωση Εντολοδόχου…</string>\n    <string name=\"updating_issue\">Ενημέρωση Ζητήματος…</string>\n    <string name=\"updating_labels\">Ενημέρωση Ετικετών…</string>\n    <string name=\"updating_milestone\">Ενημέρωση Οροσήμου…</string>\n    <!--  -->\n\n    <string name=\"news\">Νέα</string>\n    <string name=\"issues\">Ζητήματα</string>\n    <string name=\"gists\">Gists</string>\n    <string name=\"commits\">Υποβολές</string>\n    <string name=\"global_search\">Αναζήτηση GitHub</string>\n    <string name=\"find_repositories\">Εύρεση Αποθετηρίων</string>\n    <string name=\"find_issues\">Εύρεση Ζητημάτων</string>\n    <string name=\"search_title\">Αναζήτηση…</string>\n    <string name=\"clear_search_history\">Εκκαθάριση Ιστορικού Αναζήτησης</string>\n    <string name=\"search_history_cleared\">Το ιστορικό αναζήτησης καθαρίστηκε</string>\n    <string name=\"login_activity_authenticating\">Γίνεται είσοδος…</string>\n    <string name=\"creating_gist\">Δημιουργείται Gist…</string>\n    <string name=\"create\">Δημιουργία</string>\n    <string name=\"create_gist\">Δημιουργία Gist</string>\n    <string name=\"make_public\">Κάνε αυτό το Gist δημόσιο</string>\n    <string name=\"gist_file_name_hint\">file.rb</string>\n    <string name=\"gist\">Gist</string>\n    <string name=\"comments\">Σχόλια</string>\n    <string name=\"files\">Αρχεία</string>\n    <string name=\"open\">Άνοιξε</string>\n    <string name=\"random\">Τυχαία</string>\n    <string name=\"file_name\">Όνομα Αρχείου</string>\n    <string name=\"file_content\">Περιεχόμενο Αρχείου</string>\n    <string name=\"new_gist\">Νέο Gist</string>\n    <string name=\"filter\">Φίλτρο</string>\n    <string name=\"bookmark\">Σελιδοδείκτης</string>\n    <string name=\"comment\">Σχόλιο</string>\n    <string name=\"delete\">Διάγραψε</string>\n    <string name=\"refresh\">Ανανέωσε</string>\n    <string name=\"dashboard_issues_title\">Πίνακας Ζητημάτων</string>\n    <string name=\"bookmarks\">Σελιδοδείκτες</string>\n    <string name=\"gists_title\">Gists</string>\n    <string name=\"issue_title\">Ζήτημα #</string>\n    <string name=\"pull_request_title\">Αίτηση Εξαγωγής #</string>\n    <string name=\"gist_title\">Gist\\u0020</string>\n    <string name=\"filter_issues_title\">Φίλτραρε Ζητήματα</string>\n    <string name=\"create_comment_title\">Δημιούργησε Σχόλιο</string>\n    <string name=\"comment_hint\">Εισήγαγε σχόλιο</string>\n    <string name=\"show_more\">Εμφάνισε περισσότερα…</string>\n    <string name=\"repositories\">Αποθετήρια</string>\n    <string name=\"contributors\">Συνεισφέροντες</string>\n    <string name=\"issues_title\">Ζητήματα</string>\n    <string name=\"edit_labels\">Διόρθωσε Ετικέτες</string>\n    <string name=\"milestone_prefix\">Ορόσημο:</string>\n    <string name=\"edit_milestone\">Επεξεργασία Ορόσημου</string>\n    <string name=\"edit_assignee\">Επεξεργασία Εντολοδόχου</string>\n    <string name=\"description\">Περιγραφή</string>\n    <string name=\"gist_description_hint\">Gist δημιουργημένο από Android</string>\n    <string name=\"title\">Τίτλος</string>\n    <string name=\"edit\">Επεξεργασία</string>\n    <string name=\"starring_gist\">Επισήμανε Gist…</string>\n    <string name=\"unstarring_gist\">Αφαίρεσε επισήμανση από Gist…</string>\n    <string name=\"accounts_label\">Λογαριασμοί</string>\n    <string name=\"select_assignee\">Επέλεξε Εντολοδόχο</string>\n    <string name=\"select_milestone\">Επέλεξε Ορόσημο</string>\n    <string name=\"select_labels\">Επέλεξε Ετικέτες</string>\n    <string name=\"select_ref\">Επέλεξε Κλάδο ή Tag</string>\n    <string name=\"no_milestone\">Δεν βρέθηκε ορόσημο</string>\n    <string name=\"unassigned\">Κανείς δεν είναι εντολοδόχος</string>\n    <string name=\"assigned\">έχετε γίνει εντολοδόχος</string>\n    <string name=\"no_gists_found\">Δεν βρέθηκαν Gists</string>\n    <string name=\"confirm_gist_delete_title\">Επιβεβαιώστε Διαγραφή</string>\n    <string name=\"confirm_gist_delete_message\">Είστε σίγουρη-ος για τη διαγραφή του Gist?</string>\n    <string name=\"deleting_gist\">Διαγραφή Gist…</string>\n    <string name=\"creating_comment\">Δημιουργία σχόλιου…</string>\n    <string name=\"confirm_bookmark_delete_message\">Είστε σίγουρη-ος για τη διαγραφή του Σελιδοδείκτη?</string>\n    <string name=\"issue_dashboard\">Πίνακας Ζητημάτων</string>\n    <string name=\"new_issue\">Νέο Ζήτημα</string>\n    <string name=\"anonymous\">Ανώνυμος</string>\n    <string name=\"message_filter_saved\">Το φίλτρο ζητημάτων αποθηκεύτηκε στους σελιδοδείκτες</string>\n    <string name=\"recently_viewed\">Πρόσφατα Προβληθέντα</string>\n    <string name=\"recent\">Πρόσφατα</string>\n    <string name=\"recent_remove\">Διαγραφή Προσφάτων</string>\n    <string name=\"recent_list_remove\">Αφαίρεση από τα πρόσφατα χρησιμοποιημένα</string>\n    <string name=\"section_issue_status\">Κατάσταση:</string>\n    <string name=\"status_open\">Ανοικτή</string>\n    <string name=\"status_closed\">Κλειστή</string>\n    <string name=\"section_issue_assigned\">Έχει Ανατεθεί σε:</string>\n    <string name=\"assignee_anyone\">Οποιοσδήποτε</string>\n    <string name=\"section_issue_milestone\">Ορόσημο:</string>\n    <string name=\"none\">Κανείς</string>\n    <string name=\"section_issue_labels\">Ετικέτες:</string>\n    <string name=\"log_in\">Είσοδος</string>\n    <string name=\"signup_link\">Νέα/ος στο GitHub? &lt;a href=\\\"https://github.com/join\\\">Πατήστε εδώ&lt;/a> για είσοδο</string>\n    <string name=\"signup_link_two_factor_auth\">Δεν είστε σίγουρη-ος τι να κάνετε &lt; a href=\\\"https://help.github.com/articles/about-two-factor-authentication\\\">Λήψη Βοήθειας.&lt;/a></string>\n    <string name=\"connection_failed\">Αδυναμία σύνδεσης στο GitHub</string>\n    <string name=\"invalid_login_or_password\">Παρακαλούμε εισάγετε έγκυρο όνομα χρήστη &amp; συνθηματικό</string>\n    <string name=\"invalid_password\">Παρακαλούμε εισάγετε έγκυρο συνθηματικό.</string>\n    <string name=\"password\">Συνθηματικό</string>\n    <string name=\"login_or_email\">Όνομα ή Email</string>\n    <string name=\"followers\">Ακόλουθοι</string>\n    <string name=\"following\">Ακολουθούν</string>\n    <string name=\"followers_self\">Ακόλουθοι</string>\n    <string name=\"following_self\">Ακολουθώ</string>\n    <string name=\"follow\">Ακολουθώ</string>\n    <string name=\"unfollow\">Μη Ακολούθηση</string>\n    <string name=\"star\">Επισήμανση</string>\n    <string name=\"unstar\">Μη Επισήμανση</string>\n    <string name=\"members\">Μέλη</string>\n    <string name=\"closing_issue\">Κλείσιμο ζητήματος…</string>\n    <string name=\"reopening_issue\">Ξανάνοιγμα ζητήματος…</string>\n    <string name=\"avatar\">Άβαταρ</string>\n    <string name=\"creating_issue\">Δημιουργείται Ζήτημα…</string>\n    <string name=\"prefix_created\">δημιουργήθηκε\\u0020</string>\n    <string name=\"prefix_updated\">ενημερώθηκε\\u0020</string>\n    <string name=\"prefix_opened\">άνοιξε\\u0020</string>\n    <string name=\"clear\">Καθάρισε</string>\n    <string name=\"pull_request_commits\">Υποβολές: %d</string>\n    <string name=\"open_issues\">Ανοικτά Ζητήματα</string>\n    <string name=\"closed_issues\">Κλειστά Ζητήματα</string>\n    <string name=\"confirm_bookmark_delete_title\">Αφαίρεσε Σελιδοδείκτη</string>\n    <string name=\"save\">Σώσε</string>\n    <string name=\"apply\">Εφαρμογή</string>\n    <string name=\"labels_prefix\">Ετικέτες:</string>\n    <string name=\"assignee\">Εντολοδόχοι</string>\n    <string name=\"milestone\">Ορόσημο</string>\n    <string name=\"labels\">Ετικέτες</string>\n    <string name=\"issue_confirm_close_message\">Είστε σίγουρη-ος ότι θέλετε να κλείσετε αυτό το ζήτημα?</string>\n    <string name=\"issue_confirm_reopen_message\">Είστε σίγουρη-ος ότι θέλετε να ξανανοίξετε αυτό το ζήτημα?</string>\n    <string name=\"issue_confirm_close_title\">Κλείστε Ζήτημα</string>\n    <string name=\"issue_confirm_reopen_title\">Ξανανοίξτε Ζήτημα</string>\n    <string name=\"closed\">Κλειστή</string>\n    <string name=\"no_description_given\">Δεν δόθηκε περιγραφή.</string>\n    <string name=\"close\">Κλείσε</string>\n    <string name=\"reopen\">Ξανάνοιξε</string>\n    <string name=\"title_invalid_github_url\">Λανθασμένο GitHub URL</string>\n    <string name=\"message_invalid_github_url\">Το ακόλουθο URL δεν μπορεί να ανοίξει από αυτή την εφαρμογή:\\n{0}</string>\n    <string name=\"cancel\">Ακύρωση</string>\n    <string name=\"authenticator_conflict_title\">Σύγκρουση εφαρμογών</string>\n    <string name=\"authenticator_conflict_message\">Κάποια άλλη εφαρμογή είναι ήδη ρυθμισμένη για αυθεντικοποίηση GitHub.\\n\\nΘα πρέπει να αφαιρέσετε την άλλη εφαρμογή από τις ρυθμίσεις Λογαριασμών &amp; συγχρονισμού και να την απεγκαταστήσετε πριν να χρησιμοποιηθεί η εφαρμογή GitHub.</string>\n    <string name=\"opening_repository\">Ανοίγει {0}…</string>\n    <string name=\"commit_compare_title\">Σύγκριση Υποβολής</string>\n    <string name=\"commit_prefix\">Υποβολή\\u0020</string>\n    <string name=\"parent_prefix\">Γονέας\\u0020</string>\n    <string name=\"authored\">εξουσιοδότημένος</string>\n    <string name=\"committed\">υποβλήθηκε</string>\n    <string name=\"diff_line_message\">Τί θέλετε να κάνετε?</string>\n    <string name=\"comment_on_line\">Σχολιάστε στη γραμμή</string>\n    <string name=\"view_entire_file\">Δείτε όλο το αρχείο</string>\n    <string name=\"comparing_commits\">Συγκρίνονται {0} υποβολές</string>\n    <string name=\"enable_wrapping\">Ενεργοποίησε επικάλυψη</string>\n    <string name=\"disable_wrapping\">Απενεργοποίησε επικάλυψη</string>\n    <string name=\"code\">Κώδικας</string>\n    <string name=\"following_user\">Ακολούθηση…</string>\n    <string name=\"unfollowing_user\">Μη Ακολούθηση…</string>\n    <string name=\"starring_repository\">Επισήμανση…</string>\n    <string name=\"unstarring_repository\">Μη Επισήμανση…</string>\n    <string name=\"navigate_to_user\">Πλοήγηση σε %s</string>\n    <string name=\"contributions\">%d υποβολές</string>\n\n    <!-- Tab titles, should be as short as possible -->\n    <string name=\"tab_repositories\">αποθετήρια</string>\n    <string name=\"tab_users\">χρήστες</string>\n    <string name=\"tab_news\">νέα</string>\n    <string name=\"tab_following_self\">ακολούθηση</string>\n    <string name=\"tab_followers_self\">ακόλουθοι</string>\n    <string name=\"tab_following\">ακολούθηση</string>\n    <string name=\"tab_followers\">ακόλουθοι</string>\n    <string name=\"tab_members\">μέλη</string>\n    <string name=\"tab_code\">κώδικας</string>\n    <string name=\"tab_commits\">υποβολές</string>\n    <string name=\"tab_issues\">ζητήματα</string>\n    <string name=\"tab_watched\">αναγνώσεις</string>\n    <string name=\"tab_assigned\">αναθέσεις</string>\n    <string name=\"tab_created\">δημιουργίες</string>\n    <string name=\"tab_mentioned\">αναφορές</string>\n    <string name=\"tab_mine\">προσωπικά</string>\n    <string name=\"tab_starred\">επισημασμένα</string>\n    <string name=\"tab_all\">όλα</string>\n    <!--  -->\n    <string name=\"share\">Μοίρασε</string>\n    <string name=\"show_password\">Εμφάνισε συνθηματικό</string>\n    <string name=\"write\">Γράψε</string>\n    <string name=\"preview\">Προεπισκόπηση</string>\n    <string name=\"show_raw_markdown\">Εμφάνισε απλό markdown</string>\n    <string name=\"render_markdown\">Απόδοσε markdown</string>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-es/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Copyright (c) 2015 PocketHub\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<resources>\n\n    <!-- Mensajes de error -->\n    <string name=\"error_orgs_load\">Error al cargar la cuenta y las organizaciones</string>\n    <string name=\"error_issues_load\">Error al cargar incidencias</string>\n    <string name=\"error_repos_load\">Error al cargar repositorios</string>\n    <string name=\"error_repo_load\">Error al cargar repositorio</string>\n    <string name=\"error_contributors_load\">Error al cargar colaboradores</string>\n    <string name=\"error_gist_load\">Error al cargar gist</string>\n    <string name=\"error_news_load\">Error al cargar noticias</string>\n    <string name=\"error_followers_load\">Error al cargar seguidores</string>\n    <string name=\"error_people_load\">Error al cargar usuarios</string>\n    <string name=\"error_person_load\">Error al cargar usuario</string>\n    <string name=\"error_gist_file_load\">Error al cargar el contenido del gist</string>\n    <string name=\"error_gists_load\">Error al cargar gists</string>\n    <string name=\"error_issue_load\">Error al cargar incidencia</string>\n    <string name=\"error_collaborators_load\">Error al cargar colaboradores</string>\n    <string name=\"error_milestones_load\">Error al cargar hitos</string>\n    <string name=\"error_labels_load\">Error al cargar etiquetas</string>\n    <string name=\"error_bookmarks_load\">Error al cargar marcadores</string>\n    <string name=\"error_members_load\">Error al cargar miembros</string>\n    <string name=\"error_commits_load\">Error al cargar los commits</string>\n    <string name=\"error_commit_load\">Error al cargar el commit</string>\n    <string name=\"error_file_load\">Error al cargar el fichero</string>\n    <string name=\"error_code_load\">Error al cargar el código</string>\n    <string name=\"error_refs_load\">Error al cargar las ramas y las etiquetas</string>\n    <string name=\"error_following_person\">Error al seguir</string>\n    <string name=\"error_unfollowing_person\">Error al dejar de seguir</string>\n    <string name=\"error_checking_following_status\">Error al comprobar el estado de seguimiento</string>\n    <string name=\"error_starring_repository\">Error al marcar como destacado</string>\n    <string name=\"error_unstarring_repository\">Error al desmarcar como destacado</string>\n    <string name=\"error_checking_starring_status\">Error al comprobar el estado de destacado</string>\n    <string name=\"error_rendering_markdown\">Error al renderizar markdown</string>\n    <string name=\"error_users_search\">Error al buscar usuarios</string>\n    <!--  -->\n\n\n    <!-- Mensajes de carga -->\n    <string name=\"loading_gist\">Cargando gist&#8230;</string>\n    <string name=\"loading_more_issues\">Cargando más incidencias&#8230;</string>\n    <string name=\"loading_issues\">Cargando incidencias&#8230;</string>\n    <string name=\"loading_comments\">Cargando comentarios&#8230;</string>\n    <string name=\"loading_repositories\">Cargando repositorios&#8230;</string>\n    <string name=\"loading_issue\">Cargando incidencia&#8230;</string>\n    <string name=\"loading_news\">Cargando noticias&#8230;</string>\n    <string name=\"loading_followers\">Cargando seguidores&#8230;</string>\n    <string name=\"loading_people\">Cargando usuarios&#8230;</string>\n    <string name=\"loading_gists\">Cargando gists&#8230;</string>\n    <string name=\"loading_collaborators\">Cargando colaboradores&#8230;</string>\n    <string name=\"loading_milestones\">Cargando hitos&#8230;</string>\n    <string name=\"loading_labels\">Cargando etiquetas&#8230;</string>\n    <string name=\"loading_commits\">Cargando commits&#8230;</string>\n    <string name=\"loading_files_and_comments\">Cargando ficheros y comentarios&#8230;</string>\n    <string name=\"loading_refs\">Cargando ramas y etiquetas&#8230;</string>\n    <!--  -->\n\n\n    <!-- Mensajes vacíos -->\n    <string name=\"no_bookmarks\">No hay marcadores</string>\n    <string name=\"no_repositories\">No hay repositorios</string>\n    <string name=\"no_contributors\">No hay colaboradores</string>\n    <string name=\"no_issues\">No hay incidencias</string>\n    <string name=\"no_gists\">No hay gists</string>\n    <string name=\"no_people\">No hay usuarios</string>\n    <string name=\"no_followers\">No hay seguidores</string>\n    <string name=\"no_members\">No hay miembros</string>\n    <string name=\"no_news\">No hay noticias</string>\n    <string name=\"no_commits\">No hay commits</string>\n    <!--  -->\n\n\n    <!-- Mensajes de actualizaciones -->\n    <string name=\"updating_assignee\">Actualizando responsable&#8230;</string>\n    <string name=\"updating_issue\">Actualizando icidencia&#8230;</string>\n    <string name=\"updating_labels\">Actualizando etiquetas&#8230;</string>\n    <string name=\"updating_milestone\">Actualizando hitos&#8230;</string>\n    <!--  -->\n\n    <string name=\"news\">Noticias</string>\n    <string name=\"issues\">Incidencias</string>\n    <string name=\"gists\">Gists</string>\n    <string name=\"commits\">Commits</string>\n    <string name=\"global_search\">Buscar en GitHub</string>\n    <string name=\"find_repositories\">Buscar Repositorios</string>\n    <string name=\"find_issues\">Buscar Incidencias</string>\n    <string name=\"search_title\">Buscar&#8230;</string>\n    <string name=\"clear_search_history\">Limpiar Historial</string>\n    <string name=\"search_history_cleared\">Historial de búsquedas eliminado</string>\n    <string name=\"login_activity_authenticating\">Iniciando sesión&#8230;</string>\n    <string name=\"creating_gist\">Creando gist&#8230;</string>\n    <string name=\"create\">Crear</string>\n    <string name=\"create_gist\">Crear gist</string>\n    <string name=\"make_public\">Hacer este gist público</string>\n    <string name=\"gist_file_name_hint\">fichero.rb</string>\n    <string name=\"gist\">Gist</string>\n    <string name=\"comments\">Comentarios</string>\n    <string name=\"files\">Archivos</string>\n    <string name=\"open\">Abrir</string>\n    <string name=\"random\">Aleatorio</string>\n    <string name=\"file_name\">Nombre del fichero</string>\n    <string name=\"file_content\">Contenido del fichero</string>\n    <string name=\"new_gist\">Nuevo gist</string>\n    <string name=\"filter\">Filtrar</string>\n    <string name=\"bookmark\">Marcador</string>\n    <string name=\"comment\">Comentario</string>\n    <string name=\"delete\">Borrar</string>\n    <string name=\"refresh\">Recargar</string>\n    <string name=\"dashboard_issues_title\">Panel de incidencias</string>\n    <string name=\"bookmarks\">Marcadores</string>\n    <string name=\"gists_title\">Gists</string>\n    <string name=\"issue_title\">Incidencia #</string>\n    <string name=\"pull_request_title\">Solicitud de pull #</string>\n    <string name=\"gist_title\">Gist\\u0020</string>\n    <string name=\"filter_issues_title\">Filtrar Incidencias</string>\n    <string name=\"create_comment_title\">Crear comentario</string>\n    <string name=\"comment_hint\">Escribe un comentario</string>\n    <string name=\"show_more\">Ver más&#8230;</string>\n    <string name=\"repositories\">Repositorios</string>\n    <string name=\"contributors\">Colaboradores</string>\n    <string name=\"issues_title\">Incidencias</string>\n    <string name=\"edit_labels\">Editar etiquetas</string>\n    <string name=\"milestone_prefix\">Hito:</string>\n    <string name=\"edit_milestone\">Editar hito</string>\n    <string name=\"edit_assignee\">Editar responsable</string>\n    <string name=\"description\">Descripción</string>\n    <string name=\"gist_description_hint\">Gist creado en Android</string>\n    <string name=\"title\">Título</string>\n    <string name=\"edit\">Editar</string>\n    <string name=\"starring_gist\">Destacando gist&#8230;</string>\n    <string name=\"unstarring_gist\">Eliminado gist de destacados&#8230;</string>\n    <string name=\"accounts_label\">Cuentas</string>\n    <string name=\"select_assignee\">Seleccionar responsable</string>\n    <string name=\"select_milestone\">Seleccionar hito</string>\n    <string name=\"select_labels\">Seleccionar etiquetas</string>\n    <string name=\"select_ref\">Seleccionar rama o etiqueta</string>\n    <string name=\"no_milestone\">No hay hitos</string>\n    <string name=\"unassigned\">No hay nadie asignado</string>\n    <string name=\"assigned\">está asignado</string>\n    <string name=\"no_gists_found\">No se han encontrado gists</string>\n    <string name=\"confirm_gist_delete_title\">Confirmar borrado</string>\n    <string name=\"confirm_gist_delete_message\">¿Seguro que quieres eliminar este gist?</string>\n    <string name=\"deleting_gist\">Borrando gist&#8230;</string>\n    <string name=\"creating_comment\">Creando comentario&#8230;</string>\n    <string name=\"confirm_bookmark_delete_message\">¿Seguro que quieres eliminar este marcador?</string>\n    <string name=\"issue_dashboard\">Panel de incidencias</string>\n    <string name=\"new_issue\">Nueva incidencia</string>\n    <string name=\"anonymous\">Anónimo</string>\n    <string name=\"message_filter_saved\">Filtro de incidencias guardado en marcadores</string>\n    <string name=\"recently_viewed\">VISTO RECIENTEMENTE</string>\n    <string name=\"recent\">Recientes</string>\n    <string name=\"recent_remove\">Eliminar reciente</string>\n    <string name=\"recent_list_remove\">Eliminar de recientes</string>\n    <string name=\"section_issue_status\">Estado:</string>\n    <string name=\"status_open\">Abierto</string>\n    <string name=\"status_closed\">Cerrado</string>\n    <string name=\"section_issue_assigned\">Asignado a:</string>\n    <string name=\"assignee_anyone\">Cualquiera</string>\n    <string name=\"section_issue_milestone\">Hito:</string>\n    <string name=\"none\">Ninguno</string>\n    <string name=\"section_issue_labels\">Etiquetas:</string>\n    <string name=\"log_in\">Inicia sesión</string>\n    <string name=\"signup_link\">¿Nuevo en GitHub? &lt;a href=\\\"https://github.com/join\\\">Haz click aquí&lt;/a> para registarte</string>\n    <string name=\"signup_link_two_factor_auth\">¿No sabes que hacer? &lt;a href=\\\"https://help.github.com/articles/about-two-factor-authentication\\\">Obtén ayuda.&lt;/a></string>\n    <string name=\"connection_failed\">No se ha podido conectar con GitHub</string>\n    <string name=\"invalid_login_or_password\">Por favor introduce un usuario y contraseña válidos</string>\n    <string name=\"invalid_password\">Por favor introduce una contraseña válida.</string>\n    <string name=\"password\">Contraseña</string>\n    <string name=\"followers\">Seguidores</string>\n    <string name=\"following\">Siguiendo</string>\n    <string name=\"followers_self\">Seguidores</string>\n    <string name=\"following_self\">Siguiendo</string>\n    <string name=\"follow\">Seguir</string>\n    <string name=\"unfollow\">Dejar de seguir</string>\n    <string name=\"star\">Destacar</string>\n    <string name=\"unstar\">No Destacar</string>\n    <string name=\"members\">Miembros</string>\n    <string name=\"closing_issue\">Cerrando incidencia&#8230;</string>\n    <string name=\"reopening_issue\">Reabriendo incidencia&#8230;</string>\n    <string name=\"avatar\">Avatar</string>\n    <string name=\"creating_issue\">Creando incidencia&#8230;</string>\n    <string name=\"prefix_created\">creado\\u0020</string>\n    <string name=\"prefix_updated\">actualizado\\u0020</string>\n    <string name=\"prefix_opened\">abierto\\u0020</string>\n    <string name=\"clear\">Limpiar</string>\n    <string name=\"pull_request_commits\">Commits: %d</string>\n    <string name=\"open_issues\">Incidencias abiertas</string>\n    <string name=\"closed_issues\">Incidencias cerradas</string>\n    <string name=\"confirm_bookmark_delete_title\">Eliminar marcador</string>\n    <string name=\"save\">Guardar</string>\n    <string name=\"apply\">Aplicar</string>\n    <string name=\"labels_prefix\">Etiquetas:</string>\n    <string name=\"assignee\">Responsable</string>\n    <string name=\"milestone\">Hito</string>\n    <string name=\"labels\">Etiquetas</string>\n    <string name=\"issue_confirm_close_message\">¿Seguro que quieres cerrar esta incidencia?</string>\n    <string name=\"issue_confirm_reopen_message\">¿Seguro que quieres reabrir esta incidencia?</string>\n    <string name=\"issue_confirm_close_title\">Cerrar incidencia</string>\n    <string name=\"issue_confirm_reopen_title\">Reabrir incidencia</string>\n    <string name=\"closed\">Cerrado</string>\n    <string name=\"no_description_given\">Sin descripción.</string>\n    <string name=\"close\">Cerrar</string>\n    <string name=\"reopen\">Reabrir</string>\n    <string name=\"title_invalid_github_url\">URL de GitHub inválida</string>\n    <string name=\"message_invalid_github_url\">La aplicación no pudo abrir la siguiente URL:\\n{0}</string>\n    <string name=\"cancel\">Cancelar</string>\n    <string name=\"authenticator_conflict_title\">Conflicto con la aplicación</string>\n    <string name=\"authenticator_conflict_message\">Una de las aplicaciones instaladas está configurada para la\n        autenticación con GitHub.\\n\\nDebes eliminar la otra aplicación del menú de ajustes Cuentas y sincronización y\n        desinstalarla antes de poder usar la aplicación de GitHub.</string>\n    <string name=\"opening_repository\">Abriendo {0}&#8230;</string>\n    <string name=\"commit_compare_title\">Comparación de commits</string>\n    <string name=\"commit_prefix\">Commit\\u0020</string>\n    <string name=\"parent_prefix\">Anterior\\u0020</string>\n    <string name=\"authored\">autor</string>\n    <string name=\"committed\">commit enviado</string>\n    <string name=\"diff_line_message\">¿Qué deseas hacer?</string>\n    <string name=\"comment_on_line\">Comentar linea</string>\n    <string name=\"view_entire_file\">Ver fichero completo</string>\n    <string name=\"comparing_commits\">Comparando {0} commits</string>\n    <string name=\"enable_wrapping\">Habilitar ajuste de texto</string>\n    <string name=\"disable_wrapping\">Deshabilitar ajuste de texto</string>\n    <string name=\"code\">Código</string>\n    <string name=\"following_user\">Siguiendo&#8230;</string>\n    <string name=\"unfollowing_user\">Dejando de seguir&#8230;</string>\n    <string name=\"starring_repository\">Marcando como destacado&#8230;</string>\n    <string name=\"unstarring_repository\">Desmarcando como destacado&#8230;</string>\n    <string name=\"navigate_to_user\">Ir a %s</string>\n    <string name=\"contributions\">%d commits</string>\n    <!-- Titulos de las pestañas, lo mas cortos posible -->\n    <string name=\"tab_repositories\">repositorios</string>\n    <string name=\"tab_users\">usuarios</string>\n    <string name=\"tab_news\">noticias</string>\n    <string name=\"tab_following_self\">siguiendo</string>\n    <string name=\"tab_followers_self\">seguidores</string>\n    <string name=\"tab_following\">siguiendo</string>\n    <string name=\"tab_followers\">seguidores</string>\n    <string name=\"tab_members\">miembros</string>\n    <string name=\"tab_code\">código</string>\n    <string name=\"tab_commits\">commits</string>\n    <string name=\"tab_issues\">incidencias</string>\n    <string name=\"tab_watched\">seguidas</string>\n    <string name=\"tab_assigned\">asignadas</string>\n    <string name=\"tab_created\">creadas</string>\n    <string name=\"tab_mentioned\">mencionado</string>\n    <string name=\"tab_mine\">mías</string>\n    <string name=\"tab_starred\">destacados</string>\n    <string name=\"tab_all\">todas</string>\n    <!--  -->\n    <string name=\"share\">Compartir</string>\n    <string name=\"show_password\">Mostrar contraseña</string>\n    <string name=\"write\">Escribir</string>\n    <string name=\"preview\">Vista previa</string>\n    <string name=\"show_raw_markdown\">Mostrar texto plano</string>\n    <string name=\"render_markdown\">Renderizar markdown</string>\n    <string name=\"code_authentication_failed\">¡Autenticación fallida! Código de verificación invalido</string>\n    <string name=\"confirm_comment_delete_message\">¿Seguro que quieres eliminar este comentario?</string>\n    <string name=\"confirm_comment_delete_title\">Eliminar comentario</string>\n    <string name=\"copy_hash\">Copiar hash</string>\n    <string name=\"deleting_comment\">Borrando comentario&#8230;</string>\n    <string name=\"editing_comment\">Editando comentario&#8230;</string>\n    <string name=\"error_forking_repository\">Error al hacer fork</string>\n    <string name=\"fork\">Fork</string>\n    <string name=\"forking_repository\">Haciendo fork</string>\n    <string name=\"toast_msg_copied\">Copiado</string>\n    <string name=\"username_or_email\">Usuario o correo electrónico</string>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-fr/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<resources>\n\n    <!-- Messages d'erreurs -->\n    <string name=\"error_orgs_load\">Erreur lors du chargement du compte et des organisations</string>\n    <string name=\"error_issues_load\">Erreur lors du chargement des tickets</string>\n    <string name=\"error_repos_load\">Erreur lors du chargement des dépôts</string>\n    <string name=\"error_repo_load\">Erreur lors du chargement du dépôt</string>\n    <string name=\"error_contributors_load\">Erreur lors du chargement des contributeurs</string>\n    <string name=\"error_gist_load\">Erreur lors du chargement du Gist</string>\n    <string name=\"error_news_load\">Erreur lors du chargement des nouvelles</string>\n    <string name=\"error_followers_load\">Erreur lors du chargement des abonnés</string>\n    <string name=\"error_people_load\">Erreur lors du chargement des personnes</string>\n    <string name=\"error_person_load\">Erreur lors du chargement de la personne</string>\n    <string name=\"error_gist_file_load\">Erreur lors du chargement du fichier du Gist</string>\n    <string name=\"error_gists_load\">Erreur lors du chargement des Gists</string>\n    <string name=\"error_issue_load\">Erreur lors du chargement du ticket</string>\n    <string name=\"error_collaborators_load\">Erreur lors du chargement des collaborateurs</string>\n    <string name=\"error_milestones_load\">Erreur lors du chargement des jalons</string>\n    <string name=\"error_labels_load\">Erreur lors du chargement des libellés</string>\n    <string name=\"error_bookmarks_load\">Erreur lors du chargement des favoris</string>\n    <string name=\"error_members_load\">Erreur lors du chargement des membres</string>\n    <string name=\"error_commits_load\">Erreur lors du chargement des commits</string>\n    <string name=\"error_commit_load\">Erreur lors du chargement du commit</string>\n    <string name=\"error_file_load\">Erreur lors du chargement du fichier</string>\n    <string name=\"error_code_load\">Erreur lors du chargement du code</string>\n    <string name=\"error_refs_load\">Erreur lors du chargement des branches et tags</string>\n    <string name=\"error_following_person\">Erreur lors de l\\'abonnement</string>\n    <string name=\"error_unfollowing_person\">Erreur lors du désabonnement</string>\n    <string name=\"error_checking_following_status\">Erreur lors de la vérification d\\'abonnement</string>\n    <string name=\"error_starring_repository\">Erreur lors de l\\'ajout aux favoris</string>\n    <string name=\"error_unstarring_repository\">Erreur lors de la suppression des favoris</string>\n    <string name=\"error_checking_starring_status\">Erreur lors de la vérification du favoris</string>\n    <string name=\"error_rendering_markdown\">Erreur lors du rendu du markdown</string>\n    <string name=\"error_users_search\">Erreur lors de la recherche d\\'utilisateur</string>\n    <!--  -->\n\n\n    <!-- Messages de chargement -->\n    <string name=\"loading_gist\">Chargement du Gist…</string>\n    <string name=\"loading_more_issues\">Chargement de plus de tickets…</string>\n    <string name=\"loading_issues\">Chargement des tickets…</string>\n    <string name=\"loading_comments\">Chargement des commentaires…</string>\n    <string name=\"loading_repositories\">Chargement des dépôts…</string>\n    <string name=\"loading_issue\">Chargement du ticket…</string>\n    <string name=\"loading_news\">Chargement des nouvelles…</string>\n    <string name=\"loading_followers\">Chargement des abonnés…</string>\n    <string name=\"loading_people\">Chargement des personnes…</string>\n    <string name=\"loading_gists\">Chargement des Gists…</string>\n    <string name=\"loading_collaborators\">Chargement des collaborateurs…</string>\n    <string name=\"loading_milestones\">Chargement des jalons…</string>\n    <string name=\"loading_labels\">Chargement des libellés…</string>\n    <string name=\"loading_commits\">Chargement des commits…</string>\n    <string name=\"loading_files_and_comments\">Chargement des fichiers et commentaires…</string>\n    <string name=\"loading_refs\">Chargement des branches et tags</string>\n    <!--  -->\n\n\n    <!-- Messages de listes vides -->\n    <string name=\"no_bookmarks\">Aucun favori</string>\n    <string name=\"no_repositories\">Aucun dépôt</string>\n    <string name=\"no_contributors\">Aucun contributeur</string>\n    <string name=\"no_issues\">Aucun ticket</string>\n    <string name=\"no_gists\">Aucun Gist</string>\n    <string name=\"no_people\">Aucune personne</string>\n    <string name=\"no_followers\">Aucun abonné</string>\n    <string name=\"no_members\">Aucun membre</string>\n    <string name=\"no_news\">Aucune nouvelle</string>\n    <string name=\"no_commits\">Aucun commit</string>\n    <!--  -->\n\n\n    <!-- Messages de mise à jour -->\n    <string name=\"updating_assignee\">Mise à jour de l\\'assigné…</string>\n    <string name=\"updating_issue\">Mise à jour du ticket…</string>\n    <string name=\"updating_labels\">Mise à jour des libellés…</string>\n    <string name=\"updating_milestone\">Mise à jour du jalon…</string>\n    <!--  -->\n\n    <string name=\"news\">Nouvelles</string>\n    <string name=\"issues\">Tickets</string>\n    <string name=\"gists\">Gists</string>\n    <string name=\"commits\">Commits</string>\n    <string name=\"global_search\">Recherche GitHub</string>\n    <string name=\"find_repositories\">Trouver des dépôts</string>\n    <string name=\"find_issues\">Trouver des tickets</string>\n    <string name=\"search_title\">Chercher…</string>\n    <string name=\"clear_search_history\">Supprimer l\\'historique</string>\n    <string name=\"search_history_cleared\">Historique de recherche supprimé</string>\n    <string name=\"login_activity_authenticating\">Connexion…</string>\n    <string name=\"creating_gist\">Création d\\'un Gist…</string>\n    <string name=\"create\">Créer</string>\n    <string name=\"create_gist\">Créer un Gist</string>\n    <string name=\"make_public\">Rendre ce Gist public</string>\n    <string name=\"gist_file_name_hint\">fichier.rb</string>\n    <string name=\"gist\">Gist</string>\n    <string name=\"comments\">Commentaires</string>\n    <string name=\"files\">Fichiers</string>\n    <string name=\"open\">Ouvrir</string>\n    <string name=\"random\">Aléatoire</string>\n    <string name=\"file_name\">Nom du fichier</string>\n    <string name=\"file_content\">Contenu du fichier</string>\n    <string name=\"new_gist\">Nouveau Gist</string>\n    <string name=\"filter\">Filtrer</string>\n    <string name=\"bookmark\">Favoris</string>\n    <string name=\"comment\">Commenter</string>\n    <string name=\"delete\">Supprimer</string>\n    <string name=\"refresh\">Rafraîchir</string>\n    <string name=\"dashboard_issues_title\">Aperçu des tickets</string>\n    <string name=\"bookmarks\">Favoris</string>\n    <string name=\"gists_title\">Gists</string>\n    <string name=\"issue_title\">Ticket #</string>\n    <string name=\"pull_request_title\">Pull Request #</string>\n    <string name=\"gist_title\">Gist\\u0020</string>\n    <string name=\"filter_issues_title\">Filtrer les tickets</string>\n    <string name=\"create_comment_title\">Ajouter un commentaire</string>\n    <string name=\"comment_hint\">Entrer un commentaire</string>\n    <string name=\"show_more\">Afficher plus…</string>\n    <string name=\"repositories\">Dépôts</string>\n    <string name=\"issues_title\">Tickets</string>\n    <string name=\"edit_labels\">Modifier les libellés</string>\n    <string name=\"milestone_prefix\">Jalon\\u00a0:</string>\n    <string name=\"edit_milestone\">Modifier le jalon</string>\n    <string name=\"edit_assignee\">Modifier l\\'assigné</string>\n    <string name=\"description\">Description</string>\n    <string name=\"gist_description_hint\">Gist créé sur Android</string>\n    <string name=\"title\">Titre</string>\n    <string name=\"edit\">Modifier</string>\n    <string name=\"starring_gist\">Ajout du Gist aux favoris…</string>\n    <string name=\"unstarring_gist\">Suppression du Gist des favoris…</string>\n    <string name=\"accounts_label\">Comptes</string>\n    <string name=\"select_assignee\">Sélectionner l\\'assigné</string>\n    <string name=\"select_milestone\">Sélectionner le jalon</string>\n    <string name=\"select_labels\">Sélectionner les libellés</string>\n    <string name=\"select_ref\">Sélectionner une branche ou un tag</string>\n    <string name=\"no_milestone\">Aucun jalon</string>\n    <string name=\"unassigned\">Personne n\\'est assigné</string>\n    <string name=\"assigned\">est assigné</string>\n    <string name=\"no_gists_found\">Aucun Gist trouvé</string>\n    <string name=\"confirm_gist_delete_title\">Confirmer la suppression</string>\n    <string name=\"confirm_gist_delete_message\">Êtes-vous sûr de vouloir supprimer ce Gist\\u00a0?</string>\n    <string name=\"deleting_gist\">Suppression du Gist…</string>\n    <string name=\"creating_comment\">Création d\\'un commentaire…</string>\n    <string name=\"confirm_bookmark_delete_message\">Êtes-vous sûr(e) de vouloir supprimer ce favori\\u00a0?</string>\n    <string name=\"issue_dashboard\">Aperçu des tickets</string>\n    <string name=\"new_issue\">Nouveau ticket</string>\n    <string name=\"anonymous\">Anonyme</string>\n    <string name=\"message_filter_saved\">Filtre de tickets ajouté aux favoris</string>\n    <string name=\"recent\">Récent</string>\n    <string name=\"section_issue_status\">Statut\\u00a0:</string>\n    <string name=\"status_open\">Ouvert</string>\n    <string name=\"status_closed\">Fermé</string>\n    <string name=\"section_issue_assigned\">Assigné à\\u00a0:</string>\n    <string name=\"assignee_anyone\">N\\'importe qui</string>\n    <string name=\"section_issue_milestone\">Jalon\\u00a0:</string>\n    <string name=\"none\">Aucun</string>\n    <string name=\"section_issue_labels\">Libellés\\u00a0:</string>\n    <string name=\"log_in\">Se connecter</string>\n    <string name=\"signup_link\">Nouveau sur GitHub\\u00a0? &lt;a href=\\\"https://github.com/join\\\">Cliquez ici&lt;/a> pour vous inscrire</string>\n    <string name=\"connection_failed\">Impossible de se connecter à GitHub</string>\n    <string name=\"invalid_login_or_password\">Veuillez entrer un login et un mot de passe valides</string>\n    <string name=\"invalid_password\">Veuillez entrer un mot de passe valide</string>\n    <string name=\"password\">Mot de passe</string>\n    <string name=\"login_or_email\">Login ou Email</string>\n    <string name=\"followers\">Abonnés</string>\n    <string name=\"following\">Abonnements</string>\n    <string name=\"followers_self\">Abonnés</string>\n    <string name=\"following_self\">Abonnements</string>\n    <string name=\"follow\">S\\'abonner</string>\n    <string name=\"unfollow\">Se désabonner</string>\n    <string name=\"star\">Ajouter aux favoris</string>\n    <string name=\"unstar\">Supprimer des favoris</string>\n    <string name=\"members\">Membres</string>\n    <string name=\"closing_issue\">Fermeture du ticket…</string>\n    <string name=\"reopening_issue\">Réouverture du ticket…</string>\n    <string name=\"avatar\">Avatar</string>\n    <string name=\"creating_issue\">Création d\\'un ticket…</string>\n    <string name=\"prefix_created\">créé\\u0020</string>\n    <string name=\"prefix_updated\">mis à jour\\u0020</string>\n    <string name=\"prefix_opened\">ouvert\\u0020</string>\n    <string name=\"clear\">Vider</string>\n    <string name=\"open_issues\">Tickets ouverts</string>\n    <string name=\"closed_issues\">Tickets fermés</string>\n    <string name=\"confirm_bookmark_delete_title\">Supprimer le favori</string>\n    <string name=\"save\">Sauvegarder</string>\n    <string name=\"apply\">Appliquer</string>\n    <string name=\"labels_prefix\">Libellés:</string>\n    <string name=\"assignee\">Assigné</string>\n    <string name=\"milestone\">Jalon</string>\n    <string name=\"labels\">Libellés</string>\n    <string name=\"issue_confirm_close_message\">Êtes-vous sûr de vouloir fermer ce ticket\\u00a0?</string>\n    <string name=\"issue_confirm_reopen_message\">Êtes-vous sûr de vouloir réouvrir ce ticket\\u00a0?</string>\n    <string name=\"issue_confirm_close_title\">Fermer le ticket</string>\n    <string name=\"issue_confirm_reopen_title\">Réouvrir le ticket</string>\n    <string name=\"closed\">Fermé</string>\n    <string name=\"no_description_given\">Aucune description donnée.</string>\n    <string name=\"close\">Fermer</string>\n    <string name=\"reopen\">Réouvrir</string>\n    <string name=\"title_invalid_github_url\">URL GitHub invalide</string>\n    <string name=\"message_invalid_github_url\">L\\'URL suivante ne peut pas être ouverte par cette application\\u00a0:\\n{0}</string>\n    <string name=\"recently_viewed\">VUS RÉCEMMENT</string>\n    <string name=\"cancel\">Annuler</string>\n    <string name=\"authenticator_conflict_title\">Conflit d\\'application</string>\n    <string name=\"authenticator_conflict_message\">Une autre application est déjà configurée pour l\\'authentification GitHub.\\n\\nVous devez la supprimer des paramètres de Comptes et synchronisation et la désinstaller avant de pouvoir utiliser l\\'application GitHub.</string>\n    <string name=\"opening_repository\">Ouverture de {0}…</string>\n    <string name=\"commit_compare_title\">Comparaison de commit</string>\n    <string name=\"commit_prefix\">Commit\\u0020</string>\n    <string name=\"parent_prefix\">Parent\\u0020</string>\n    <string name=\"authored\">auteur</string>\n    <string name=\"committed\">committé</string>\n    <string name=\"diff_line_message\">Que voulez-vous faire\\u00a0?</string>\n    <string name=\"comment_on_line\">Commenter la ligne</string>\n    <string name=\"view_entire_file\">Voir fichier complet</string>\n    <string name=\"comparing_commits\">Comparaison {0} commits</string>\n    <string name=\"enable_wrapping\">Activer la coupure</string>\n    <string name=\"disable_wrapping\">Désactiver la coupure</string>\n    <string name=\"code\">Code</string>\n    <string name=\"following_user\">Abonnement…</string>\n    <string name=\"unfollowing_user\">Désabonnement…</string>\n    <string name=\"starring_repository\">Ajout aux favoris…</string>\n    <string name=\"unstarring_repository\">Supprimer des favoris…</string>\n\n    <!-- Titres des onglets, doivent être aussi courts que possible -->\n    <string name=\"tab_repositories\">dépôts</string>\n    <string name=\"tab_news\">nouvelles</string>\n    <string name=\"tab_following_self\">abonnements</string>\n    <string name=\"tab_followers_self\">abonnés</string>\n    <string name=\"tab_following\">abonnements</string>\n    <string name=\"tab_followers\">abonnés</string>\n    <string name=\"tab_members\">membres</string>\n    <string name=\"tab_code\">code</string>\n    <string name=\"tab_commits\">commits</string>\n    <string name=\"tab_issues\">tickets</string>\n    <string name=\"tab_watched\">suivis</string>\n    <string name=\"tab_assigned\">assignés</string>\n    <string name=\"tab_created\">créés</string>\n    <string name=\"tab_mentioned\">mentionnés</string>\n    <string name=\"tab_mine\">miens</string>\n    <string name=\"tab_starred\">favoris</string>\n    <string name=\"tab_all\">tous</string>\n    <!--  -->\n    <string name=\"share\">Partager</string>\n    <string name=\"show_password\">Voir mot de passe</string>\n    <string name=\"write\">Écrire</string>\n    <string name=\"preview\">Pré-visualiser</string>\n    <string name=\"show_raw_markdown\">Afficher la syntaxe markdown</string>\n    <string name=\"render_markdown\">Afficher le rendu markdown</string>\n    <string name=\"are_you_sure\">Êtes-vous vraiment sûr(e) ?</string>\n    <string name=\"code_authentication_failed\">L\\'authentification a échoué! Code de vérification incorrect</string>\n    <string name=\"confirm_comment_delete_message\">Êtes-vous sur(e) de vouloir supprimer ce commentaire?</string>\n    <string name=\"confirm_comment_delete_title\">Supprimer le commentaire</string>\n    <string name=\"contributions\">%d commits</string>\n    <string name=\"contributors\">Contributeurs</string>\n    <string name=\"copy_hash\">Copier le hash</string>\n    <string name=\"delete_cap\">SUPPRIMER</string>\n    <string name=\"deleting_comment\">Suppression du commentaire…</string>\n    <string name=\"deleting_repository\">Suppression…</string>\n    <string name=\"editing_comment\">Édition du commentaire…</string>\n    <string name=\"error_deleting_repository\">Erreur lors de la suppression</string>\n    <string name=\"error_forking_repository\">Erreur lors du fork</string>\n    <string name=\"fork\">Fork</string>\n    <string name=\"forking_repository\">Fork en cours…</string>\n    <string name=\"home\">Accueil</string>\n    <string name=\"navigate_to_user\">Aller à %s</string>\n    <string name=\"navigation_drawer_close\">Fermer le panneau de navigation</string>\n    <string name=\"navigation_drawer_open\">Ouvrir le panneau de navigation</string>\n    <string name=\"pull_request_commits\">Commits : %d</string>\n    <string name=\"recent_list_remove\">Supprimer des éléments récents</string>\n    <string name=\"recent_remove\">Supprimer les éléments récents</string>\n    <string name=\"tab_users\">utilisateurs</string>\n    <string name=\"toast_msg_copied\">Copié dans le presse-papiers</string>\n    <string name=\"username_or_email\">Nom d\\'utilisateur ou email</string>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-hu/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<resources>\n\n    <!-- Error messages -->\n    <string name=\"error_orgs_load\">A felhasználói adatok &amp; vállalatok betöltése nem sikerült</string>\n    <string name=\"error_issues_load\">A hibajegyek betöltése nem sikerült</string>\n    <string name=\"error_repos_load\">A tárolók betöltése nem sikerült</string>\n    <string name=\"error_repo_load\">A tároló betöltése nem sikerült</string>\n    <string name=\"error_gist_load\">A Gist betöltése nem sikerült</string>\n    <string name=\"error_news_load\">Az újdonságok betöltése nem sikerült</string>\n    <string name=\"error_followers_load\">A követők betöltése nem sikerült</string>\n    <string name=\"error_people_load\">A személyek betöltése nem sikerült</string>\n    <string name=\"error_person_load\">A személy betöltése nem sikerült</string>\n    <string name=\"error_gist_file_load\">A Gist tartalmának betöltése nem sikerült</string>\n    <string name=\"error_gists_load\">A Gist-ek betöltése nem sikeürlt</string>\n    <string name=\"error_issue_load\">A hibajegy betöltése nem sikerült</string>\n    <string name=\"error_collaborators_load\">A közreműködők betöltése nem sikerült</string>\n    <string name=\"error_milestones_load\">A mérföldkövek betöltése nem sikerült</string>\n    <string name=\"error_labels_load\">A címkék betöltése nem sikerült</string>\n    <string name=\"error_bookmarks_load\">A könyvjelzők betöltése nem sikerült</string>\n    <string name=\"error_members_load\">A tagok betöltése nem sikerült</string>\n    <string name=\"error_commits_load\">A commitok betöltése nem sikerült</string>\n    <string name=\"error_commit_load\">A commit betöltése nem sikerült</string>\n    <string name=\"error_file_load\">A fájl betöltése nem sikerült</string>\n    <!--  -->\n\n\n    <!-- Loading messages -->\n    <string name=\"loading_gist\">Gist betöltése…</string>\n    <string name=\"loading_more_issues\">További hibajegyek betöltése…</string>\n    <string name=\"loading_issues\">Hibajegyek betöltése…</string>\n    <string name=\"loading_comments\">Hozzászólások betöltése…</string>\n    <string name=\"loading_repositories\">Tárolók betöltése…</string>\n    <string name=\"loading_issue\">Hibajegy betöltése…</string>\n    <string name=\"loading_news\">Újdonságok betöltése…</string>\n    <string name=\"loading_followers\">Követők betöltése…</string>\n    <string name=\"loading_people\">Személyek betöltése…</string>\n    <string name=\"loading_gists\">Gist-ek betöltése…</string>\n    <string name=\"loading_collaborators\">Közreműködők betöltése…</string>\n    <string name=\"loading_milestones\">Mérföldkövek betöltése…</string>\n    <string name=\"loading_labels\">Címkék betöltése…</string>\n    <string name=\"loading_commits\">Commitok betöltése…</string>\n    <string name=\"loading_files_and_comments\">Fájlok &amp; Hozzászólások betöltése…</string>\n    <!--  -->\n\n\n    <!-- Empty messages -->\n    <string name=\"no_bookmarks\">Nincsenek Könyvjelzők</string>\n    <string name=\"no_repositories\">Nincsenek Tárolók</string>\n    <string name=\"no_issues\">Nincsenek Hibajegyek</string>\n    <string name=\"no_gists\">Nincsenek Gistek</string>\n    <string name=\"no_people\">Nincsenek Személyek</string>\n    <string name=\"no_followers\">Nincsenek Követők</string>\n    <string name=\"no_members\">Nincsenek Tagok</string>\n    <string name=\"no_news\">Nincsenek Újdonságok</string>\n    <string name=\"no_commits\">Nincsenek Commitok</string>\n    <!--  -->\n\n\n    <!-- Updating messages -->\n    <string name=\"updating_assignee\">Felelős frissítése…</string>\n    <string name=\"updating_issue\">Hibajegy frissítése…</string>\n    <string name=\"updating_labels\">Címkék frissítése…</string>\n    <string name=\"updating_milestone\">Mérföldkő frissítése…</string>\n    <!--  -->\n\n    <string name=\"news\">Újdonságok</string>\n    <string name=\"issues\">Hibajegyek</string>\n    <string name=\"gists\">Gist-ek</string>\n    <string name=\"commits\">Commitok</string>\n    <string name=\"find_repositories\">Tárolók keresése</string>\n    <string name=\"find_issues\">Hibajegyek keresése</string>\n    <string name=\"search_title\">Keresés…</string>\n    <string name=\"clear_search_history\">Előzmények törlése</string>\n    <string name=\"search_history_cleared\">Előzmények törölve</string>\n    <string name=\"login_activity_authenticating\">Bejelentkezés…</string>\n    <string name=\"creating_gist\">Gist létrehozása…</string>\n    <string name=\"create\">Új</string>\n    <string name=\"create_gist\">Új Gist</string>\n    <string name=\"make_public\">Gist publikussá tétele</string>\n    <string name=\"gist_file_name_hint\">fájl.rb</string>\n    <string name=\"gist\">Gist</string>\n    <string name=\"comments\">Hozzászólások</string>\n    <string name=\"files\">Fájlok</string>\n    <string name=\"open\">Megnyitás</string>\n    <string name=\"random\">Véletlenszerű</string>\n    <string name=\"file_name\">Fájl neve</string>\n    <string name=\"file_content\">Fájl tartalma</string>\n    <string name=\"new_gist\">Új Gist</string>\n    <string name=\"filter\">Szűrés</string>\n    <string name=\"bookmark\">Könyvjelző</string>\n    <string name=\"comment\">Hozzászólás</string>\n    <string name=\"delete\">Törlés</string>\n    <string name=\"refresh\">Frissítés</string>\n    <string name=\"dashboard_issues_title\">Hibajegyek listája</string>\n    <string name=\"bookmarks\">Könyvjelzők</string>\n    <string name=\"gists_title\">Gist-ek</string>\n    <string name=\"issue_title\">Hibajegy #</string>\n    <string name=\"pull_request_title\">Pull kérelem #</string>\n    <string name=\"gist_title\">Gist\\u0020</string>\n    <string name=\"filter_issues_title\">Hibajegyek szűrése</string>\n    <string name=\"create_comment_title\">Új hozzászólás</string>\n    <string name=\"comment_hint\">Hozzászólás tartalma</string>\n    <string name=\"show_more\">Több…</string>\n    <string name=\"repositories\">Tárolók</string>\n    <string name=\"issues_title\">Hibajegyek</string>\n    <string name=\"edit_labels\">Címkék szerkesztése</string>\n    <string name=\"milestone_prefix\">Mérföldkő:</string>\n    <string name=\"edit_milestone\">Mérföldkő szerkesztése</string>\n    <string name=\"edit_assignee\">Felelős szerkesztése</string>\n    <string name=\"description\">Leírás</string>\n    <string name=\"gist_description_hint\">Androidon készített Gist</string>\n    <string name=\"title\">Cím</string>\n    <string name=\"edit\">Szerkesztés</string>\n    <string name=\"star\">Csillagozás</string>\n    <string name=\"starring_gist\">Gist csillagozása…</string>\n    <string name=\"unstar\">Csillag megszüntetése</string>\n    <string name=\"unstarring_gist\">Gist csillagozás megszüntetése…</string>\n    <string name=\"accounts_label\">Felhasználói adatok</string>\n    <string name=\"select_assignee\">Felelős kijelölése</string>\n    <string name=\"select_milestone\">Mérföldkő kijelölése</string>\n    <string name=\"select_labels\">Címkék kijelölése</string>\n    <string name=\"no_milestone\">Nincs mérföldkő</string>\n    <string name=\"unassigned\">Senki nincs hozzárendelve</string>\n    <string name=\"assigned\">van hozzárendelve</string>\n    <string name=\"no_gists_found\">Nem találtam Gist-eket</string>\n    <string name=\"confirm_gist_delete_title\">Törlés jóváhagyása</string>\n    <string name=\"confirm_gist_delete_message\">Biztosan törölni szeretnéd ezt a Gist-et?</string>\n    <string name=\"deleting_gist\">Gist törlése…</string>\n    <string name=\"creating_comment\">Hozzászólás létrehozása…</string>\n    <string name=\"confirm_bookmark_delete_message\">Biztosan törölni szeretnéd ezt a könyvjelzőt?</string>\n    <string name=\"issue_dashboard\">Hibajegyek listája</string>\n    <string name=\"new_issue\">Új hibajegy</string>\n    <string name=\"anonymous\">Névtelen</string>\n    <string name=\"message_filter_saved\">Hibajegy-szűrő elmentve a könyvjelzők közé</string>\n    <string name=\"recent\">Friss</string>\n    <string name=\"section_issue_status\">Állapot:</string>\n    <string name=\"status_open\">Nyitott</string>\n    <string name=\"status_closed\">Lezárt</string>\n    <string name=\"section_issue_assigned\">Felelős:</string>\n    <string name=\"assignee_anyone\">Bárki</string>\n    <string name=\"section_issue_milestone\">Mérföldkő:</string>\n    <string name=\"none\">Semelyik</string>\n    <string name=\"section_issue_labels\">Címkék:</string>\n    <string name=\"log_in\">Bejelentkezés</string>\n    <string name=\"signup_link\">Új vagy a GitHubon? &lt;a href=\\\"https://github.com/join\\\">Kattints ide&lt;/a> a regisztrációhoz</string>\n    <string name=\"connection_failed\">Nem sikerült csatlakozni a GitHubhoz</string>\n    <string name=\"invalid_login_or_password\">Adj meg érvényes felhasználónevet &amp; jelszót</string>\n    <string name=\"invalid_password\">Adj meg érvényes jelszót.</string>\n    <string name=\"password\">Jelszó</string>\n    <string name=\"login_or_email\">Felhasználónév vagy E-mail cím</string>\n    <string name=\"followers\">Követők</string>\n    <string name=\"following\">Követettek</string>\n    <string name=\"followers_self\">Követőim</string>\n    <string name=\"following_self\">Követetteim</string>\n    <string name=\"members\">Tagok</string>\n    <string name=\"closing_issue\">Hibajegy lezárása…</string>\n    <string name=\"reopening_issue\">Hibajegy újranyitása…</string>\n    <string name=\"avatar\">Avatár</string>\n    <string name=\"creating_issue\">Hibajegy létrehozása…</string>\n    <string name=\"prefix_created\">készült\\u0020</string>\n    <string name=\"prefix_updated\">frissült\\u0020</string>\n    <string name=\"prefix_opened\">megnyitva\\u0020</string>\n    <string name=\"clear\">Törlés</string>\n    <string name=\"open_issues\">Nyitott hibajegyek</string>\n    <string name=\"closed_issues\">Lezárt hibajegyek</string>\n    <string name=\"confirm_bookmark_delete_title\">Könyvjelző eltávolítása</string>\n    <string name=\"save\">Mentés</string>\n    <string name=\"apply\">Alkalmaz</string>\n    <string name=\"labels_prefix\">Címkék:</string>\n    <string name=\"assignee\">Felelős</string>\n    <string name=\"milestone\">Mérföldkő</string>\n    <string name=\"labels\">Címkék</string>\n    <string name=\"issue_confirm_close_message\">Biztosan le szeretnéd zárni ezt a hibajegyet?</string>\n    <string name=\"issue_confirm_reopen_message\">Biztosan újra szeretnéd nyitni ezt a hibajegyet?</string>\n    <string name=\"issue_confirm_close_title\">Hibajegy lezárása</string>\n    <string name=\"issue_confirm_reopen_title\">Hibajegy újranyitása</string>\n    <string name=\"closed\">Lezárva</string>\n    <string name=\"no_description_given\">Nincs leírás.</string>\n    <string name=\"close\">Lezárás</string>\n    <string name=\"reopen\">Újranyitás</string>\n    <string name=\"title_invalid_github_url\">Hibás GitHub URL</string>\n    <string name=\"message_invalid_github_url\">Az alkalmazás nem tudja megnyitni az alábbi URL-t:\\n{0}</string>\n    <string name=\"recently_viewed\">MOSTANÁBAN MEGTEKINTETT</string>\n    <string name=\"cancel\">Mégsem</string>\n    <string name=\"authenticator_conflict_title\">Alkalmazás Ütközés</string>\n    <string name=\"authenticator_conflict_message\">Egy másik telepített alkalmazás már be van állítva a GitHub hitelesítéshez.\\n\\nEzt az alkalmazást el kell távolítani az Android Accounts &amp; sync beállításánál, ha a GitHub alkalmazást használni szeretnéd.</string>\n    <string name=\"opening_repository\">{0} megnyitása…</string>\n    <string name=\"commit_compare_title\">Commit-ok összehasonlítása</string>\n    <string name=\"commit_prefix\">Commit\\u0020</string>\n    <string name=\"parent_prefix\">Szülő\\u0020</string>\n    <string name=\"authored\">készítette</string>\n    <string name=\"committed\">commit-olta</string>\n    <string name=\"diff_line_message\">Mit szeretnél tenni?</string>\n    <string name=\"comment_on_line\">Hozzászólás a sorhoz</string>\n    <string name=\"view_entire_file\">Teljes fájl megtekintése</string>\n    <string name=\"comparing_commits\">{0} commit összehasonlítása</string>\n    <string name=\"enable_wrapping\">Sortörés engedélyezése</string>\n    <string name=\"disable_wrapping\">Sortörés tiltása</string>\n    <string name=\"home\">Főoldal</string>\n    <string name=\"username_or_email\">Felhasználónév vagy e-mail cím</string>\n    <string name=\"tab_news\">Hírek</string>\n    <string name=\"tab_repositories\">Tárolók</string>\n    <string name=\"tab_users\">Felhasználók</string>\n    <string name=\"tab_followers\">Követők</string>\n    <string name=\"tab_code\">Kód</string>\n    <string name=\"tab_all\">Minden</string>\n    <string name=\"tab_starred\">Csillagozottak</string>\n    <string name=\"tab_members\">Tagok</string>\n    <string name=\"follow\">Követés</string>\n    <string name=\"following_user\">Követett felhasználók</string>\n    <string name=\"are_you_sure\">Teljesen biztos vagy benne?</string>\n    <string name=\"code\">Kód</string>\n    <string name=\"copy_hash\">Hash másolása</string>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-is/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<resources>\n\n    <!-- Error messages -->\n    <string name=\"error_orgs_load\">Ekki tókst að sækja reikning &amp; samtök</string>\n    <string name=\"error_issues_load\">Ekki tókst að sækja vandamál</string>\n    <string name=\"error_repos_load\">Ekki tókst að sækja lindir</string>\n    <string name=\"error_repo_load\">Ekki tókst að sækja lind</string>\n    <string name=\"error_contributors_load\">Ekki tókst að sækja samstarfsaðila</string>\n    <string name=\"error_gist_load\">Ekki tókst að sækja Gist</string>\n    <string name=\"error_news_load\">Ekki tókst að sækja fréttir</string>\n    <string name=\"error_followers_load\">Ekki tókst að sækja fylgjendur</string>\n    <string name=\"error_people_load\">Ekki tókst að sækja fólk</string>\n    <string name=\"error_person_load\">Ekki tókst að sækja einstakling</string>\n    <string name=\"error_gist_file_load\">Ekki tókst að sækja innihald Gist skráar</string>\n    <string name=\"error_gists_load\">Ekki tókst að sækja Gists</string>\n    <string name=\"error_issue_load\">Ekki tókst að sækja vandamál</string>\n    <string name=\"error_collaborators_load\">Ekki tókst að sækja samstarfsaðila</string>\n    <string name=\"error_milestones_load\">Ekki tókst að sækja útgáfur</string>\n    <string name=\"error_labels_load\">Ekki tókst að sækja merki</string>\n    <string name=\"error_bookmarks_load\">Ekki tókst að sækja bókamerki</string>\n    <string name=\"error_members_load\">Ekki tókst að sækja meðlimi</string>\n    <string name=\"error_commits_load\">Ekki tókst að sækja færslur</string>\n    <string name=\"error_commit_load\">Ekki tókst að sækja færslu</string>\n    <string name=\"error_file_load\">Ekki tókst að sækja skrá</string>\n    <string name=\"error_code_load\">Ekki tókst að sækja kóða</string>\n    <string name=\"error_refs_load\">Ekki tókst að sækja greinar &amp; merki</string>\n    <string name=\"error_following_person\">Ekki tókst að fylgjast með</string>\n    <string name=\"error_unfollowing_person\">Ekki tókst að hætta að fylgjast með</string>\n    <string name=\"error_checking_following_status\">Ekki tókst að skoða fylgjendastöðu</string>\n    <string name=\"error_starring_repository\">Ekki tókst að stjörnumerkja</string>\n    <string name=\"error_unstarring_repository\">Ekki tókst að fjarlægja stjörnumerkingu</string>\n    <string name=\"error_checking_starring_status\">Ekki tókst að skoða stjörnumerkingarstöðu</string>\n    <string name=\"error_rendering_markdown\">Ekki tókst að keyra markdown</string>\n    <string name=\"error_users_search\">Ekki tókst að leita eftir notendum</string>\n    <!--  -->\n\n\n    <!-- Loading messages -->\n    <string name=\"loading_gist\">Sækir Gist…</string>\n    <string name=\"loading_more_issues\">Sækir fleiri vandamál…</string>\n    <string name=\"loading_issues\">Sækir vandamál…</string>\n    <string name=\"loading_comments\">Sækir athugasemdir…</string>\n    <string name=\"loading_repositories\">Sækir lindir…</string>\n    <string name=\"loading_issue\">Sækir vandamál…</string>\n    <string name=\"loading_news\">Sækir fréttir…</string>\n    <string name=\"loading_followers\">Sækir fylgjendur…</string>\n    <string name=\"loading_people\">Sækir fólk…</string>\n    <string name=\"loading_gists\">Sækir Gists…</string>\n    <string name=\"loading_collaborators\">Sækir samstarfsaðila…</string>\n    <string name=\"loading_milestones\">Sækir útgáfur…</string>\n    <string name=\"loading_labels\">Sækir merki…</string>\n    <string name=\"loading_commits\">Sækir færslur…</string>\n    <string name=\"loading_files_and_comments\">Sækir skrár &amp; athugasemdir…</string>\n    <string name=\"loading_refs\">Sækir greinar &amp; merki…</string>\n    <!--  -->\n\n\n    <!-- Empty messages -->\n    <string name=\"no_bookmarks\">Engin bókamerki</string>\n    <string name=\"no_repositories\">Engar lindir</string>\n    <string name=\"no_contributors\">Engir samstarfsaðilar</string>\n    <string name=\"no_issues\">Engin vandamál</string>\n    <string name=\"no_gists\">Engin Gists</string>\n    <string name=\"no_people\">Ekkert fólk</string>\n    <string name=\"no_followers\">Engir fylgjendur</string>\n    <string name=\"no_members\">Engir meðlimir</string>\n    <string name=\"no_news\">Engar fréttir</string>\n    <string name=\"no_commits\">Engar færslur</string>\n    <!--  -->\n\n\n    <!-- Updating messages -->\n    <string name=\"updating_assignee\">Uppfærir útvaldan…</string>\n    <string name=\"updating_issue\">Uppfærir vandamál…</string>\n    <string name=\"updating_labels\">Uppfærir merki…</string>\n    <string name=\"updating_milestone\">Uppfærir útgáfur…</string>\n    <!--  -->\n\n    <string name=\"news\">Fréttir</string>\n    <string name=\"issues\">Vandamál</string>\n    <string name=\"gists\">Gists</string>\n    <string name=\"commits\">Færslur</string>\n    <string name=\"global_search\">GitHub leit</string>\n    <string name=\"find_repositories\">Finna lindir</string>\n    <string name=\"find_issues\">Finna vandamál</string>\n    <string name=\"search_title\">Leit…</string>\n    <string name=\"clear_search_history\">Hreinsa sögu</string>\n    <string name=\"search_history_cleared\">Leitarsaga hefur verið hreinsuð</string>\n    <string name=\"login_activity_authenticating\">Skráir inn…</string>\n    <string name=\"creating_gist\">Skapar Gist…</string>\n    <string name=\"create\">Skapa</string>\n    <string name=\"create_gist\">Skapa Gist</string>\n    <string name=\"make_public\">Gera þetta Gist opinbert</string>\n    <string name=\"gist_file_name_hint\">file.rb</string>\n    <string name=\"gist\">Gist</string>\n    <string name=\"comments\">Athugasemdir</string>\n    <string name=\"files\">Skrár</string>\n    <string name=\"open\">Opna</string>\n    <string name=\"random\">Handahófskennt</string>\n    <string name=\"file_name\">Skráarnafn</string>\n    <string name=\"file_content\">Innihald skráar</string>\n    <string name=\"new_gist\">Nýtt Gist</string>\n    <string name=\"filter\">Sía</string>\n    <string name=\"bookmark\">Bókamerki</string>\n    <string name=\"comment\">Athugasemd</string>\n    <string name=\"delete\">Eyða</string>\n    <string name=\"refresh\">Endurhlaða</string>\n    <string name=\"dashboard_issues_title\">Yfirlit vandamála</string>\n    <string name=\"bookmarks\">Bókamerki</string>\n    <string name=\"gists_title\">Gists</string>\n    <string name=\"issue_title\">Vandamál #</string>\n    <string name=\"pull_request_title\">Togbeiðni #</string>\n    <string name=\"gist_title\">Gist\\u0020</string>\n    <string name=\"filter_issues_title\">Sía vandamál</string>\n    <string name=\"create_comment_title\">Skapa athugasemd</string>\n    <string name=\"comment_hint\">Skrifaðu athugasemd</string>\n    <string name=\"show_more\">Sýna meira…</string>\n    <string name=\"repositories\">Lindir</string>\n    <string name=\"contributors\">Samstarfsaðilar</string>\n    <string name=\"issues_title\">Vandamál</string>\n    <string name=\"edit_labels\">Breyta merkjum</string>\n    <string name=\"milestone_prefix\">Útgáfur:</string>\n    <string name=\"edit_milestone\">Breyta útgáfu</string>\n    <string name=\"edit_assignee\">Breyta útvöldum</string>\n    <string name=\"description\">Lýsing</string>\n    <string name=\"gist_description_hint\">Gist skapað á android</string>\n    <string name=\"title\">Titill</string>\n    <string name=\"edit\">Breyta</string>\n    <string name=\"starring_gist\">Stjörnumerkja Gist…</string>\n    <string name=\"unstarring_gist\">Taka stjörnumerkingu af Gist…</string>\n    <string name=\"accounts_label\">Aðgangar</string>\n    <string name=\"select_assignee\">Velja útvaldan</string>\n    <string name=\"select_milestone\">Velja útgáfu</string>\n    <string name=\"select_labels\">Velja merki</string>\n    <string name=\"select_ref\">Velja greinar eða merki</string>\n    <string name=\"no_milestone\">Engin útgáfa</string>\n    <string name=\"unassigned\">Engin hefur verið útvaldur</string>\n    <string name=\"assigned\">er útvaldur</string>\n    <string name=\"no_gists_found\">Engin Gists fundust</string>\n    <string name=\"confirm_gist_delete_title\">Staðfesta eyðingu</string>\n    <string name=\"confirm_gist_delete_message\">Ertu viss um að þú viljir eyða þessu Gisti?</string>\n    <string name=\"deleting_gist\">Eyðir Gisti…</string>\n    <string name=\"creating_comment\">Skapar athugasemd…</string>\n    <string name=\"confirm_bookmark_delete_message\">Ertu viss um að þú viljir eyða þessu bókamerki?</string>\n    <string name=\"issue_dashboard\">Yfirlit vandamála</string>\n    <string name=\"new_issue\">Nýtt vandamál</string>\n    <string name=\"anonymous\">Nafnlaus</string>\n    <string name=\"message_filter_saved\">Vandamálasía vistuð í bókamerki</string>\n    <string name=\"recently_viewed\">NÝLEGA SKOÐAÐ</string>\n    <string name=\"recent\">Nýlegt</string>\n    <string name=\"recent_remove\">Fjarlægja nýlegt</string>\n    <string name=\"recent_list_remove\">Fjarlægja frá nýlega notuðu</string>\n    <string name=\"section_issue_status\">Staða:</string>\n    <string name=\"status_open\">Opið</string>\n    <string name=\"status_closed\">Lokað</string>\n    <string name=\"section_issue_assigned\">Úthlutað til:</string>\n    <string name=\"assignee_anyone\">Hver sem er</string>\n    <string name=\"section_issue_milestone\">Útgáfa:</string>\n    <string name=\"none\">Enginn</string>\n    <string name=\"section_issue_labels\">Merki:</string>\n    <string name=\"log_in\">Innskráning</string>\n    <string name=\"signup_link\">Hefurðu aldrei notað GitHub? &lt;a href=\\\"https://github.com/join\\\">Ýttu hér&lt;/a> til að skrá þig</string>\n    <string name=\"signup_link_two_factor_auth\">Veistu ekki hvernig git virkar? &lt;a href=\\\"https://help.github.com/articles/about-two-factor-authentication\\\">Hjálp finnst mér.&lt;/a></string>\n    <string name=\"connection_failed\">Get ekki tengst GitHub</string>\n    <string name=\"invalid_login_or_password\">Skrifaðu inn gilt notendanafn &amp; lykilorð</string>\n    <string name=\"invalid_password\">Skrifaðu inn gilt lykilorð.</string>\n    <string name=\"password\">Lykilorð</string>\n    <string name=\"username_or_email\">Notendanafn eða tölvupóstfang</string>\n    <string name=\"followers\">Fylgjendur</string>\n    <string name=\"following\">Fylgir</string>\n    <string name=\"followers_self\">Fylgjendur</string>\n    <string name=\"following_self\">Fylgir</string>\n    <string name=\"follow\">Fylgjast með</string>\n    <string name=\"unfollow\">Hætta að fylgjast með</string>\n    <string name=\"star\">Stjörnumerkja</string>\n    <string name=\"unstar\">Fjarlægja stjörnumerkingu</string>\n    <string name=\"members\">Meðlimir</string>\n    <string name=\"closing_issue\">Loka vandamáli…</string>\n    <string name=\"reopening_issue\">Enduropna vandamál…</string>\n    <string name=\"avatar\">Deili</string>\n    <string name=\"creating_issue\">Skapar vandamál…</string>\n    <string name=\"prefix_created\">skapað\\u0020</string>\n    <string name=\"prefix_updated\">uppfært\\u0020</string>\n    <string name=\"prefix_opened\">opnað\\u0020</string>\n    <string name=\"clear\">Hreinsa</string>\n    <string name=\"pull_request_commits\">Færslur: %d</string>\n    <string name=\"open_issues\">Opin vandamál</string>\n    <string name=\"closed_issues\">Lokuð vandamál</string>\n    <string name=\"confirm_bookmark_delete_title\">Fjarlægja bókamerki</string>\n    <string name=\"save\">Vista</string>\n    <string name=\"apply\">Staðfesta</string>\n    <string name=\"labels_prefix\">Merki:</string>\n    <string name=\"assignee\">Útvaldur</string>\n    <string name=\"milestone\">Útgáfur</string>\n    <string name=\"labels\">Merki</string>\n    <string name=\"issue_confirm_close_message\">Ertu viss um að þú viljir loka þessu vandamáli?</string>\n    <string name=\"issue_confirm_reopen_message\">Ertu viss um að þú viljir enduropna þetta vandamál?</string>\n    <string name=\"issue_confirm_close_title\">Loka vandamáli</string>\n    <string name=\"issue_confirm_reopen_title\">Enduropna vandamál</string>\n    <string name=\"closed\">Lokað</string>\n    <string name=\"no_description_given\">Engin lýsing gefin.</string>\n    <string name=\"close\">Loka</string>\n    <string name=\"reopen\">Enduropna</string>\n    <string name=\"title_invalid_github_url\">Ógild GitHub slóð</string>\n    <string name=\"message_invalid_github_url\">Eftirfarandi slóð gat ekki opnast af forritinu:\\n{0}</string>\n    <string name=\"cancel\">Hætta við</string>\n    <string name=\"authenticator_conflict_title\">Appaárekstur</string>\n    <string name=\"authenticator_conflict_message\">Annað app er nú þegar stillt á GitHub auðkenningu.\\n\\nÞú verður að fjarlægja þetta app áður en hægt er að nota GitHub appið.</string>\n    <string name=\"opening_repository\">Opnar {0}…</string>\n    <string name=\"commit_compare_title\">Bera saman færslur</string>\n    <string name=\"commit_prefix\">Færsla\\u0020</string>\n    <string name=\"parent_prefix\">Foreldri\\u0020</string>\n    <string name=\"authored\">skrifað</string>\n    <string name=\"committed\">fært inn</string>\n    <string name=\"diff_line_message\">Hvað vilt þú gera?</string>\n    <string name=\"comment_on_line\">Athugasemd á línu</string>\n    <string name=\"view_entire_file\">Skrifa heila skrá</string>\n    <string name=\"comparing_commits\">Bera saman {0} færslur</string>\n    <string name=\"enable_wrapping\">Leyfa færslu í næstu línu</string>\n    <string name=\"disable_wrapping\">Banna færslu í næstu línu</string>\n    <string name=\"code\">Kóði</string>\n    <string name=\"following_user\">Fylgir…</string>\n    <string name=\"unfollowing_user\">Hættir að fylgjast með…</string>\n    <string name=\"starring_repository\">Stjörnumerkir…</string>\n    <string name=\"unstarring_repository\">Tekur stjörnumerkingu af…</string>\n    <string name=\"navigate_to_user\">Fara til %s</string>\n    <string name=\"contributions\">%d færslur</string>\n\n    <!-- Tab titles, should be as short as possible -->\n    <string name=\"tab_repositories\">Lindir</string>\n    <string name=\"tab_users\">Notendur</string>\n    <string name=\"tab_news\">Fréttir</string>\n    <string name=\"tab_following_self\">Fylgt</string>\n    <string name=\"tab_followers_self\">Fylgjendur</string>\n    <string name=\"tab_following\">Fylgir</string>\n    <string name=\"tab_followers\">Fylgjendur</string>\n    <string name=\"tab_members\">Meðlimir</string>\n    <string name=\"tab_code\">Kóði</string>\n    <string name=\"tab_commits\">Færslur</string>\n    <string name=\"tab_issues\">Vandamál</string>\n    <string name=\"tab_watched\">Fylgst með</string>\n    <string name=\"tab_assigned\">Úthlutað</string>\n    <string name=\"tab_created\">Skapað</string>\n    <string name=\"tab_mentioned\">Minnst á</string>\n    <string name=\"tab_mine\">Mitt</string>\n    <string name=\"tab_starred\">Stjörnumerkt</string>\n    <string name=\"tab_all\">Allt</string>\n    <!--  -->\n    <string name=\"share\">Deila</string>\n    <string name=\"show_password\">Sýna lykilorð</string>\n    <string name=\"write\">Skrifa</string>\n    <string name=\"preview\">Forskoðun</string>\n    <string name=\"show_raw_markdown\">Sýna hrátt markdown</string>\n    <string name=\"render_markdown\">Keyra markdown</string>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-it/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<resources>\n\n    <!-- Error messages -->\n    <string name=\"error_orgs_load\">Impossibile caricare account e organizzazioni</string>\n    <string name=\"error_issues_load\">Impossibile caricare le segnalazioni</string>\n    <string name=\"error_repos_load\">Impossibile caricare i repositories</string>\n    <string name=\"error_repo_load\">Impossibile caricare il repository</string>\n    <string name=\"error_gist_load\">Impossibile caricare Gist</string>\n    <string name=\"error_news_load\">Impossibile caricare le news</string>\n    <string name=\"error_followers_load\">Impossibile caricare followers</string>\n    <string name=\"error_people_load\">Impossibile caricare persone</string>\n    <string name=\"error_person_load\">Impossibile caricare la persona</string>\n    <string name=\"error_gist_file_load\">Impossibile caricare il contenuto del file Gist</string>\n    <string name=\"error_gists_load\">Impossibile caricare i Gist</string>\n    <string name=\"error_issue_load\">Impossibile caricare la segnalazione</string>\n    <string name=\"error_collaborators_load\">Impossibile caricare collaboratori</string>\n    <string name=\"error_milestones_load\">Impossibile caricare i milestones</string>\n    <string name=\"error_labels_load\">Impossibile caricare le etichette</string>\n    <string name=\"error_bookmarks_load\">Impossibile caricare i segnalibri</string>\n    <string name=\"error_members_load\">Impossibile caricare membri</string>\n    <string name=\"error_commits_load\">Impossibile caricare i Commits</string>\n    <string name=\"error_commit_load\">Impossibile caricare il Commit</string>\n    <string name=\"error_file_load\">Impossibile caricare il file</string>\n    <string name=\"error_code_load\">Impossibile caricare il codice</string>\n    <string name=\"error_refs_load\">Impossibile caricare branch e tag</string>\n    <string name=\"error_following_person\">Impossibile aggiungere la persona</string>\n    <string name=\"error_unfollowing_person\">Impossibile eliminare la persona</string>\n    <string name=\"error_checking_following_status\">Impossibile controllare following</string>\n    <string name=\"error_starring_repository\">Impossibile aggiungere tra i preferiti</string>\n    <string name=\"error_unstarring_repository\">Impossibile eliminare dai preferiti</string>\n    <string name=\"error_checking_starring_status\">Impossibile controllare preferiti</string>\n    <!--  -->\n\n\n    <!-- Loading messages -->\n    <string name=\"loading_gist\">Gist in caricamento…</string>\n    <string name=\"loading_more_issues\">Altre segnalazioni in caricamento…</string>\n    <string name=\"loading_issues\">Segnalazioni in caricamento…</string>\n    <string name=\"loading_comments\">Commenti in caricamento…</string>\n    <string name=\"loading_repositories\">Repository in caricamento…</string>\n    <string name=\"loading_issue\">Segnalazione in caricamento…</string>\n    <string name=\"loading_news\">News in caricamento…</string>\n    <string name=\"loading_followers\">Followers in caricamento…</string>\n    <string name=\"loading_people\">Persone in caricamento…</string>\n    <string name=\"loading_gists\">Gists in caricamento…</string>\n    <string name=\"loading_collaborators\">Collaboratori in caricamento…</string>\n    <string name=\"loading_milestones\">Milestones in caricamento…</string>\n    <string name=\"loading_labels\">Etichette in caricamento…</string>\n    <string name=\"loading_commits\">Commits in caricamento…</string>\n    <string name=\"loading_files_and_comments\">Files e commenti in caricamento…</string>\n    <string name=\"loading_refs\">Branch e tag in caricamento</string>\n    <!--  -->\n\n\n    <!-- Empty messages -->\n    <string name=\"no_bookmarks\">Nessun Segnalibro</string>\n    <string name=\"no_repositories\">Nessun Repository</string>\n    <string name=\"no_issues\">Nessuna Segnalazione</string>\n    <string name=\"no_gists\">Nessun Gist</string>\n    <string name=\"no_people\">Nessuna Persona</string>\n    <string name=\"no_followers\">Nessun Follower</string>\n    <string name=\"no_members\">Nessun Membro</string>\n    <string name=\"no_news\">Nessuna News</string>\n    <string name=\"no_commits\">Nessun Commit</string>\n    <!--  -->\n\n\n    <!-- Updating messages -->\n    <string name=\"updating_assignee\">Aggiornamento Assegnatario…</string>\n    <string name=\"updating_issue\">Aggiornamento Segnalazione…</string>\n    <string name=\"updating_labels\">Aggiornamento Etichette…</string>\n    <string name=\"updating_milestone\">Aggiornamento Milestone…</string>\n    <!--  -->\n\n    <string name=\"news\">News</string>\n    <string name=\"issues\">Segnalazioni</string>\n    <string name=\"gists\">Gists</string>\n    <string name=\"commits\">Commits</string>\n    <string name=\"find_repositories\">Cerca Repository</string>\n    <string name=\"find_issues\">Cerca Segnalazioni</string>\n    <string name=\"search_title\">Ricerca in corso…</string>\n    <string name=\"clear_search_history\">Elimina Cronologia</string>\n    <string name=\"search_history_cleared\">Cronologia delle Ricerche Eliminata</string>\n    <string name=\"login_activity_authenticating\">Accesso in corso…</string>\n    <string name=\"creating_gist\">Creazione Gist in corso…</string>\n    <string name=\"create\">Crea</string>\n    <string name=\"create_gist\">Crea Gist</string>\n    <string name=\"make_public\">Rendi pubblico questo Gist</string>\n    <string name=\"gist_file_name_hint\">file.rb</string>\n    <string name=\"file_name\">Nome del file</string>\n    <string name=\"file_content\">Contenuto del file</string>\n    <string name=\"gist\">Gist</string>\n    <string name=\"comments\">Commenti</string>\n    <string name=\"files\">File</string>\n    <string name=\"open\">Apri</string>\n    <string name=\"random\">Random</string>\n    <string name=\"bookmark\">Segnalibro</string>\n    <string name=\"comment\">Commento</string>\n    <string name=\"delete\">Elimina</string>\n    <string name=\"refresh\">Ricarica</string>\n    <string name=\"dashboard_issues_title\">Dashboard Segnalazioni</string>\n    <string name=\"bookmarks\">Segnalibri</string>\n    <string name=\"gists_title\">Gist</string>\n    <string name=\"issue_title\">Segnalazione #</string>\n    <string name=\"pull_request_title\">Richiedi il Pull#</string>\n    <string name=\"gist_title\">Gist\\u0020</string>\n    <string name=\"filter_issues_title\">Segnalazione Filtro</string>\n    <string name=\"create_comment_title\">Crea un commento</string>\n    <string name=\"comment_hint\">Inserisci un commento</string>\n    <string name=\"show_more\">Mostra tutto…</string>\n    <string name=\"repositories\">Repository</string>\n    <string name=\"issues_title\">Segnalazioni</string>\n    <string name=\"edit_labels\">Modifica Segnalazioni</string>\n    <string name=\"milestone_prefix\">Milestone:</string>\n    <string name=\"edit_milestone\">Modifica Milestone</string>\n    <string name=\"edit_assignee\">Modifica Assegnatario</string>\n    <string name=\"description\">Descrizione</string>\n    <string name=\"gist_description_hint\">Gist creato in Android</string>\n    <string name=\"title\">Titolo</string>\n    <string name=\"edit\">Modifica</string>\n    <string name=\"starring_gist\">Inserimento Gist tra i preferiti…</string>\n    <string name=\"unstarring_gist\">Rimozione del Gist dai preferiti in corso…</string>\n    <string name=\"accounts_label\">Account</string>\n    <string name=\"select_assignee\">Seleziona Assegnatario</string>\n    <string name=\"select_milestone\">Seleziona Milestone</string>\n    <string name=\"select_labels\">Seleziona Etichette</string>\n    <string name=\"select_ref\">Select Branch or Tag</string>\n    <string name=\"no_milestone\">Nessun milestone</string>\n    <string name=\"unassigned\">Non ci sono assegnatari</string>\n    <string name=\"assigned\">E\\' assegnatario</string>\n    <string name=\"no_gists_found\">Nessun Gist trovato</string>\n    <string name=\"confirm_gist_delete_title\">Conferma Eliminazione</string>\n    <string name=\"confirm_gist_delete_message\">Sicuro di voler eliminare questo Gist?</string>\n    <string name=\"deleting_gist\">Eliminazione Gist in corso…</string>\n    <string name=\"creating_comment\">Stiamo creando il commento…</string>\n    <string name=\"confirm_bookmark_delete_message\">Sicuro di voler rimuovere questo segnalibro?</string>\n    <string name=\"issue_dashboard\">Dashboard Segnalazioni</string>\n    <string name=\"new_issue\">Nuova segnalazione</string>\n    <string name=\"anonymous\">Anonimo</string>\n    <string name=\"message_filter_saved\">Filtro notifiche salvato tra i segnalibri</string>\n    <string name=\"recent\">Recenti</string>\n    <string name=\"section_issue_status\">Status:</string>\n    <string name=\"status_open\">Aperto</string>\n    <string name=\"status_closed\">Chiuso</string>\n    <string name=\"section_issue_assigned\">Assegnato a:</string>\n    <string name=\"assignee_anyone\">Chiunque</string>\n    <string name=\"section_issue_milestone\">Milestone:</string>\n    <string name=\"none\">Nessuno</string>\n    <string name=\"section_issue_labels\">Etichetta:</string>\n    <string name=\"log_in\">Accedi</string>\n    <string name=\"signup_link\">Nuovo su GitHub? &lt;a href=\\\"https://github.com/join\\\">Clicca qui&lt;/a> per iscriverti</string>\n    <string name=\"connection_failed\">Impossibile connettersi a GitHub</string>\n    <string name=\"invalid_login_or_password\">Inserisci un nome utente e una password validi</string>\n    <string name=\"invalid_password\">Inserisci una password valida.</string>\n    <string name=\"password\">Password</string>\n    <string name=\"login_or_email\">Login o Email</string>\n    <string name=\"followers\">Followers</string>\n    <string name=\"following\">Following</string>\n    <string name=\"followers_self\">Followers</string>\n    <string name=\"following_self\">Following</string>\n    <string name=\"follow\">Follow</string>\n    <string name=\"unfollow\">Unfollow</string>\n    <string name=\"star\">Aggiungi ai preferiti</string>\n    <string name=\"unstar\">Elimina dai preferiti</string>\n    <string name=\"members\">Membri</string>\n    <string name=\"closing_issue\">Chiusura Notifica in corso…</string>\n    <string name=\"reopening_issue\">Riapertura Notifica in corso…</string>\n    <string name=\"avatar\">Avatar</string>\n    <string name=\"creating_issue\">Creazione Notifica in corso…</string>\n    <string name=\"prefix_created\">creato\\u0020</string>\n    <string name=\"prefix_updated\">aggiornato\\u0020</string>\n    <string name=\"prefix_opened\">aperto\\u0020</string>\n    <string name=\"clear\">Cancella</string>\n    <string name=\"open_issues\">Apri Segnalazione</string>\n    <string name=\"closed_issues\">Segnalazioni Chiuse</string>\n    <string name=\"confirm_bookmark_delete_title\">Rimuovi Segnalibro</string>\n    <string name=\"save\">Salva</string>\n    <string name=\"apply\">Applica</string>\n    <string name=\"labels_prefix\">Etichette:</string>\n    <string name=\"assignee\">Assegnatario</string>\n    <string name=\"milestone\">Milestone</string>\n    <string name=\"labels\">Etichette</string>\n    <string name=\"issue_confirm_close_message\">Sicuro di voler chiudere questa segnalazione?</string>\n    <string name=\"issue_confirm_reopen_message\">Sicuro di voler riaprire questa segnalazione?</string>\n    <string name=\"issue_confirm_close_title\">Chiudi Segnalazione</string>\n    <string name=\"issue_confirm_reopen_title\">Riapri Segnalazione</string>\n    <string name=\"closed\">Chiuso</string>\n    <string name=\"no_description_given\">Nessuna descrizione fornita.</string>\n    <string name=\"close\">Chiudi</string>\n    <string name=\"reopen\">Riapri</string>\n    <string name=\"title_invalid_github_url\">URL GitHub non valida</string>\n    <string name=\"message_invalid_github_url\">La applicazione non riesce ad aprire il seguente URL:\\n{0}</string>\n    <string name=\"recently_viewed\">VISUALIZZATI RECENTEMENTE</string>\n    <string name=\"cancel\">Annulla</string>\n    <string name=\"authenticator_conflict_title\">Conflitto nell\\'applicazione</string>\n    <string name=\"authenticator_conflict_message\">E\\' già stata configurata un\\' altra applicazione per l\\' autenticazione di GitHub.\\n\\nPer utilizzare l\\'app di Github rimuovi l\\'altra applicazione dagli Account e dalle impostazioni di sincronizzazione e disintallala.</string>\n    <string name=\"opening_repository\">Apertura in corso {0}…</string>\n    <string name=\"commit_compare_title\">Confronta Commit</string>\n    <string name=\"commit_prefix\">Commit\\u0020</string>\n    <string name=\"parent_prefix\">Parent\\u0020</string>\n    <string name=\"authored\">Inserito tra gli autori</string>\n    <string name=\"committed\">Eseguito Commit</string>\n    <string name=\"diff_line_message\">Cosa vuoi fare?</string>\n    <string name=\"comment_on_line\">Commenta la riga</string>\n    <string name=\"view_entire_file\">Visualizza il file per intero</string>\n    <string name=\"comparing_commits\">Confronta {0} commits</string>\n    <string name=\"enable_wrapping\">Abilita il wrapping</string>\n    <string name=\"disable_wrapping\">Disabilita il wrapping</string>\n    <string name=\"code\">Codice</string>\n    <string name=\"following_user\">Caricamento tra i following…</string>\n    <string name=\"unfollowing_user\">Rimozione dai following…</string>\n    <string name=\"starring_repository\">Caricamento tra i preferiti…</string>\n    <string name=\"unstarring_repository\">Rimozione dai preferiti…</string>\n\n    <!-- Tab titles, should be as short as possible -->\n    <string name=\"tab_repositories\">Repository</string>\n    <string name=\"tab_news\">Notizie</string>\n    <string name=\"tab_following_self\">following</string>\n    <string name=\"tab_followers_self\">followers</string>\n    <string name=\"tab_following\">following</string>\n    <string name=\"tab_followers\">followers</string>\n    <string name=\"tab_members\">membri</string>\n    <string name=\"tab_code\">codice</string>\n    <string name=\"tab_commits\">commits</string>\n    <string name=\"tab_issues\">segnalazioni</string>\n    <string name=\"tab_watched\">osservati</string>\n    <string name=\"tab_assigned\">assegnati</string>\n    <string name=\"tab_created\">creati</string>\n    <string name=\"tab_mentioned\">menzionati</string>\n    <string name=\"tab_mine\">miei</string>\n    <string name=\"tab_starred\">preferiti</string>\n    <string name=\"tab_all\">tutti</string>\n    <!--  -->\n    <string name=\"share\">Condividi</string>\n    <string name=\"show_password\">Mostra password</string>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-iw/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<resources>\n  <string name=\"error_orgs_load\">טעינת ארגון משתמש &amp; נכשלה</string>\n  <string name=\"error_issues_load\">נכשלה טעינת סוגיות</string>\n  <string name=\"error_repos_load\">טעינת מאגרים נכשלה</string>\n  <string name=\"error_repo_load\">טעינת מאגר נכשלה</string>\n  <string name=\"error_contributors_load\">טעינת תורמים נכשלה</string>\n  <string name=\"error_gist_load\">טעינת תמצית נכשלה</string>\n  <string name=\"error_news_load\">טעינת חדשות נכשלה</string>\n  <string name=\"error_followers_load\">טעינת עוקבים נכשלה</string>\n  <string name=\"error_people_load\">טעינת אנשים נכשלה</string>\n  <string name=\"error_person_load\">טעינת איש נכשלה</string>\n  <string name=\"error_gist_file_load\">טעינת תוכן תמצית נכשלה</string>\n  <string name=\"error_gists_load\">טעינת תמציות נכשלה</string>\n  <string name=\"error_issue_load\">טעינת סוגיה נכשלה</string>\n  <string name=\"error_collaborators_load\">טעינת מסייעים נכשלה</string>\n  <string name=\"error_milestones_load\">טעינת אבני-דרך נכשלה</string>\n  <string name=\"error_labels_load\">טעינת תבניות נכשלה</string>\n  <string name=\"error_bookmarks_load\">טעינת סימניות נכשלה</string>\n  <string name=\"error_members_load\">טעינת חברים נכשלה</string>\n  <string name=\"error_commits_load\">טעינת רישומים נכשלה</string>\n  <string name=\"error_commit_load\">טעינת רישום נכשלה</string>\n  <string name=\"error_file_load\">טעינת הקובץ נכשלה</string>\n  <string name=\"error_code_load\">טעינת הקוד נכשלה</string>\n  <string name=\"error_refs_load\">טעינת תגי ענף &amp; נכשלה</string>\n  <string name=\"error_following_person\">מעקב נכשל</string>\n  <string name=\"error_unfollowing_person\">ביטול מעקב נכשל</string>\n  <string name=\"error_checking_following_status\">בדיקת מצב מעקב נכשלה</string>\n  <string name=\"error_starring_repository\">סימון בכוכב נכשל</string>\n  <string name=\"error_unstarring_repository\">ביטול סימון בכוכב נכשל</string>\n  <string name=\"error_checking_starring_status\">בדיקת מצב סימון בכוכב נכשלה</string>\n  <string name=\"error_rendering_markdown\">עיבוד הוזלה נכשל</string>\n  <string name=\"error_users_search\">חיפוש משתמשים נכשל</string>\n  <string name=\"loading_gist\">טוען תמצית…</string>\n  <string name=\"loading_more_issues\">טוען עוד סוגיות…</string>\n  <string name=\"loading_issues\">טוען סוגיות…</string>\n  <string name=\"loading_comments\">טוען תגובות…</string>\n  <string name=\"loading_repositories\">טוען מאגרים…</string>\n  <string name=\"loading_issue\">טוען סוגיה…</string>\n  <string name=\"loading_news\">טוען חדשות…</string>\n  <string name=\"loading_followers\">טוען עוקבים…</string>\n  <string name=\"loading_people\">טוען אנשים…</string>\n  <string name=\"loading_gists\">טוען תמציות…</string>\n  <string name=\"loading_collaborators\">טוען מסייעים…</string>\n  <string name=\"loading_milestones\">טוען אבני-דרך…</string>\n  <string name=\"loading_labels\">טוען תוויות…</string>\n  <string name=\"loading_commits\">טוען רישומים…</string>\n  <string name=\"loading_files_and_comments\">טוען תגובות קבצי &amp;</string>\n  <string name=\"loading_refs\">טוען תגיות ענף &amp;</string>\n  <string name=\"no_bookmarks\">אין סימניות</string>\n  <string name=\"no_repositories\">אין מאגרים</string>\n  <string name=\"no_contributors\">אין תורמים</string>\n  <string name=\"no_issues\">אין סוגיות</string>\n  <string name=\"no_gists\">אין תמצותים</string>\n  <string name=\"no_people\">אין אנשים</string>\n  <string name=\"no_followers\">אין עוקבים</string>\n  <string name=\"no_members\">אין חברים</string>\n  <string name=\"no_news\">אין חדשות</string>\n  <string name=\"no_commits\">אין רשומות לביצוע</string>\n  <string name=\"updating_assignee\">מעדכן מוצב…</string>\n  <string name=\"updating_issue\">מעדכן סוגייה…</string>\n  <string name=\"updating_labels\">מעדכן תווית…</string>\n  <string name=\"updating_milestone\">מעדכן אבן-דרך…</string>\n  <string name=\"news\">חדשות</string>\n  <string name=\"issues\">סוגיות</string>\n  <string name=\"gists\">תמצותים</string>\n  <string name=\"global_search\">חיפוש GitHub</string>\n  <string name=\"find_repositories\">מצא מאגרים</string>\n  <string name=\"find_issues\">מצא סוגיות</string>\n  <string name=\"search_title\">חפש…</string>\n  <string name=\"clear_search_history\">נקה הסטוריה</string>\n  <string name=\"search_history_cleared\">הסטוריית חיפוש נוקתה</string>\n  <string name=\"login_activity_authenticating\">מתחבר…</string>\n  <string name=\"creating_gist\">יוצר תמצית…</string>\n  <string name=\"create\">צור</string>\n  <string name=\"create_gist\">צור תמצית</string>\n  <string name=\"make_public\">הפוך תמצית זו לציבורית</string>\n  <string name=\"gist\">תמצית</string>\n  <string name=\"comments\">תגובות</string>\n  <string name=\"files\">קבצים</string>\n  <string name=\"open\">פתח</string>\n  <string name=\"random\">אקראי</string>\n  <string name=\"file_name\">שם קובץ</string>\n  <string name=\"file_content\">תוכן קובץ</string>\n  <string name=\"new_gist\">תמצית חדשה</string>\n  <string name=\"filter\">מסנן</string>\n  <string name=\"bookmark\">סימנייה</string>\n  <string name=\"comment\">הגב</string>\n  <string name=\"refresh\">רענן</string>\n  <string name=\"dashboard_issues_title\">לוח סוגיות</string>\n  <string name=\"bookmarks\">סימניות</string>\n  <string name=\"gists_title\">תמצותים</string>\n  <string name=\"issue_title\">סוגיה #</string>\n  <string name=\"pull_request_title\">בקשת משיכה #</string>\n  <string name=\"gist_title\">תמצית\\u0020</string>\n  <string name=\"filter_issues_title\">סנן סוגיות</string>\n  <string name=\"create_comment_title\">צור תגובה</string>\n  <string name=\"comment_hint\">הכנס תגובה</string>\n  <string name=\"show_more\">הצג עוד…</string>\n  <string name=\"repositories\">מאגרים</string>\n  <string name=\"contributors\">תורמים</string>\n  <string name=\"issues_title\">סוגיות</string>\n  <string name=\"edit_labels\">ערוך תוויות</string>\n  <string name=\"milestone_prefix\">אבן דרך:</string>\n  <string name=\"edit_milestone\">ערוך אבן דרך</string>\n  <string name=\"edit_assignee\">ערוך הצבה</string>\n  <string name=\"description\">תיאור</string>\n  <string name=\"gist_description_hint\">תמצית שנוצרה בAndroid</string>\n  <string name=\"title\">כותרת</string>\n  <string name=\"edit\">ערוך</string>\n  <string name=\"starring_gist\">מסמן תמצית בכוכב</string>\n  <string name=\"unstarring_gist\">מבטל סימון בכוכב…</string>\n  <string name=\"accounts_label\">משתמש</string>\n  <string name=\"select_assignee\">בחר מוצב</string>\n  <string name=\"select_milestone\">בחר אבן דרך</string>\n  <string name=\"select_labels\">בחר תוויות</string>\n  <string name=\"select_ref\">בחר ענף או תג</string>\n  <string name=\"no_milestone\">אין אבן דרך</string>\n  <string name=\"unassigned\">אף אחד לא מוצב</string>\n  <string name=\"assigned\">משוייך</string>\n  <string name=\"no_gists_found\">לא נמצאו תמציות</string>\n  <string name=\"confirm_gist_delete_title\">אשר מחיקה</string>\n  <string name=\"confirm_gist_delete_message\">אתה בטוח שברצונך למחוק תמצית זו?</string>\n  <string name=\"deleting_gist\">מוחק תמצית…</string>\n  <string name=\"creating_comment\">יוצר תגובה…</string>\n  <string name=\"confirm_bookmark_delete_message\">אתה בטוח שברצונך להמחוק סימנייה זו?</string>\n  <string name=\"issue_dashboard\">לוח סוגיות</string>\n  <string name=\"new_issue\">סוגייה חדשה</string>\n  <string name=\"anonymous\">אנונימי</string>\n  <string name=\"message_filter_saved\">מסנן סוגיות נשמר במועדפים</string>\n  <string name=\"recently_viewed\">נצפה לאחרונה</string>\n  <string name=\"recent\">אחרונים</string>\n  <string name=\"recent_remove\">הסר אחרונים</string>\n  <string name=\"recent_list_remove\">הסר מרשימת שומשו לאחרונה</string>\n  <string name=\"section_issue_status\">מצב:</string>\n  <string name=\"status_open\">פתח</string>\n  <string name=\"status_closed\">סגור</string>\n  <string name=\"section_issue_assigned\">משוייך אל:</string>\n  <string name=\"assignee_anyone\">כולם</string>\n  <string name=\"section_issue_milestone\">אבן דרך:</string>\n  <string name=\"none\">ריק</string>\n  <string name=\"section_issue_labels\">תוויות:</string>\n  <string name=\"log_in\">התחבר</string>\n  <string name=\"signup_link\">חדש ב-GitHub? &lt;a href=\\\"https://github.com/plans\\\">לחץ כאן&lt;/a> כדי להירשם</string>\n  <string name=\"signup_link_two_factor_auth\">לא בטוח מה לעשות? &lt;a href=\\\"https://help.github.com/articles/about-two-factor-authentication\\\">קבל קצת עזרה.&lt;/a></string>\n  <string name=\"connection_failed\">לא יכול להתחבר ל- GitHub</string>\n  <string name=\"invalid_login_or_password\">נא הכנס סיסמת התחברות &amp; תקינה</string>\n  <string name=\"invalid_password\">נא הכנס סיסמה תקינה</string>\n  <string name=\"password\">סיסמה</string>\n  <string name=\"username_or_email\">שם משתמש או דואר אלקטרוני</string>\n  <string name=\"followers\">עוקבים</string>\n  <string name=\"following\">עוקב אחרי</string>\n  <string name=\"followers_self\">עוקבים</string>\n  <string name=\"following_self\">עוקב אחרי</string>\n  <string name=\"follow\">עקוב</string>\n  <string name=\"unfollow\">אל תעקוב</string>\n  <string name=\"star\">סמן בכוכב</string>\n  <string name=\"unstar\">אל תסמן בכוכב</string>\n  <string name=\"members\">חברים</string>\n  <string name=\"closing_issue\">סוגר סוגיה…</string>\n  <string name=\"reopening_issue\">פותח סוגיה מחדש…</string>\n  <string name=\"avatar\">אווטאר</string>\n  <string name=\"creating_issue\">יוצר סוגיה…</string>\n  <string name=\"prefix_created\">נוצר\\u0020</string>\n  <string name=\"prefix_updated\">עודכן\\u0020</string>\n  <string name=\"prefix_opened\">נפתח\\u0020</string>\n  <string name=\"open_issues\">סוגיות פתוחות</string>\n  <string name=\"closed_issues\">סוגיות סגורות</string>\n  <string name=\"confirm_bookmark_delete_title\">הסר סימנייה</string>\n  <string name=\"save\">שמור</string>\n  <string name=\"apply\">החל</string>\n  <string name=\"labels_prefix\">תוויות:</string>\n  <string name=\"assignee\">הצבה</string>\n  <string name=\"milestone\">אבן דרך</string>\n  <string name=\"labels\">תוויות</string>\n  <string name=\"issue_confirm_close_message\">אתה בטוח שברצונך לסגור סוגיה זו?</string>\n  <string name=\"issue_confirm_reopen_message\">אתה בטוח שברצונך לפתוח סוגיה זו מחדש?</string>\n  <string name=\"issue_confirm_close_title\">סגור סוגיה</string>\n  <string name=\"issue_confirm_reopen_title\">פתח סוגיה מחדש</string>\n  <string name=\"closed\">סגור</string>\n  <string name=\"no_description_given\">לא נוסף תיאור</string>\n  <string name=\"close\">סגור</string>\n  <string name=\"reopen\">פתח מחדש</string>\n  <string name=\"title_invalid_github_url\">כתובת GitHub לא תקינה</string>\n  <string name=\"message_invalid_github_url\">לא היתה אפשרות לפתוח את כתובת ה-URL על-ידי יישום זה: \\n {0}</string>\n  <string name=\"authenticator_conflict_title\">התנגשות יישום</string>\n  <string name=\"authenticator_conflict_message\">יישום אחר מוגדר להתחברות GitHub.\\n\\nעליך להסיר את היישום האחר מהגדרות חשבונות &amp; סנכרון ולהסיר את היישום לפני השימוש ביישום GitHub.</string>\n  <string name=\"opening_repository\">פותח {0}…</string>\n  <string name=\"commit_compare_title\">השווה משימות</string>\n  <string name=\"commit_prefix\">משימה\\u0020</string>\n  <string name=\"parent_prefix\">הורה\\u0020</string>\n  <string name=\"authored\">נוצר על-ידי</string>\n  <string name=\"committed\">בוצע</string>\n  <string name=\"diff_line_message\">מה תרצה לעשות?</string>\n  <string name=\"comment_on_line\">הגב בתוך הקוד</string>\n  <string name=\"view_entire_file\">הצג קובץ שלם</string>\n  <string name=\"comparing_commits\">משווה {0} רשומות</string>\n  <string name=\"enable_wrapping\">אפשר התאמה</string>\n  <string name=\"disable_wrapping\">בטל התאמה</string>\n  <string name=\"code\">קוד</string>\n  <string name=\"following_user\">עוקב…</string>\n  <string name=\"unfollowing_user\">לא עוקב…</string>\n  <string name=\"starring_repository\">מסמן בכוכב…</string>\n  <string name=\"unstarring_repository\">מבטל סימון בכוכב…</string>\n    <string name=\"navigate_to_user\">נווט אל %s</string>\n  <string name=\"tab_repositories\">מאגרים</string>\n  <string name=\"tab_users\">משתמשים</string>\n  <string name=\"tab_news\">חדשות</string>\n  <string name=\"tab_following_self\">עוקב</string>\n  <string name=\"tab_followers_self\">עוקבים</string>\n  <string name=\"tab_following\">עוקב</string>\n  <string name=\"tab_followers\">עוקבים</string>\n  <string name=\"tab_members\">חברים</string>\n  <string name=\"tab_code\">קוד</string>\n  <string name=\"tab_commits\">ר</string>\n  <string name=\"tab_issues\">סוגיות</string>\n  <string name=\"tab_watched\">נצפה</string>\n  <string name=\"tab_assigned\">מוצב</string>\n  <string name=\"tab_created\">נוצר</string>\n  <string name=\"tab_mentioned\">מוזכר</string>\n  <string name=\"tab_mine\">שלי</string>\n  <string name=\"tab_starred\">מסומן בכוכב</string>\n  <string name=\"tab_all\">הכל</string>\n  <string name=\"share\">שתף</string>\n  <string name=\"show_password\">הצג סיסמה</string>\n  <string name=\"write\">כתוב</string>\n  <string name=\"preview\">תצוגה מקדימה</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-ja/strings.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<resources>\n\n    <!-- Error messages -->\n    <string name=\"error_orgs_load\">アカウントと組織名のロードに失敗しました</string>\n    <string name=\"error_issues_load\">課題のロードに失敗しました</string>\n    <string name=\"error_repos_load\">リポジトリのロードに失敗しました</string>\n    <string name=\"error_repo_load\">リポジトリのロードに失敗しました</string>\n    <string name=\"error_contributors_load\">貢献者のロードに失敗しました</string>\n    <string name=\"error_gist_load\">Gist のロードに失敗しました</string>\n    <string name=\"error_news_load\">ニュースのロードに失敗しました</string>\n    <string name=\"error_followers_load\">フォロワーのロードに失敗しました</string>\n    <string name=\"error_people_load\">人のロードに失敗しました</string>\n    <string name=\"error_person_load\">ユーザーのロードに失敗しました</string>\n    <string name=\"error_gist_file_load\">Gist ファイルのロードに失敗しました</string>\n    <string name=\"error_gists_load\">Gists のロードに失敗しました</string>\n    <string name=\"error_issue_load\">課題のロードに失敗しました</string>\n    <string name=\"error_collaborators_load\">共同作業者のロードに失敗しました</string>\n    <string name=\"error_milestones_load\">マイルストーンのロードに失敗しました</string>\n    <string name=\"error_labels_load\">ラベルのロードに失敗しました</string>\n    <string name=\"error_bookmarks_load\">ブックマークのロードに失敗しました</string>\n    <string name=\"error_members_load\">メンバーのロードに失敗しました</string>\n    <string name=\"error_commits_load\">コミットのロードに失敗しました</string>\n    <string name=\"error_commit_load\">コミットのロードに失敗しました</string>\n    <string name=\"error_file_load\">ファイルのロードに失敗しました</string>\n    <string name=\"error_code_load\">コードのロードに失敗しました</string>\n    <string name=\"error_refs_load\">ブランチとタグのロードに失敗しました</string>\n    <string name=\"error_following_person\">フォローするのに失敗しました</string>\n    <string name=\"error_unfollowing_person\">フォローを解除するのに失敗しました</string>\n    <string name=\"error_checking_following_status\">フォローの状態を確認するのに失敗しました</string>\n    <string name=\"error_starring_repository\">スターするのに失敗しました</string>\n    <string name=\"error_unstarring_repository\">スターを解除するのに失敗しました</string>\n    <string name=\"error_checking_starring_status\">スターの状態を確認するのに失敗しました</string>\n    <string name=\"error_rendering_markdown\">markdownをレンダリングするのに失敗しました</string>\n    <string name=\"error_users_search\">ユーザーを検索するのに失敗しました</string>\n    <!-- エラーメッセージ -->\n\n\n    <!-- Loading messages -->\n    <string name=\"loading_gist\">Gist をロードしています…</string>\n    <string name=\"loading_more_issues\">課題をさらにロードしています…</string>\n    <string name=\"loading_issues\">課題をロードしています…</string>\n    <string name=\"loading_comments\">コメントをロードしています…</string>\n    <string name=\"loading_repositories\">リポジトリをロードしています…</string>\n    <string name=\"loading_issue\">課題をロードしています…</string>\n    <string name=\"loading_news\">ニュースをロードしています…</string>\n    <string name=\"loading_followers\">フォロワーをロードしています…</string>\n    <string name=\"loading_people\">ユーザーをロードしています…</string>\n    <string name=\"loading_gists\">Gists をロードしています…</string>\n    <string name=\"loading_collaborators\">共同作業者をロードしています…</string>\n    <string name=\"loading_milestones\">マイルストーンをロードしています…</string>\n    <string name=\"loading_labels\">ラベルをロードしています…</string>\n    <string name=\"loading_commits\">コミットをロードしています…</string>\n    <string name=\"loading_files_and_comments\">ファイルとコメントをロードしています…</string>\n    <string name=\"loading_refs\">ブランチとタグをロードしています…</string>\n    <!-- ロード中メッセージ -->\n\n\n    <!-- Empty messages -->\n    <string name=\"no_bookmarks\">ブックマークはありません</string>\n    <string name=\"no_repositories\">リポジトリはありません</string>\n    <string name=\"no_contributors\">貢献者はいません</string>\n    <string name=\"no_issues\">課題はありません</string>\n    <string name=\"no_gists\">Gists はありません</string>\n    <string name=\"no_people\">ユーザーはいません</string>\n    <string name=\"no_followers\">フォロワーはいません</string>\n    <string name=\"no_members\">メンバーはいません</string>\n    <string name=\"no_news\">ニュースはありません</string>\n    <string name=\"no_commits\">コミットはありません</string>\n    <!-- 空きメッセージ -->\n\n\n    <!-- Updating messages -->\n    <string name=\"updating_assignee\">担当者を更新しています…</string>\n    <string name=\"updating_issue\">課題を更新しています…</string>\n    <string name=\"updating_labels\">ラベルを更新しています…</string>\n    <string name=\"updating_milestone\">マイルストーンを更新しています…</string>\n    <!-- 更新中メッセージ -->\n\n    <string name=\"news\">ニュース</string>\n    <string name=\"issues\">課題</string>\n    <string name=\"gists\">Gists</string>\n    <string name=\"commits\">コミット</string>\n    <string name=\"global_search\">GitHub 検索</string>\n    <string name=\"find_repositories\">リポジトリを検索</string>\n    <string name=\"find_issues\">課題を検索</string>\n    <string name=\"search_title\">検索…</string>\n    <string name=\"clear_search_history\">履歴を消去</string>\n    <string name=\"search_history_cleared\">検索履歴を消去</string>\n    <string name=\"login_activity_authenticating\">ログインしています…</string>\n    <string name=\"creating_gist\">Gist を作成しています…</string>\n    <string name=\"create\">作成</string>\n    <string name=\"create_gist\">Gist を作成</string>\n    <string name=\"make_public\">この Gist をパブリックにする</string>\n    <string name=\"gist_file_name_hint\">file.rb</string>\n    <string name=\"gist\">Gist</string>\n    <string name=\"comments\">コメント</string>\n    <string name=\"files\">ファイル</string>\n    <string name=\"open\">開く</string>\n    <string name=\"random\">ランダム</string>\n    <string name=\"file_name\">ファイル名</string>\n    <string name=\"file_content\">ファイル内容</string>\n    <string name=\"new_gist\">新規 Gist</string>\n    <string name=\"filter\">フィルター</string>\n    <string name=\"bookmark\">ブックマーク</string>\n    <string name=\"comment\">コメント</string>\n    <string name=\"delete\">削除</string>\n    <string name=\"refresh\">更新</string>\n    <string name=\"dashboard_issues_title\">課題ダッシュボード</string>\n    <string name=\"bookmarks\">ブックマーク</string>\n    <string name=\"gists_title\">Gists</string>\n    <string name=\"issue_title\">課題 #</string>\n    <string name=\"pull_request_title\">プルリクエスト #</string>\n    <string name=\"gist_title\">Gist\\u0020</string>\n    <string name=\"filter_issues_title\">課題フィルター</string>\n    <string name=\"create_comment_title\">コメント作成</string>\n    <string name=\"comment_hint\">コメントを入力して下さい</string>\n    <string name=\"show_more\">さらに表示…</string>\n    <string name=\"repositories\">リポジトリ</string>\n    <string name=\"contributors\">貢献者</string>\n    <string name=\"issues_title\">課題</string>\n    <string name=\"edit_labels\">ラベルを編集</string>\n    <string name=\"milestone_prefix\">マイルストーン:</string>\n    <string name=\"edit_milestone\">マイルストーンを編集</string>\n    <string name=\"edit_assignee\">担当者を編集</string>\n    <string name=\"description\">説明</string>\n    <string name=\"gist_description_hint\">Android 作成 Gist</string>\n    <string name=\"title\">タイトル</string>\n    <string name=\"edit\">編集</string>\n    <string name=\"starring_gist\">Gist にスターを付けています…</string>\n    <string name=\"unstarring_gist\">Gist のスターを解除しています…</string>\n    <string name=\"accounts_label\">アカウント</string>\n    <string name=\"select_assignee\">担当者を選択</string>\n    <string name=\"select_milestone\">マイルストーンを選択</string>\n    <string name=\"select_labels\">ラベルを選択</string>\n    <string name=\"select_ref\">ブランチまたはタグを選択</string>\n    <string name=\"no_milestone\">マイルストーンはありません</string>\n    <string name=\"unassigned\">担当者はいません</string>\n    <string name=\"assigned\">に割り当てられています</string>\n    <string name=\"no_gists_found\">Gists は見つかりませんでした</string>\n    <string name=\"confirm_gist_delete_title\">削除の確認</string>\n    <string name=\"confirm_gist_delete_message\">本当にこの Gist を削除してもよろしいですか?</string>\n    <string name=\"deleting_gist\">Gist を削除しています…</string>\n    <string name=\"creating_comment\">コメントを作成しています…</string>\n    <string name=\"confirm_bookmark_delete_message\">本当にこのブックマークを削除してもよろしいですか?</string>\n    <string name=\"issue_dashboard\">課題ダッシュボード</string>\n    <string name=\"new_issue\">新規課題</string>\n    <string name=\"anonymous\">匿名</string>\n    <string name=\"message_filter_saved\">課題フィルターをブックマークに保存しました</string>\n    <string name=\"recently_viewed\">最近の履歴</string>\n    <string name=\"recent\">履歴</string>\n    <string name=\"recent_remove\">履歴の削除</string>\n    <string name=\"recent_list_remove\">最近の履歴から削除</string>\n    <string name=\"section_issue_status\">状態:</string>\n    <string name=\"status_open\">開く</string>\n    <string name=\"status_closed\">閉じる</string>\n    <string name=\"section_issue_assigned\">割り当て:</string>\n    <string name=\"assignee_anyone\">誰でも</string>\n    <string name=\"section_issue_milestone\">マイルストーン:</string>\n    <string name=\"none\">なし</string>\n    <string name=\"section_issue_labels\">ラベル:</string>\n    <string name=\"log_in\">ログイン</string>\n    <string name=\"signup_link\">GitHub は初めてですか? &lt;a href=\\\"https://github.com/join\\\">こちら&lt;/a> からサインアップしてください。</string>\n    <string name=\"connection_failed\">GitHub に接続できません</string>\n    <string name=\"invalid_login_or_password\">正しいログイン &amp; パスワードを入力してください</string>\n    <string name=\"invalid_password\">正しいパスワードを入力してください。</string>\n    <string name=\"password\">パスワード</string>\n    <string name=\"username_or_email\">ユーザー名 または Email</string>\n    <string name=\"followers\">フォロワー</string>\n    <string name=\"following\">フォロー</string>\n    <string name=\"followers_self\">フォロワー</string>\n    <string name=\"following_self\">フォロー</string>\n    <string name=\"follow\">フォローする</string>\n    <string name=\"unfollow\">フォローを解除</string>\n    <string name=\"star\">スター</string>\n    <string name=\"unstar\">スターを解除</string>\n    <string name=\"members\">メンバー</string>\n    <string name=\"closing_issue\">課題を閉じる…</string>\n    <string name=\"reopening_issue\">課題を再度開く…</string>\n    <string name=\"avatar\">アバター</string>\n    <string name=\"creating_issue\">課題を作成しています…</string>\n    <string name=\"prefix_created\">作成\\u0020</string>\n    <string name=\"prefix_updated\">更新\\u0020</string>\n    <string name=\"prefix_opened\">編集\\u0020</string>\n    <string name=\"clear\">消去</string>\n    <string name=\"pull_request_commits\">コミット: %d</string>\n    <string name=\"open_issues\">開いている課題</string>\n    <string name=\"closed_issues\">閉じられた課題</string>\n    <string name=\"confirm_bookmark_delete_title\">ブックマークを削除</string>\n    <string name=\"save\">保存</string>\n    <string name=\"apply\">適用</string>\n    <string name=\"labels_prefix\">ラベル:</string>\n    <string name=\"assignee\">担当者</string>\n    <string name=\"milestone\">マイルストーン</string>\n    <string name=\"labels\">ラベル</string>\n    <string name=\"issue_confirm_close_message\">本当にこの課題を閉じてもよろしいですか?</string>\n    <string name=\"issue_confirm_reopen_message\">本当にこの課題を再度開いてもよろしいですか?</string>\n    <string name=\"issue_confirm_close_title\">課題を閉じる</string>\n    <string name=\"issue_confirm_reopen_title\">課題を再度開く</string>\n    <string name=\"closed\">閉じました</string>\n    <string name=\"no_description_given\">詳細説明はありません</string>\n    <string name=\"close\">閉じる</string>\n    <string name=\"reopen\">再度開く</string>\n    <string name=\"title_invalid_github_url\">不正な GitHub URL です</string>\n    <string name=\"message_invalid_github_url\">次の URL はこのアプリケーションでは開くことができませんでした:\\n{0}</string>\n    <string name=\"cancel\">キャンセル</string>\n    <string name=\"authenticator_conflict_title\">App の重複</string>\n    <string name=\"authenticator_conflict_message\">他のインストール済みアプリケーションが既に GitHub の認証を使用しています。\\n\\nGitHub app を利用するには Accounts &amp; sync 設定でそのアプリケーションをアンインストールし無ければなりません。</string>\n    <string name=\"opening_repository\">{0} を開いています…</string>\n    <string name=\"commit_compare_title\">コミットの比較</string>\n    <string name=\"view_entire_file\">ファイル全体を閲覧する</string>\n    <string name=\"comparing_commits\">{0} コミットを比較しています</string>\n    <string name=\"enable_wrapping\">折返しを有効化</string>\n    <string name=\"disable_wrapping\">折返しを無効化</string>\n    <string name=\"code\">コード</string>\n    <string name=\"following_user\">フォローしています…</string>\n    <string name=\"unfollowing_user\">フォローを解除しています…</string>\n    <string name=\"starring_repository\">スターしています…</string>\n    <string name=\"unstarring_repository\">スターを解除しています…</string>\n    <string name=\"navigate_to_user\">%s に移動します</string>\n    <string name=\"contributions\">%d コミット</string>\n\n    <!-- Tab titles, should be as short as possible -->\n    <string name=\"tab_repositories\">リポジトリ</string>\n    <string name=\"tab_users\">ユーザー</string>\n    <string name=\"tab_news\">ニュース</string>\n    <string name=\"tab_following_self\">フォロー</string>\n    <string name=\"tab_followers_self\">フォロワー</string>\n    <string name=\"tab_following\">フォロー</string>\n    <string name=\"tab_followers\">フォロワー</string>\n    <string name=\"tab_members\">メンバー</string>\n    <string name=\"tab_code\">コード</string>\n    <string name=\"tab_commits\">コミット</string>\n    <string name=\"tab_issues\">課題</string>\n    <!-- タブタイトル、できるだけ短い方が望ましい -->\n    <string name=\"share\">共有</string>\n    <string name=\"show_password\">パスワードを表示</string>\n    <string name=\"show_raw_markdown\">生のmarkdownを表示</string>\n    <string name=\"render_markdown\">markdownをレンダリング</string>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-ko/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<resources>\n\n    <!-- Error messages -->\n    <string name=\"error_orgs_load\">계정 로딩중 &amp; 인증 실패</string>\n    <string name=\"error_issues_load\">이슈 가져오기 실패</string>\n    <string name=\"error_repos_load\">저장소 가져오기 실패</string>\n    <string name=\"error_repo_load\">저장소 가져오기 실패</string>\n    <string name=\"error_gist_load\">Gist 가져오기 실패</string>\n    <string name=\"error_news_load\">소식 가져오기 실패</string>\n    <string name=\"error_followers_load\">팔로워 가져오기 실패</string>\n    <string name=\"error_people_load\">people 가져오기 실패</string>\n    <string name=\"error_person_load\">person 가져오기 실패</string>\n    <string name=\"error_gist_file_load\">Gist 파일내용 가져오기 실패</string>\n    <string name=\"error_gists_load\">Gists 가져오기 실패</string>\n    <string name=\"error_issue_load\">이슈 가져오기 실패</string>\n    <string name=\"error_collaborators_load\">멤버 가져오기 실패</string>\n    <string name=\"error_milestones_load\">마일스톤 가져오기 실패</string>\n    <string name=\"error_labels_load\">라벨 가져오기 실패</string>\n    <string name=\"error_bookmarks_load\">책갈피 가져오기 실패</string>\n    <string name=\"error_members_load\">멤버 가져오기 실패</string>\n    <!--  -->\n\n\n    <!-- Loading messages -->\n    <string name=\"loading_gist\">Gist 가져오는중…</string>\n    <string name=\"loading_more_issues\">이슈 가져오는중…</string>\n    <string name=\"loading_issues\">이슈 가져오는중…</string>\n    <string name=\"loading_comments\">댓글 가져오는중…</string>\n    <string name=\"loading_repositories\">저장소 가져오는중…</string>\n    <string name=\"loading_issue\">이슈 가져오는중…</string>\n    <string name=\"loading_news\">소식 가져오는중…</string>\n    <string name=\"loading_followers\">팔로워 가져오는중…</string>\n    <string name=\"loading_people\">가져오는중…</string>\n    <string name=\"loading_gists\">Gists 가져오는중…</string>\n    <string name=\"loading_collaborators\">멤버 가져오는중…</string>\n    <string name=\"loading_milestones\">마일스톤 가져오는중…</string>\n    <string name=\"loading_labels\">라벨 가져오는중…</string>\n    <!--  -->\n\n\n    <!-- Empty messages -->\n    <string name=\"no_bookmarks\">책갈피 없음</string>\n    <string name=\"no_repositories\">저장소 없음</string>\n    <string name=\"no_issues\">이슈없음</string>\n    <string name=\"no_gists\">Gists 없음</string>\n    <string name=\"no_people\">없음</string>\n    <string name=\"no_followers\">팔로워 없음</string>\n    <string name=\"no_members\">멤버 없음</string>\n    <string name=\"no_news\">소식 없음</string>\n    <!--  -->\n\n\n    <!-- Updating messages -->\n    <string name=\"updating_assignee\">담당자 갱신중…</string>\n    <string name=\"updating_issue\">이슈 갱신중…</string>\n    <string name=\"updating_labels\">라벨 갱신중…</string>\n    <string name=\"updating_milestone\">마일스톤 갱신중…</string>\n    <!--  -->\n\n    <string name=\"news\">소식</string>\n    <string name=\"issues\">이슈</string>\n    <string name=\"gists\">Gists</string>\n    <string name=\"find_repositories\">저장소 찾기</string>\n    <string name=\"find_issues\">이슈 찾기</string>\n    <string name=\"search_title\">검색…</string>\n    <string name=\"clear_search_history\">검색기록 삭제</string>\n    <string name=\"search_history_cleared\">검색기록 삭제됨</string>\n    <string name=\"login_activity_authenticating\">로그인중…</string>\n    <string name=\"creating_gist\">Gist 생성중…</string>\n    <string name=\"create\">생성</string>\n    <string name=\"create_gist\">Gist 생성</string>\n    <string name=\"make_public\">모두 공개로 생성함</string>\n    <string name=\"gist_file_name_hint\">file.rb</string>\n    <string name=\"gist\">Gist</string>\n    <string name=\"comments\">댓글</string>\n    <string name=\"files\">파일</string>\n    <string name=\"open\">열기</string>\n    <string name=\"random\">무작위</string>\n    <string name=\"file_name\">파일명</string>\n    <string name=\"file_content\">파일내용</string>\n    <string name=\"new_gist\">새로운 Gist</string>\n    <string name=\"filter\">필터</string>\n    <string name=\"bookmark\">책갈피</string>\n    <string name=\"comment\">댓글</string>\n    <string name=\"delete\">삭제</string>\n    <string name=\"refresh\">새로고침</string>\n    <string name=\"dashboard_issues_title\">이슈 대쉬보드</string>\n    <string name=\"bookmarks\">책갈피</string>\n    <string name=\"gists_title\">Gists</string>\n    <string name=\"issue_title\">Issue #</string>\n    <string name=\"gist_title\">Gist\\u0020</string>\n    <string name=\"filter_issues_title\">이슈 필터</string>\n    <string name=\"create_comment_title\">댓글 작성</string>\n    <string name=\"comment_hint\">내용을 입력해주세요</string>\n    <string name=\"show_more\">더보기…</string>\n    <string name=\"repositories\">저장소</string>\n    <string name=\"issues_title\">이슈</string>\n    <string name=\"edit_labels\">라벨 수정</string>\n    <string name=\"milestone_prefix\">마일스톤:</string>\n    <string name=\"edit_milestone\">마일스톤 수정</string>\n    <string name=\"edit_assignee\">담당자 수정</string>\n    <string name=\"description\">설명</string>\n    <string name=\"gist_description_hint\">안드로이드 앱을 통해 생성한 Gist</string>\n    <string name=\"title\">제목</string>\n    <string name=\"edit\">수정</string>\n    <string name=\"star\">즐겨찾기</string>\n    <string name=\"starring_gist\">Gist 즐겨찾기 등록중…</string>\n    <string name=\"unstar\">즐겨찾기 해제</string>\n    <string name=\"unstarring_gist\">Gist 즐겨찾기 해제중…</string>\n    <string name=\"accounts_label\">계정</string>\n    <string name=\"select_assignee\">담당자 선택</string>\n    <string name=\"select_milestone\">마일스톤 선택</string>\n    <string name=\"select_labels\">라벨 선택</string>\n    <string name=\"no_milestone\">마일스톤 없음</string>\n    <string name=\"unassigned\">담당자 없음</string>\n    <string name=\"assigned\">is assigned</string>\n    <string name=\"no_gists_found\">No Gists found</string>\n    <string name=\"confirm_gist_delete_title\">삭제 확인</string>\n    <string name=\"confirm_gist_delete_message\">Gist를 정말로 삭제하시겠습니까?</string>\n    <string name=\"deleting_gist\">Gist 삭제중…</string>\n    <string name=\"creating_comment\">댓글 등록중…</string>\n    <string name=\"confirm_bookmark_delete_message\">정말로 책갈피에서 삭제하시겠습니까?</string>\n    <string name=\"issue_dashboard\">이슈 대쉬보드</string>\n    <string name=\"new_issue\">신규 이슈</string>\n    <string name=\"anonymous\">익명</string>\n    <string name=\"message_filter_saved\">책갈피에 이슈 필터가 저장됨</string>\n    <string name=\"recent\">최근</string>\n    <string name=\"section_issue_status\">상태:</string>\n    <string name=\"status_open\">열림</string>\n    <string name=\"status_closed\">종결됨</string>\n    <string name=\"section_issue_assigned\">담당자:</string>\n    <string name=\"assignee_anyone\">아무나</string>\n    <string name=\"section_issue_milestone\">마일스톤:</string>\n    <string name=\"none\">없음</string>\n    <string name=\"section_issue_labels\">라벨:</string>\n    <string name=\"log_in\">로그인</string>\n    <string name=\"signup_link\">New to GitHub? &lt;a href=\\\"https://github.com/join\\\">Click here&lt;/a> to sign up</string>\n    <string name=\"connection_failed\">GitHub에 연결할 수 없습니다</string>\n    <string name=\"invalid_login_or_password\">계정 또는 비밀번호를 확인해주세요</string>\n    <string name=\"invalid_password\">비밀번호를 확인해주세요</string>\n    <string name=\"password\">비밀번호</string>\n    <string name=\"login_or_email\">로그인계정 또는 이메일주소</string>\n    <string name=\"followers\">팔로워</string>\n    <string name=\"following\">팔로잉</string>\n    <string name=\"followers_self\">팔로워</string>\n    <string name=\"following_self\">팔로잉</string>\n    <string name=\"members\">멤버</string>\n    <string name=\"closing_issue\">이슈 종결처리중…</string>\n    <string name=\"reopening_issue\">이슈 재오픈중…</string>\n    <string name=\"avatar\">아바타</string>\n    <string name=\"creating_issue\">이슈 생성중…</string>\n    <string name=\"prefix_created\">created\\u0020</string>\n    <string name=\"prefix_updated\">updated\\u0020</string>\n    <string name=\"prefix_opened\">opened\\u0020</string>\n    <string name=\"clear\">비우기</string>\n    <string name=\"open_issues\">미처리된 이슈</string>\n    <string name=\"closed_issues\">종결된 이슈</string>\n    <string name=\"confirm_bookmark_delete_title\">책갈피 삭제</string>\n    <string name=\"save\">저장</string>\n    <string name=\"apply\">적용</string>\n    <string name=\"labels_prefix\">라벨:</string>\n    <string name=\"assignee\">담당자</string>\n    <string name=\"milestone\">마일스톤</string>\n    <string name=\"labels\">라벨</string>\n    <string name=\"issue_confirm_close_message\">해당 이슈를 종결하시겠습니까?</string>\n    <string name=\"issue_confirm_reopen_message\">해당 이슈를 다시 열겠습니까?</string>\n    <string name=\"issue_confirm_close_title\">이슈 닫기</string>\n    <string name=\"issue_confirm_reopen_title\">이슈 재오픈</string>\n    <string name=\"closed\">종결됨</string>\n    <string name=\"no_description_given\">설명없음</string>\n    <string name=\"close\">종결</string>\n    <string name=\"reopen\">Reopen</string>\n    <string name=\"title_invalid_github_url\">GitHub URL이 잘못됨</string>\n    <string name=\"message_invalid_github_url\">이 어플리케이션에서는 해당 URL을 열 수 없음\\n{0}</string>\n    <string name=\"recently_viewed\">최근 열람</string>\n    <string name=\"cancel\">취소</string>\n    <string name=\"authenticator_conflict_title\">앱 충돌</string>\n    <string name=\"authenticator_conflict_message\">다른 앱에서 Github 인증이 설정되었습니다.\\n\\nGitHub 앱을 사용하기 전에 계정 동기화 설정에서 &amp;다른 앱을 지우고 석제해야합니다.</string>\n    <string name=\"opening_repository\">불러오는중 {0}…</string>\n    <string name=\"commit_compare_title\">커밋 비교</string>\n    <string name=\"commit_prefix\">커밋\\u0020</string>\n    <string name=\"parent_prefix\">부모\\u0020</string>\n    <string name=\"authored\">작성된</string>\n    <string name=\"committed\">커밋된</string>\n    <string name=\"diff_line_message\">무엇을 하기 원합니까?</string>\n    <string name=\"comment_on_line\">Comment on line</string>\n    <string name=\"view_entire_file\">전체 파일 보기</string>\n    <string name=\"comparing_commits\">커밋 {0} 비교</string>\n    <string name=\"enable_wrapping\">감추기 가능</string>\n    <string name=\"disable_wrapping\">감추기 불가능</string>\n    <string name=\"code\">코드</string>\n    <string name=\"following_user\">팔로윙…</string>\n    <string name=\"unfollowing_user\">팔로윙 취소…</string>\n    <string name=\"starring_repository\">즐겨찾기…</string>\n    <string name=\"unstarring_repository\">즐겨찾기 해제…</string>\n    <string name=\"navigate_to_user\">Navigate to %s</string>\n    <string name=\"contributions\">%d 커밋</string>\n\n    <!-- Tab titles, should be as short as possible -->\n    <string name=\"tab_repositories\">저장소</string>\n    <string name=\"tab_users\">유저</string>\n    <string name=\"tab_news\">소식</string>\n    <string name=\"tab_following_self\">팔로윙</string>\n    <string name=\"tab_followers_self\">팔로워</string>\n    <string name=\"tab_following\">팔로윙</string>\n    <string name=\"tab_followers\">팔로워</string>\n    <string name=\"tab_members\">멤버</string>\n    <string name=\"tab_code\">코드</string>\n    <string name=\"tab_commits\">커밋</string>\n    <string name=\"tab_issues\">이슈</string>\n    <string name=\"tab_watched\">watched</string>\n    <string name=\"tab_assigned\">assigned</string>\n    <string name=\"tab_created\">created</string>\n    <string name=\"tab_mentioned\">mentioned</string>\n    <string name=\"tab_mine\">mine</string>\n    <string name=\"tab_starred\">즐겨찾기</string>\n    <string name=\"tab_all\">all</string>\n    <!--  -->\n    <string name=\"share\">공유</string>\n    <string name=\"show_password\">비밀번호 보여주기</string>\n    <string name=\"write\">쓰기</string>\n    <string name=\"preview\">미리보기</string>\n    <string name=\"show_raw_markdown\">원본 마크다운 보여주기</string>\n    <string name=\"render_markdown\">마크다운 표현</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-no/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<resources>\n\n    <!-- Error messages -->\n    <string name=\"error_orgs_load\">Lasting av kontoer og organisasjoner feilet</string>\n    <string name=\"error_issues_load\">Lasting av saker feilet</string>\n    <string name=\"error_repos_load\">Lasting av repos feilet</string>\n    <string name=\"error_repo_load\">Lasting av repo feilet</string>\n    <string name=\"error_contributors_load\">Lasting av bidragsytere feilet</string>\n    <string name=\"error_gist_load\">Lasting av Gist feilet</string>\n    <string name=\"error_news_load\">Lasting av nyheter feilet</string>\n    <string name=\"error_followers_load\">Lasting av følgere feilet</string>\n    <string name=\"error_people_load\">Lasting av personer feilet</string>\n    <string name=\"error_person_load\">Lasting av person feilet</string>\n    <string name=\"error_gist_file_load\">Lasting av Gist-fil feilet</string>\n    <string name=\"error_gists_load\">Lasting av Gister feilet</string>\n    <string name=\"error_issue_load\">Lasting av sak feilet</string>\n    <string name=\"error_collaborators_load\">Lasting av medarbeider feilet</string>\n    <string name=\"error_milestones_load\">Lasting av milepæler feilet</string>\n    <string name=\"error_labels_load\">Lasting av etiketter feilet</string>\n    <string name=\"error_bookmarks_load\">Lasting av bokmerker feilet</string>\n    <string name=\"error_members_load\">Lasting av medlemmer feilet</string>\n    <string name=\"error_commits_load\">Lasting av innsjekkinger feilet</string>\n    <string name=\"error_commit_load\">Lasting av innsjekking feilet</string>\n    <string name=\"error_file_load\">Lasting av fil feilet</string>\n    <string name=\"error_code_load\">Lasting av kode feilet</string>\n    <string name=\"error_refs_load\">Lasting av grener og tagger feilet</string>\n    <string name=\"error_following_person\">Fikk ikke til å følge</string>\n    <string name=\"error_unfollowing_person\">Fikk ikke til å avfølge</string>\n    <string name=\"error_checking_following_status\">Sjekking av følge-status feilet</string>\n    <string name=\"error_starring_repository\">Stjernemerking feilet</string>\n    <string name=\"error_unstarring_repository\">Avstjerning feilet</string>\n    <string name=\"error_checking_starring_status\">Sjekk av stjernestatus feilet</string>\n    <string name=\"error_rendering_markdown\">Visning av markdown feilet</string>\n    <string name=\"error_users_search\">Brukersøk feilet</string>\n    <!--  -->\n\n\n    <!-- Loading messages -->\n    <string name=\"loading_gist\">Laster Gist…</string>\n    <string name=\"loading_more_issues\">Laster flere Issues…</string>\n    <string name=\"loading_issues\">Laster saker…</string>\n    <string name=\"loading_comments\">Laster kommentarer…</string>\n    <string name=\"loading_repositories\">Laster repo…</string>\n    <string name=\"loading_issue\">Laster sak…</string>\n    <string name=\"loading_news\">Laster nyheter…</string>\n    <string name=\"loading_followers\">Laster følgere…</string>\n    <string name=\"loading_people\">Laster personer…</string>\n    <string name=\"loading_gists\">Laster Gister…</string>\n    <string name=\"loading_collaborators\">Laster medarbeidere…</string>\n    <string name=\"loading_milestones\">Laster milepæler…</string>\n    <string name=\"loading_labels\">Laster etiketter…</string>\n    <string name=\"loading_commits\">Laster innsjekkinger…</string>\n    <string name=\"loading_files_and_comments\">Laster filer og kommentarer…</string>\n    <string name=\"loading_refs\">Laster grener og tagger…</string>\n    <!--  -->\n\n\n    <!-- Empty messages -->\n    <string name=\"no_bookmarks\">Ingen bokmerker</string>\n    <string name=\"no_repositories\">Ingen repos</string>\n    <string name=\"no_contributors\">Ingen bidragsytere</string>\n    <string name=\"no_issues\">Ingen saker</string>\n    <string name=\"no_gists\">Ingen Gister</string>\n    <string name=\"no_people\">Ingen personer</string>\n    <string name=\"no_followers\">Ingen følgere</string>\n    <string name=\"no_members\">Ingen medlemmer</string>\n    <string name=\"no_news\">Ingen nyheter</string>\n    <string name=\"no_commits\">Ingen innsjekkinger</string>\n    <!--  -->\n\n\n    <!-- Updating messages -->\n    <string name=\"updating_assignee\">Oppdaterer oppdragstaker…</string>\n    <string name=\"updating_issue\">Oppdaterer sak…</string>\n    <string name=\"updating_labels\">Oppdaterer etikett…</string>\n    <string name=\"updating_milestone\">Oppdaterer milepæl…</string>\n    <!--  -->\n\n    <string name=\"news\">Nyheter</string>\n    <string name=\"issues\">Saker</string>\n    <string name=\"gists\">Gister</string>\n    <string name=\"commits\">Innsjekkinger</string>\n    <string name=\"global_search\">GitHub-søk</string>\n    <string name=\"find_repositories\">Finn repos</string>\n    <string name=\"find_issues\">Finn saker</string>\n    <string name=\"search_title\">Søk…</string>\n    <string name=\"clear_search_history\">Tøm historikk</string>\n    <string name=\"search_history_cleared\">Søkehistorikk tømt</string>\n    <string name=\"login_activity_authenticating\">Logger inn…</string>\n    <string name=\"creating_gist\">Oppretter Gist…</string>\n    <string name=\"create\">Opprett</string>\n    <string name=\"create_gist\">Opprett Gist</string>\n    <string name=\"make_public\">Gjør denne Gisten offentlig</string>\n    <string name=\"gist_file_name_hint\">fil.rb</string>\n    <string name=\"gist\">Gist</string>\n    <string name=\"comments\">Kommentarer</string>\n    <string name=\"files\">Filer</string>\n    <string name=\"open\">Åpne</string>\n    <string name=\"random\">Tilfeldig</string>\n    <string name=\"file_name\">Filenavn</string>\n    <string name=\"file_content\">Filinnhold</string>\n    <string name=\"new_gist\">Ny Gist</string>\n    <string name=\"filter\">Filter</string>\n    <string name=\"bookmark\">Bokmerke</string>\n    <string name=\"comment\">Kommentar</string>\n    <string name=\"delete\">Slett</string>\n    <string name=\"refresh\">Oppfrisk</string>\n    <string name=\"dashboard_issues_title\">Saksoversikt</string>\n    <string name=\"bookmarks\">Bokmerker</string>\n    <string name=\"gists_title\">Gister</string>\n    <string name=\"issue_title\">Sak #</string>\n    <string name=\"pull_request_title\">Trekkforespørsel #</string>\n    <string name=\"gist_title\">Gist\\u0020</string>\n    <string name=\"filter_issues_title\">Filtrer saker</string>\n    <string name=\"create_comment_title\">Opprett kommentar</string>\n    <string name=\"comment_hint\">Skriv en kommentar</string>\n    <string name=\"show_more\">Vis mer…</string>\n    <string name=\"repositories\">Repos</string>\n    <string name=\"contributors\">Bidragsytere</string>\n    <string name=\"issues_title\">Saker</string>\n    <string name=\"edit_labels\">Rediger etiketter</string>\n    <string name=\"milestone_prefix\">Milepæl:</string>\n    <string name=\"edit_milestone\">Rediger milepæl</string>\n    <string name=\"edit_assignee\">Rediger oppdragstaker</string>\n    <string name=\"description\">Beskrivelse</string>\n    <string name=\"gist_description_hint\">Gist laget på Android</string>\n    <string name=\"title\">Tittel</string>\n    <string name=\"edit\">Rediger</string>\n    <string name=\"starring_gist\">Stjernemerker Gist…</string>\n    <string name=\"unstarring_gist\">Avstjerner Gist…</string>\n    <string name=\"accounts_label\">Kontoer</string>\n    <string name=\"select_assignee\">Velg oppdragstaker</string>\n    <string name=\"select_milestone\">Velg milepæl</string>\n    <string name=\"select_labels\">Velg etiketter</string>\n    <string name=\"select_ref\">Velg gren eller tagg</string>\n    <string name=\"no_milestone\">Ingen milepæl</string>\n    <string name=\"unassigned\">Ingen oppdragstaker satt</string>\n    <string name=\"assigned\">er på saken</string>\n    <string name=\"no_gists_found\">Ingen Gister funnet</string>\n    <string name=\"confirm_gist_delete_title\">Bekreft sletting</string>\n    <string name=\"confirm_gist_delete_message\">Er du sikker på at du vil slette denne Gisten?</string>\n    <string name=\"deleting_gist\">Sletter Gist…</string>\n    <string name=\"creating_comment\">Oppretter comment…</string>\n    <string name=\"confirm_bookmark_delete_message\">Er du sikker på at du vil slette dette bokmerket?</string>\n    <string name=\"issue_dashboard\">Saksoversikt</string>\n    <string name=\"new_issue\">Ny sak</string>\n    <string name=\"anonymous\">Anonym</string>\n    <string name=\"message_filter_saved\">Saksfilter lagret i bokmerker</string>\n    <string name=\"recently_viewed\">NYLIG SETT PÅ</string>\n    <string name=\"recent\">Nylig</string>\n    <string name=\"recent_remove\">Fjern nylige</string>\n    <string name=\"recent_list_remove\">Fjern fra nylig brukte</string>\n    <string name=\"section_issue_status\">Status:</string>\n    <string name=\"status_open\">Åpen</string>\n    <string name=\"status_closed\">Lukket</string>\n    <string name=\"section_issue_assigned\">Ansvarlig:</string>\n    <string name=\"assignee_anyone\">Hvem som helst</string>\n    <string name=\"section_issue_milestone\">Milepæl:</string>\n    <string name=\"none\">Ingen</string>\n    <string name=\"section_issue_labels\">Etiketter:</string>\n    <string name=\"log_in\">Logg inn</string>\n    <string name=\"signup_link\">Ny på GitHub? &lt;a href=\\\"https://github.com/join\\\">Klikk her&lt;/a> for å bli med</string>\n    <string name=\"signup_link_two_factor_auth\">Usikker på hva du skal gjøre? &lt;a href=\\\"https://help.github.com/articles/about-two-factor-authentication\\\">Få litt hjelp.&lt;/a></string>\n    <string name=\"connection_failed\">Kan ikke koble til GitHub</string>\n    <string name=\"invalid_login_or_password\">Vennligst skriv inn et gyldig brukernavn og passord</string>\n    <string name=\"invalid_password\">Vennligst skriv inn et gyldig passord.</string>\n    <string name=\"password\">Passord</string>\n    <string name=\"username_or_email\">Brukernavn eller epost</string>\n    <string name=\"followers\">Følgere</string>\n    <string name=\"following\">Følger</string>\n    <string name=\"followers_self\">Følgere</string>\n    <string name=\"following_self\">Følger</string>\n    <string name=\"follow\">Følg</string>\n    <string name=\"unfollow\">Av-følg</string>\n    <string name=\"star\">Stjerne</string>\n    <string name=\"unstar\">Avstjerne</string>\n    <string name=\"members\">Medlemmer</string>\n    <string name=\"closing_issue\">Lukker sak…</string>\n    <string name=\"reopening_issue\">Gjenåpner sak…</string>\n    <string name=\"avatar\">Avatar</string>\n    <string name=\"creating_issue\">Oppretter sak…</string>\n    <string name=\"prefix_created\">opprettet\\u0020</string>\n    <string name=\"prefix_updated\">oppdatert\\u0020</string>\n    <string name=\"prefix_opened\">åpnet\\u0020</string>\n    <string name=\"clear\">Tøm</string>\n    <string name=\"pull_request_commits\">Innsjekkinger: %d</string>\n    <string name=\"open_issues\">Åpne saker</string>\n    <string name=\"closed_issues\">Lukkede saker</string>\n    <string name=\"confirm_bookmark_delete_title\">Fjern bokmerke</string>\n    <string name=\"save\">Lagre</string>\n    <string name=\"apply\">Gjør gjeldende</string>\n    <string name=\"labels_prefix\">Etiketter:</string>\n    <string name=\"assignee\">Ansvarlig</string>\n    <string name=\"milestone\">Milepæl</string>\n    <string name=\"labels\">Etiketter</string>\n    <string name=\"issue_confirm_close_message\">Er du sikker på at du vil lukke denne saken?</string>\n    <string name=\"issue_confirm_reopen_message\">Er du sikker på at du vil gjenåpne denne saken?</string>\n    <string name=\"issue_confirm_close_title\">Lukk sak</string>\n    <string name=\"issue_confirm_reopen_title\">Gjenåpn sak</string>\n    <string name=\"closed\">Lukker</string>\n    <string name=\"no_description_given\">Ingen beskrivelse.</string>\n    <string name=\"close\">Lukk</string>\n    <string name=\"reopen\">Gjenåpn</string>\n    <string name=\"title_invalid_github_url\">Ugyldig GitHub-URL</string>\n    <string name=\"message_invalid_github_url\">Den følgende URLen kunne ikke bli åpnet av dette programmet:\\n{0}</string>\n    <string name=\"cancel\">Avbryt</string>\n    <string name=\"authenticator_conflict_title\">App-konflikt</string>\n    <string name=\"authenticator_conflict_message\">Et annet program er allerede satt opp til å autentisere GitHub.\\n\\nDu må fjerne det programmet fra Konto- synkroninseringsinstillinger og avinstallere det før GitHub-appen kan brukes.</string>\n    <string name=\"opening_repository\">Åpner {0}…</string>\n    <string name=\"commit_compare_title\">Sammenlign innsjekkinger</string>\n    <string name=\"commit_prefix\">Innsjekking\\u0020</string>\n    <string name=\"parent_prefix\">Forelder\\u0020</string>\n    <string name=\"authored\">forfattet</string>\n    <string name=\"committed\">innsjekket</string>\n    <string name=\"diff_line_message\">Hva vil du gjøre?</string>\n    <string name=\"comment_on_line\">Kommentér linjen</string>\n    <string name=\"view_entire_file\">Vis hele filen</string>\n    <string name=\"comparing_commits\">Sammenligner {0} innsjekkinger</string>\n    <string name=\"enable_wrapping\">Slå på ombrekking</string>\n    <string name=\"disable_wrapping\">Slå av ombrekking</string>\n    <string name=\"code\">Kode</string>\n    <string name=\"following_user\">Følger…</string>\n    <string name=\"unfollowing_user\">Avfølger…</string>\n    <string name=\"starring_repository\">Stjernemerker…</string>\n    <string name=\"unstarring_repository\">Avstjerner…</string>\n    <string name=\"navigate_to_user\">Navigér til %s</string>\n    <string name=\"contributions\">%d innsjekkinger</string>\n\n    <!-- Tab titles, should be as short as possible -->\n    <string name=\"tab_repositories\">repos</string>\n    <string name=\"tab_users\">brukere</string>\n    <string name=\"tab_news\">nyheter</string>\n    <string name=\"tab_following_self\">følger</string>\n    <string name=\"tab_followers_self\">følgere</string>\n    <string name=\"tab_following\">følger</string>\n    <string name=\"tab_followers\">følgere</string>\n    <string name=\"tab_members\">medlemmer</string>\n    <string name=\"tab_code\">kode</string>\n    <string name=\"tab_commits\">insjekkinger</string>\n    <string name=\"tab_issues\">saker</string>\n    <string name=\"tab_watched\">overvåket</string>\n    <string name=\"tab_assigned\">tilegnet</string>\n    <string name=\"tab_created\">opprettet</string>\n    <string name=\"tab_mentioned\">nevnt</string>\n    <string name=\"tab_mine\">mine</string>\n    <string name=\"tab_starred\">stjernemerket</string>\n    <string name=\"tab_all\">alle</string>\n    <!--  -->\n    <string name=\"share\">Del</string>\n    <string name=\"show_password\">Vis passord</string>\n    <string name=\"write\">Skriv</string>\n    <string name=\"preview\">Forhåndsvisning</string>\n    <string name=\"show_raw_markdown\">Vis rå markdown</string>\n    <string name=\"render_markdown\">Vis markdown</string>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-pl/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<resources>\n\n    <!-- Error messages -->\n    <string name=\"error_orgs_load\">Ładowanie konta i organizacji zakończone błędem</string>\n    <string name=\"error_issues_load\">Ładowanie uwag zakończone błędem</string>\n    <string name=\"error_repos_load\">Ładowanie respozytoriów zakończone błędem</string>\n    <string name=\"error_repo_load\">Ładowanie respozytoru zakończone błędem</string>\n    <string name=\"error_contributors_load\">Ładowanie współpracowaników zakończone błędem</string>\n    <string name=\"error_gist_load\">Ładowanie Gistu zakończone błędem</string>\n    <string name=\"error_news_load\">Ładowanie aktualności zakończone błędem</string>\n    <string name=\"error_followers_load\">Ładowanie obserwujących zakończone błędem</string>\n    <string name=\"error_people_load\">Ładowanie ludzi zakończone błędem</string>\n    <string name=\"error_person_load\">Ładowanie człowieka zakończone błedem</string>\n    <string name=\"error_gist_file_load\">Ładowanie pliku Gist zakończone błędem</string>\n    <string name=\"error_gists_load\">Ładowanie Gistu zakończone błędem</string>\n    <string name=\"error_issue_load\">Ładowanie uwagi zakończone błędem</string>\n    <string name=\"error_collaborators_load\">Ładowanie współpracowników zakończone błędem</string>\n    <string name=\"error_milestones_load\">Ładowanie kamieni milowych zakończone błędem</string>\n    <string name=\"error_labels_load\">Ładowanie etykiet zakończone błędem</string>\n    <string name=\"error_bookmarks_load\">Ładowanie zakładek zakończone błędem</string>\n    <string name=\"error_members_load\">Ładowanie członków zakończone błędem</string>\n    <string name=\"error_commits_load\">Ładowanie popełnień zakończone błędem</string>\n    <string name=\"error_commit_load\">Ładowanie popełnienia zakończone błędem</string>\n    <string name=\"error_file_load\">Ładowanie pliku zakończone błędem</string>\n    <string name=\"error_code_load\">Ładowanie kodu zakończone błędem</string>\n    <string name=\"error_refs_load\">Ładowanie branchy i tagów zakończone błędem</string>\n    <string name=\"error_following_person\">Obserwowanie zakończone błędem</string>\n    <string name=\"error_unfollowing_person\">Nie obserwowanie zakończone błędem</string>\n    <string name=\"error_checking_following_status\">Sprawdzanie statusu obserwowania zakończone błędem</string>\n    <string name=\"error_starring_repository\">Gwiazdkowanie zakończone błędem</string>\n    <string name=\"error_unstarring_repository\">Od gwiazdkowywanie zakończone błędem</string>\n    <string name=\"error_checking_starring_status\">Sprawdzanie statusu gwiazdkowania zakończone błędem</string>\n    <string name=\"error_rendering_markdown\">Renderowanie markdownu zakończone błędem</string>\n    <string name=\"error_users_search\">Wyszukiwanie ludzi zakończone błędem</string>\n    <!--  -->\n\n\n    <!-- Loading messages -->\n    <string name=\"loading_gist\">Ładowanie Gistu…</string>\n    <string name=\"loading_more_issues\">Ładowanie więcej uwag…</string>\n    <string name=\"loading_issues\">Ładowanie uwag…</string>\n    <string name=\"loading_comments\">Ładowanie komentarzy…</string>\n    <string name=\"loading_repositories\">Ładowanie respozytoriów…</string>\n    <string name=\"loading_issue\">Ładowanie uwagi…</string>\n    <string name=\"loading_news\">Ładowanie aktualności…</string>\n    <string name=\"loading_followers\">Ładowanie obserwujących…</string>\n    <string name=\"loading_people\">Ładowanie ludzi…</string>\n    <string name=\"loading_gists\">Ładowanie Gistów…</string>\n    <string name=\"loading_collaborators\">Ładowanie współpracowników…</string>\n    <string name=\"loading_milestones\">Ładowanie kamieni milowych…</string>\n    <string name=\"loading_labels\">Ładowanie etykiet…</string>\n    <string name=\"loading_commits\">Ładowanie popełnień…</string>\n    <string name=\"loading_files_and_comments\">Ładowanie plików i komentarzy…</string>\n    <string name=\"loading_refs\">Ładowanie branchy i tagów…</string>\n    <!--  -->\n\n\n    <!-- Empty messages -->\n    <string name=\"no_bookmarks\">Brak zakładek</string>\n    <string name=\"no_repositories\">Brak respozytoriów</string>\n    <string name=\"no_contributors\">Brak współpracowników</string>\n    <string name=\"no_issues\">Brak uwag</string>\n    <string name=\"no_gists\">Brak Gistów</string>\n    <string name=\"no_people\">Brak ludzi</string>\n    <string name=\"no_followers\">Brak obserwujących</string>\n    <string name=\"no_members\">Brak członków</string>\n    <string name=\"no_news\">Brak aktualności</string>\n    <string name=\"no_commits\">Brak popełnień</string>\n    <!--  -->\n\n\n    <!-- Updating messages -->\n    <string name=\"updating_assignee\">Aktualizowanie…</string>\n    <string name=\"updating_issue\">Aktualizowanie uwagi…</string>\n    <string name=\"updating_labels\">Aktualizowanie etykiet…</string>\n    <string name=\"updating_milestone\">Aktualizowanie kamieni milowych…</string>\n    <!--  -->\n\n    <string name=\"news\">Aktualności</string>\n    <string name=\"issues\">Uwagi</string>\n    <string name=\"gists\">Gisty</string>\n    <string name=\"commits\">Popełnienia</string>\n    <string name=\"global_search\">Wyszukiwanie w GitHub</string>\n    <string name=\"find_repositories\">Szukanie respozytoriów</string>\n    <string name=\"find_issues\">Szukanie uwag</string>\n    <string name=\"search_title\">Szukanie…</string>\n    <string name=\"clear_search_history\">Wyczyść historię</string>\n    <string name=\"search_history_cleared\">Historia wyszukiwań wyczyszczona</string>\n    <string name=\"login_activity_authenticating\">Logowanie…</string>\n    <string name=\"creating_gist\">Tworzenie Gistu…</string>\n    <string name=\"create\">Stwórz</string>\n    <string name=\"create_gist\">Stwórz Gist</string>\n    <string name=\"make_public\">Stwórz to respozytorium jako publiczne</string>\n    <string name=\"gist_file_name_hint\">file.rb</string>\n    <string name=\"gist\">Gist</string>\n    <string name=\"comments\">Komentarze</string>\n    <string name=\"files\">Pliki</string>\n    <string name=\"open\">Otwarte</string>\n    <string name=\"random\">Losowe</string>\n    <string name=\"file_name\">Nazwa pliku</string>\n    <string name=\"file_content\">File Content</string>\n    <string name=\"new_gist\">Nowy Gist</string>\n    <string name=\"filter\">Filtr</string>\n    <string name=\"bookmark\">Zakładka</string>\n    <string name=\"comment\">Komentarz</string>\n    <string name=\"delete\">Usuń</string>\n    <string name=\"refresh\">Odśwież</string>\n    <string name=\"dashboard_issues_title\">Tablica uwag</string>\n    <string name=\"bookmarks\">Zakładki</string>\n    <string name=\"gists_title\">Gisty</string>\n    <string name=\"issue_title\">Uwaga #</string>\n    <string name=\"pull_request_title\">Pull Request #</string>\n    <string name=\"gist_title\">Gist\\u0020</string>\n    <string name=\"filter_issues_title\">Filtr uwag</string>\n    <string name=\"create_comment_title\">Dodaj komentarz</string>\n    <string name=\"comment_hint\">Wpisz komentarz</string>\n    <string name=\"show_more\">Pokaz wiecej…</string>\n    <string name=\"repositories\">Respozytoria</string>\n    <string name=\"contributors\">Współpracownicy</string>\n    <string name=\"issues_title\">Uwagi</string>\n    <string name=\"edit_labels\">Edytuj etykiety</string>\n    <string name=\"milestone_prefix\">Kamień milowy:</string>\n    <string name=\"edit_milestone\">Edytuj kamień milowy</string>\n    <string name=\"edit_assignee\">Edytuj Assignee</string>\n    <string name=\"description\">Opis</string>\n    <string name=\"gist_description_hint\">Android stworzył Gist</string>\n    <string name=\"title\">Tytuł</string>\n    <string name=\"edit\">Edytuj</string>\n    <string name=\"starring_gist\">Gwiazdkowanie Gistu…</string>\n    <string name=\"unstarring_gist\">Od gwiazdkowywanie Gistu…</string>\n    <string name=\"accounts_label\">Konta</string>\n    <string name=\"select_assignee\">Zaznacz Assignee</string>\n    <string name=\"select_milestone\">Zaznacz kamień milowy</string>\n    <string name=\"select_labels\">Zaznacz etykietę</string>\n    <string name=\"select_ref\">Zaznacz Branch lub Tag</string>\n    <string name=\"no_milestone\">Brak kamieni milowych</string>\n    <string name=\"unassigned\">Brak assignów</string>\n    <string name=\"assigned\">jest assigned</string>\n    <string name=\"no_gists_found\">Nie znaleziono żadnych Gistów</string>\n    <string name=\"confirm_gist_delete_title\">Potwierdź usunięcie Gistu</string>\n    <string name=\"confirm_gist_delete_message\">Czy jesteś pewien usunięcia tego Gistu?</string>\n    <string name=\"deleting_gist\">Usuwanie Gistu…</string>\n    <string name=\"creating_comment\">Tworzenie komentarza…</string>\n    <string name=\"confirm_bookmark_delete_message\">Czy jesteś pewien usunięcia tej zakładki?</string>\n    <string name=\"issue_dashboard\">Tablica uwag</string>\n    <string name=\"new_issue\">Nowa uwaga</string>\n    <string name=\"anonymous\">Anonim</string>\n    <string name=\"message_filter_saved\">Filtr uwagi zapisano w zakładkach</string>\n    <string name=\"recently_viewed\">OSTATNIO OGLĄDANE</string>\n    <string name=\"recent\">Ostatni</string>\n    <string name=\"recent_remove\">Usuń ostatni</string>\n    <string name=\"recent_list_remove\">Usuń z ostatnio używanych</string>\n    <string name=\"section_issue_status\">Status:</string>\n    <string name=\"status_open\">Otwarte</string>\n    <string name=\"status_closed\">Zamknięte</string>\n    <string name=\"section_issue_assigned\">Assigned do:</string>\n    <string name=\"assignee_anyone\">Ktoś</string>\n    <string name=\"section_issue_milestone\">Kamień milowy:</string>\n    <string name=\"none\">Pusto</string>\n    <string name=\"section_issue_labels\">Etykiety:</string>\n    <string name=\"log_in\">Zaloguj</string>\n    <string name=\"signup_link\">Nowy na GitHub? &lt;a href=\\\"https://github.com/join\\\">Kliknij tutaj&lt;/a>, aby się zarejestrować</string>\n    <string name=\"signup_link_two_factor_auth\">Nie wiesz co zrobić? &lt;a href=\\\"https://help.github.com/articles/about-two-factor-authentication\\\">Zdobodź więcej informacji na ten temat.&lt;/a></string>\n    <string name=\"connection_failed\">Brak połączenia z GitHubem</string>\n    <string name=\"invalid_login_or_password\">Proszę, podaj prawidłową nazwę użytkownika i hasło</string>\n    <string name=\"invalid_password\">Proszę, podaj prawdziwe hasło.</string>\n    <string name=\"password\">Hasło</string>\n    <string name=\"username_or_email\">Nazwa użytkownika lub e-mail</string>\n    <string name=\"followers\">Obserwują</string>\n    <string name=\"following\">Obserwuje</string>\n    <string name=\"followers_self\">Obserwują</string>\n    <string name=\"following_self\">Obserwuje</string>\n    <string name=\"follow\">Obserwuj</string>\n    <string name=\"unfollow\">Nie obserwuj</string>\n    <string name=\"star\">Gwiazdka</string>\n    <string name=\"unstar\">Usuń gwiazdkę</string>\n    <string name=\"members\">Użytkownicy</string>\n    <string name=\"closing_issue\">Zamykanie uwagi…</string>\n    <string name=\"reopening_issue\">Re-otwieranie uwagi…</string>\n    <string name=\"avatar\">Awatar</string>\n    <string name=\"creating_issue\">Tworzenie uwagi…</string>\n    <string name=\"prefix_created\">utworznono\\u0020</string>\n    <string name=\"prefix_updated\">zaaktualizowano\\u0020</string>\n    <string name=\"prefix_opened\">otwarto\\u0020</string>\n    <string name=\"clear\">Wyczyść</string>\n    <string name=\"pull_request_commits\">Popełnienia: %d</string>\n    <string name=\"open_issues\">Otwórz uwagę</string>\n    <string name=\"closed_issues\">Zamknięto uwagę</string>\n    <string name=\"confirm_bookmark_delete_title\">Usuń zakładkę</string>\n    <string name=\"save\">Zapisz</string>\n    <string name=\"apply\">Zastosuj</string>\n    <string name=\"labels_prefix\">Etykity:</string>\n    <string name=\"assignee\">Assignee</string>\n    <string name=\"milestone\">Kamień milowy</string>\n    <string name=\"labels\">Etykity</string>\n    <string name=\"issue_confirm_close_message\">Czy jest jesteś pewnien zamknięcia tej uwagi?</string>\n    <string name=\"issue_confirm_reopen_message\">Czy jesteś?</string>\n    <string name=\"issue_confirm_close_title\">Zamknij uwagę</string>\n    <string name=\"issue_confirm_reopen_title\">Re-otwórz uwagę</string>\n    <string name=\"closed\">Zamknięto</string>\n    <string name=\"no_description_given\">Nie podano opisu.</string>\n    <string name=\"close\">Zamknij</string>\n    <string name=\"reopen\">Re-open</string>\n    <string name=\"title_invalid_github_url\">Błędny adres URL GitHub</string>\n    <string name=\"message_invalid_github_url\">The following URL could not be opened by this application:\\n{0}</string>\n    <string name=\"cancel\">Cancel</string>\n    <string name=\"authenticator_conflict_title\">App Conflict</string>\n    <string name=\"authenticator_conflict_message\">Another installed app is already configured for PocketHub authentication.\\n\\nYou must remove the other app from the Accounts &amp; sync settings and uninstall it before the PocketHub app can be used.</string>\n    <string name=\"opening_repository\">Otwarto {0}…</string>\n    <string name=\"commit_compare_title\">Połącz popełnienia</string>\n    <string name=\"commit_prefix\">Popełnienie\\u0020</string>\n    <string name=\"parent_prefix\">Parent\\u0020</string>\n    <string name=\"authored\">authored</string>\n    <string name=\"committed\">committed</string>\n    <string name=\"diff_line_message\">What would you like to do?</string>\n    <string name=\"comment_on_line\">Skomentuj na linii</string>\n    <string name=\"view_entire_file\">View entire file</string>\n    <string name=\"comparing_commits\">Comparing {0} commits</string>\n    <string name=\"enable_wrapping\">Włącz zawijanie</string>\n    <string name=\"disable_wrapping\">Wyłącz zawijanie</string>\n    <string name=\"code\">Code</string>\n    <string name=\"following_user\">Following…</string>\n    <string name=\"unfollowing_user\">Unfollowing…</string>\n    <string name=\"starring_repository\">Starring…</string>\n    <string name=\"unstarring_repository\">Unstarring…</string>\n    <string name=\"navigate_to_user\">Nawiguj do %s</string>\n    <string name=\"contributions\">%d popełnień</string>\n\n    <!-- Tab titles, should be as short as possible -->\n    <string name=\"tab_repositories\">repositories</string>\n    <string name=\"tab_users\">users</string>\n    <string name=\"tab_news\">news</string>\n    <string name=\"tab_following_self\">following</string>\n    <string name=\"tab_followers_self\">followers</string>\n    <string name=\"tab_following\">following</string>\n    <string name=\"tab_followers\">followers</string>\n    <string name=\"tab_members\">members</string>\n    <string name=\"tab_code\">code</string>\n    <string name=\"tab_commits\">commits</string>\n    <string name=\"tab_issues\">issues</string>\n    <string name=\"tab_watched\">watched</string>\n    <string name=\"tab_assigned\">assigned</string>\n    <string name=\"tab_created\">created</string>\n    <string name=\"tab_mentioned\">mentioned</string>\n    <string name=\"tab_mine\">mine</string>\n    <string name=\"tab_starred\">gwiazdkowane</string>\n    <string name=\"tab_all\">wszystko</string>\n    <!--  -->\n    <string name=\"share\">Udostępnij</string>\n    <string name=\"show_password\">Pokaż hasło</string>\n    <string name=\"write\">Napisz</string>\n    <string name=\"preview\">Podgląd</string>\n    <string name=\"show_raw_markdown\">Show raw markdown</string>\n    <string name=\"render_markdown\">Render markdown</string>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-pt/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<resources>\n\n    <!-- Mensagens de erro -->\n    <string name=\"error_orgs_load\">O carregamento das contas e organizações falhou</string>\n    <string name=\"error_issues_load\">O carregamento dos incidentes falhou</string>\n    <string name=\"error_repos_load\">O carregamento dos repositórios falhou</string>\n    <string name=\"error_repo_load\">O carregamento do repositório falhou</string>\n    <string name=\"error_gist_load\">O carregamento do Gist falhou</string>\n    <string name=\"error_news_load\">O carregamento das notícias falhou</string>\n    <string name=\"error_followers_load\">O carregamento dos seguidores falhou</string>\n    <string name=\"error_people_load\">O carregamento das pessoas falhou</string>\n    <string name=\"error_person_load\">O carregamento da pessoa falhou</string>\n    <string name=\"error_gist_file_load\">O carregamento do conteúdo do Gist falhou</string>\n    <string name=\"error_gists_load\">O carregamento dos Gists falhou</string>\n    <string name=\"error_issue_load\">O carregamento do incidente falhou</string>\n    <string name=\"error_collaborators_load\">O carregamento dos colaboradores falhou</string>\n    <string name=\"error_milestones_load\">O carregamento das milestones falhou</string>\n    <string name=\"error_labels_load\">O carregamento dos rótulos falhou</string>\n    <string name=\"error_bookmarks_load\">O carregamento dos favoritos falhou</string>\n    <string name=\"error_members_load\">O carregamento dos membros falhou</string>\n    <string name=\"error_commits_load\">O carregamento de commits falhou</string>\n    <string name=\"error_commit_load\">O carregamento do commit falhou</string>\n    <string name=\"error_file_load\">O carregamento do arquivo falhou</string>\n    <string name=\"error_code_load\">O carregamento do código falhou</string>\n    <string name=\"error_refs_load\">O carregamento de branches e rótulos falharam</string>\n    <string name=\"error_following_person\">Falha ao tentar seguir</string>\n    <string name=\"error_unfollowing_person\">Falha ao tentar parar de seguir</string>\n    <string name=\"error_checking_following_status\">Falha ao verificar status de seguidores</string>\n    <string name=\"error_starring_repository\">Falha ao tentar marcar com estrela</string>\n    <string name=\"error_unstarring_repository\">Falha ao tentar desmarcar a estrela</string>\n    <string name=\"error_checking_starring_status\">Falha ao verificar status de estrela</string>\n    <string name=\"error_rendering_markdown\">Falha ao tentar renderizar markdown</string>\n    <string name=\"error_users_search\">Falha ao buscar usuário</string>\n    <!--  -->\n\n\n    <!-- Mensagens de carregamento -->\n    <string name=\"loading_gist\">Carregando Gist…</string>\n    <string name=\"loading_more_issues\">Carregando Mais Incidentes…</string>\n    <string name=\"loading_issues\">Carregando Incidentes…</string>\n    <string name=\"loading_comments\">Carregando Comentários…</string>\n    <string name=\"loading_repositories\">Carregando Repositórios…</string>\n    <string name=\"loading_issue\">Carregando Incidente…</string>\n    <string name=\"loading_news\">Carregando Notícias…</string>\n    <string name=\"loading_followers\">Carregando Seguidores…</string>\n    <string name=\"loading_people\">Carregando Pessoas…</string>\n    <string name=\"loading_gists\">Carregando Gists…</string>\n    <string name=\"loading_collaborators\">Carregando Colaboradores…</string>\n    <string name=\"loading_milestones\">Carregando Milestones…</string>\n    <string name=\"loading_labels\">Carregando Rótulos…</string>\n    <string name=\"loading_commits\">Carregando Commits…</string>\n    <string name=\"loading_files_and_comments\">Carregando Arquivos &amp; Comentários…</string>\n    <string name=\"loading_refs\">Carregando Branches &amp; Rótulos…</string>\n    <!--  -->\n\n\n    <!-- Mensagens \"vazias\" -->\n    <string name=\"no_bookmarks\">Nenhum Favorito</string>\n    <string name=\"no_repositories\">Nenhum Repositório</string>\n    <string name=\"no_contributors\">Nenhum contribuidor</string>\n    <string name=\"no_issues\">Nenhum Incidente</string>\n    <string name=\"no_gists\">Nenhum Gist</string>\n    <string name=\"no_people\">Nenhuma Pessoa</string>\n    <string name=\"no_followers\">Nenhum Seguidor</string>\n    <string name=\"no_members\">Nenhum Membro</string>\n    <string name=\"no_news\">Nenhuma Notícia</string>\n    <string name=\"no_commits\">Nenhum Commit</string>\n    <!--  -->\n\n\n    <!-- Mensagens de atualização -->\n    <string name=\"updating_assignee\">Atualizando Responsável…</string>\n    <string name=\"updating_issue\">Atualizando Incidente…</string>\n    <string name=\"updating_labels\">Atualizando Rótulos…</string>\n    <string name=\"updating_milestone\">Atualizando Milestone…</string>\n    <!--  -->\n\n    <string name=\"news\">Notícias</string>\n    <string name=\"issues\">Incidentes</string>\n    <string name=\"gists\">Gists</string>\n    <string name=\"commits\">Commits</string>\n    <string name=\"find_repositories\">Buscar Repositórios</string>\n    <string name=\"find_issues\">Buscar Incidentes</string>\n    <string name=\"search_title\">Buscar…</string>\n    <string name=\"clear_search_history\">Limpar Histórico</string>\n    <string name=\"search_history_cleared\">Histório de busca limpo</string>\n    <string name=\"login_activity_authenticating\">Entrando…</string>\n    <string name=\"creating_gist\">Criando Gist…</string>\n    <string name=\"create\">Criar</string>\n    <string name=\"create_gist\">Criar Gist</string>\n    <string name=\"make_public\">Tornar este Gist público</string>\n    <string name=\"gist_file_name_hint\">file.rb</string>\n    <string name=\"gist\">Gist</string>\n    <string name=\"comments\">Comentários</string>\n    <string name=\"files\">Arquivos</string>\n    <string name=\"open\">Abrir</string>\n    <string name=\"random\">Aleatório</string>\n    <string name=\"file_name\">Nome do Arquivo</string>\n    <string name=\"file_content\">Conteúdo do Arquivo</string>\n    <string name=\"new_gist\">Novo Gist</string>\n    <string name=\"filter\">Filtrar</string>\n    <string name=\"bookmark\">Favorito</string>\n    <string name=\"comment\">Comentário</string>\n    <string name=\"delete\">Excluir</string>\n    <string name=\"refresh\">Atualizar</string>\n    <string name=\"dashboard_issues_title\">Painel de Incidentes</string>\n    <string name=\"bookmarks\">Favoritos</string>\n    <string name=\"gists_title\">Gists</string>\n    <string name=\"issue_title\">Incidente #</string>\n    <string name=\"pull_request_title\">Pull Request #</string>\n    <string name=\"gist_title\">Gist\\u0020</string>\n    <string name=\"filter_issues_title\">Filtrar Incidentes</string>\n    <string name=\"create_comment_title\">Criar Comentário</string>\n    <string name=\"comment_hint\">Entre um comentário</string>\n    <string name=\"show_more\">Mostrar Mais…</string>\n    <string name=\"repositories\">Repositórios</string>\n    <string name=\"contributors\">Contribuidores</string>\n    <string name=\"issues_title\">Incidentes</string>\n    <string name=\"edit_labels\">Editar Rótulos</string>\n    <string name=\"milestone_prefix\">Milestone:</string>\n    <string name=\"edit_milestone\">Editar Milestone</string>\n    <string name=\"edit_assignee\">Editar Responsável</string>\n    <string name=\"description\">Descrição</string>\n    <string name=\"gist_description_hint\">Gist criando pelo Android</string>\n    <string name=\"title\">Título</string>\n    <string name=\"edit\">Editar</string>\n    <string name=\"star\">Estrela</string>\n    <string name=\"starring_gist\">Colocando estrela no Gist…</string>\n    <string name=\"unstar\">Remover estrela</string>\n    <string name=\"unstarring_gist\">Remvendo estrela do Gist…</string>\n    <string name=\"accounts_label\">Contas</string>\n    <string name=\"select_assignee\">Selecionar Responsável</string>\n    <string name=\"select_milestone\">Selecionar Milestone</string>\n    <string name=\"select_labels\">Selecionar Rótulos</string>\n    <string name=\"select_ref\">Selecionar Branch ou Rótulo</string>\n    <string name=\"no_milestone\">Nenhuma milestone</string>\n    <string name=\"unassigned\">Nenhum responsável</string>\n    <string name=\"assigned\">é o responsável</string>\n    <string name=\"no_gists_found\">Nenhum Gist encontrado</string>\n    <string name=\"confirm_gist_delete_title\">Confirmar Exclusão</string>\n    <string name=\"confirm_gist_delete_message\">Você tem certeza de que quer excluir este Gist?</string>\n    <string name=\"deleting_gist\">Excluindo Gist…</string>\n    <string name=\"creating_comment\">Criando comentário…</string>\n    <string name=\"confirm_bookmark_delete_message\">Você tem certeza de que quer excluir este favorito?</string>\n    <string name=\"issue_dashboard\">Painel de Incidentes</string>\n    <string name=\"new_issue\">Novo Incidente</string>\n    <string name=\"anonymous\">Anônimo</string>\n    <string name=\"message_filter_saved\">Filtro de incidente salvo nos favoritos</string>\n    <string name=\"recent\">Recentes</string>\n    <string name=\"recent_remove\">Remover Recentes</string>\n    <string name=\"recent_list_remove\">Remover os usados recentemente</string>\n    <string name=\"section_issue_status\">Estado:</string>\n    <string name=\"status_open\">Aberto</string>\n    <string name=\"status_closed\">Fechado</string>\n    <string name=\"section_issue_assigned\">Responsável:</string>\n    <string name=\"assignee_anyone\">Qualquer pessoa</string>\n    <string name=\"section_issue_milestone\">Milestone:</string>\n    <string name=\"none\">Nenhum</string>\n    <string name=\"section_issue_labels\">Rótulos:</string>\n    <string name=\"log_in\">Entrar</string>\n    <string name=\"signup_link\">Novo no GitHub? &lt;a href=\\\"https://github.com/join\\\">Clique aqui&lt;/a> para se cadastrar</string>\n    <string name=\"connection_failed\">Não foi possível conectar ao GitHub</string>\n    <string name=\"invalid_login_or_password\">Por favor, digite um login e senha válidos.</string>\n    <string name=\"invalid_password\">Por favor, digite uma senha válida.</string>\n    <string name=\"password\">Senha</string>\n    <string name=\"login_or_email\">Login ou Email</string>\n    <string name=\"followers\">Seguidores</string>\n    <string name=\"following\">Seguindo</string>\n    <string name=\"followers_self\">Seguidores</string>\n    <string name=\"following_self\">Seguindo</string>\n    <string name=\"follow\">Seguir</string>\n    <string name=\"unfollow\">Deixar de seguir</string>\n    <string name=\"members\">Membros</string>\n    <string name=\"closing_issue\">Fechando Incidente…</string>\n    <string name=\"reopening_issue\">Reabrindo Incidente…</string>\n    <string name=\"avatar\">Avatar</string>\n    <string name=\"creating_issue\">Criando Incidente…</string>\n    <string name=\"prefix_created\">criado\\u0020</string>\n    <string name=\"prefix_updated\">atualizado\\u0020</string>\n    <string name=\"prefix_opened\">aberto\\u0020</string>\n    <string name=\"clear\">Limpar</string>\n    <string name=\"pull_request_commits\">Commits: %d</string>\n    <string name=\"open_issues\">Incidentes Abertos</string>\n    <string name=\"closed_issues\">Incidentes Fechados</string>\n    <string name=\"confirm_bookmark_delete_title\">Excluir Favorito</string>\n    <string name=\"save\">Salvar</string>\n    <string name=\"apply\">Aplicar</string>\n    <string name=\"labels_prefix\">Rótulos:</string>\n    <string name=\"assignee\">Responsável</string>\n    <string name=\"milestone\">Milestone</string>\n    <string name=\"labels\">Rótulos</string>\n    <string name=\"issue_confirm_close_message\">Você tem certeza de que quer fechar este incidente?</string>\n    <string name=\"issue_confirm_reopen_message\">Você tem certeza de que quer reabrir este incidente?</string>\n    <string name=\"issue_confirm_close_title\">Fechar Incidente</string>\n    <string name=\"issue_confirm_reopen_title\">Reabrir Incidente</string>\n    <string name=\"closed\">Fechado</string>\n    <string name=\"no_description_given\">Sem descrição.</string>\n    <string name=\"close\">Fechar</string>\n    <string name=\"reopen\">Reabrir</string>\n    <string name=\"title_invalid_github_url\">URL do GitHub Inválida</string>\n    <string name=\"message_invalid_github_url\">A seguinte URL não pôde ser aberta pela aplicação:\\n{0}</string>\n    <string name=\"recently_viewed\">VISTOS RECENTEMENTE</string>\n    <string name=\"cancel\">Cancelar</string>\n    <string name=\"authenticator_conflict_title\">Conflito de Aplicação</string>\n    <string name=\"authenticator_conflict_message\">Outro aplicativo instalado já está configurado para autenticar no GitHub.\\n\\nVocê deve remover a outra aplicação das configurações de Conta e Sincronização e a desinstalar para poder usar a aplicação do GitHub.</string>\n    <string name=\"opening_repository\">Abrindo {0}…</string>\n    <string name=\"commit_compare_title\">Comparar Commit</string>\n    <string name=\"commit_prefix\">Commit\\u0020</string>\n    <string name=\"parent_prefix\">Parent\\u0020</string>\n    <string name=\"authored\">autoria</string>\n    <string name=\"committed\">commitado</string>\n    <string name=\"diff_line_message\">O que você gostaria de fazer?</string>\n    <string name=\"comment_on_line\">Comente na linha</string>\n    <string name=\"view_entire_file\">Ver arquivo completo</string>\n    <string name=\"comparing_commits\">Comparando {0} commits</string>\n    <string name=\"enable_wrapping\">Ativar envolvimento</string>\n    <string name=\"disable_wrapping\">Desabilitar envolvimento</string>\n    <string name=\"code\">Código</string>\n    <string name=\"following_user\">Seguindo…</string>\n    <string name=\"unfollowing_user\">Deixando de seguir…</string>\n    <string name=\"starring_repository\">Marcando estrela…</string>\n    <string name=\"unstarring_repository\">Desmarcando estrela…</string>\n    <string name=\"navigate_to_user\">Navegando para %s</string>\n    <string name=\"contributions\">%d commits</string>\n\n    <!-- Tab titles, should be as short as possible -->\n    <string name=\"tab_repositories\">repositórios</string>\n    <string name=\"tab_users\">usuários</string>\n    <string name=\"tab_news\">notícias</string>\n    <string name=\"tab_following_self\">seguindo</string>\n    <string name=\"tab_followers_self\">seguidores</string>\n    <string name=\"tab_following\">seguindo</string>\n    <string name=\"tab_followers\">seguidores</string>\n    <string name=\"tab_members\">membros</string>\n    <string name=\"tab_code\">código</string>\n    <string name=\"tab_commits\">commits</string>\n    <string name=\"tab_issues\">incidentes</string>\n    <string name=\"tab_watched\">observado</string>\n    <string name=\"tab_assigned\">atribuído</string>\n    <string name=\"tab_created\">criado</string>\n    <string name=\"tab_mentioned\">mencionado</string>\n    <string name=\"tab_mine\">meu</string>\n    <string name=\"tab_starred\">estrela</string>\n    <string name=\"tab_all\">todos</string>\n    <!--  -->\n    <string name=\"share\">Compartilhado</string>\n    <string name=\"show_password\">Mostrar senha</string>\n    <string name=\"write\">Escrever</string>\n    <string name=\"preview\">Prever</string>\n    <string name=\"show_raw_markdown\">Mostrar markdown puro</string>\n    <string name=\"render_markdown\">Renderizar markdown</string>\n    <string name=\"are_you_sure\">Você está absolutamente certo?</string>\n    <string name=\"code_authentication_failed\">Falha de autenticação! Código de verificação incorreto</string>\n    <string name=\"confirm_comment_delete_message\">Tem certeza de que deseja apagar este comentário?</string>\n    <string name=\"confirm_comment_delete_title\">Apagar Comentário</string>\n    <string name=\"copy_hash\">Copiar hash</string>\n    <string name=\"delete_successful\">Repositório excluído</string>\n    <string name=\"deleting_comment\">Apagando comentário…</string>\n    <string name=\"deleting_repository\">Excluindo…</string>\n    <string name=\"editing_comment\">Editando comentário…</string>\n    <string name=\"error_contributors_load\">Carregamento dos contribuidores falhou</string>\n    <string name=\"error_deleting_repository\">Exclusão falhou</string>\n    <string name=\"global_search\">Pesquisa GitHub</string>\n    <string name=\"not_sure\">NÃO TENHO CERTEZA</string>\n    <string name=\"signup_link_two_factor_auth\">Não tenho certeza o que fazer? &lt;a href=\\\"https://help.github.com/articles/about-two-factor-authentication\\\">Obter alguma ajuda.&lt;/a></string>\n    <string name=\"unexpected_bad_things\">Esta ação NÃO poderá ser desfeita. Isto irá apagar permanentemente o repositório, wiki, questões e comentários, e remover todas as associações dos colaboradores.</string>\n    <string name=\"username_or_email\">Nome do usuário ou Email</string>\n    <string name=\"delete_cap\">APAGAR</string>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-ro/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Copyright (c) 2015 PocketHub\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<resources>\n\n    <!-- Error messages -->\n    <string name=\"error_orgs_load\">Încărcarea contului și organizațiilor a eșuat</string>\n    <string name=\"error_issues_load\">Încărcarea problemelor a eșuat</string>\n    <string name=\"error_repos_load\">Încărcarea depozitelor a eșuat</string>\n    <string name=\"error_repo_load\">Încărcarea depozitului a eșuat</string>\n    <string name=\"error_contributors_load\">Încărcarea contribuitorilor a eșuat</string>\n    <string name=\"error_gist_load\">Încărcarea Gist-ului a eșuat</string>\n    <string name=\"error_news_load\">Încărcarea noutăților a eșuat</string>\n    <string name=\"error_followers_load\">Încărcarea urmăritorilor a eșuat</string>\n    <string name=\"error_people_load\">Încărcarea oamenilor a eșuat</string>\n    <string name=\"error_person_load\">Încărcarea persoanei a eșuat</string>\n    <string name=\"error_gist_file_load\">Încărcarea fișierului Gist a eșuat</string>\n    <string name=\"error_gists_load\">Încărcarea Gist-urilor a eșuat</string>\n    <string name=\"error_issue_load\">Încărcarea problemei a eșuat</string>\n    <string name=\"error_collaborators_load\">Încărcarea colaboratorilor a eșuat</string>\n    <string name=\"error_milestones_load\">Încărcarea bornelor a eșuat</string>\n    <string name=\"error_labels_load\">Încărcarea etichetelor a eșuat</string>\n    <string name=\"error_bookmarks_load\">Încărcarea semnelor de carte a eșuat</string>\n    <string name=\"error_members_load\">Încărcarea membrilor a eșuat</string>\n    <string name=\"error_commits_load\">Încărcarea înregistrărilor a eșuat</string>\n    <string name=\"error_commit_load\">Încărcarea înregistrării a eșuat</string>\n    <string name=\"error_file_load\">Încărcarea fișierului a eșuat</string>\n    <string name=\"error_code_load\">Încărcarea codului a eșuat</string>\n    <string name=\"error_refs_load\">Încărcarea ramurilor și etichetelor a eșuat</string>\n    <string name=\"error_following_person\">Urmărirea persoanei a eșuat</string>\n    <string name=\"error_unfollowing_person\">Încetarea urmăririi persoanei a eșuat</string>\n    <string name=\"error_checking_following_status\">Verificarea stării de urmăririre a eșuat</string>\n    <string name=\"error_starring_repository\">Aprecierea a eșuat</string>\n    <string name=\"error_unstarring_repository\">Încetarea aprecierii a eșuat</string>\n    <string name=\"error_forking_repository\">Ramificarea a eșuat</string>\n    <string name=\"error_deleting_repository\">Ștergerea a eșuat</string>\n    <string name=\"error_checking_starring_status\">Verificarea stării de apreciere a eșuat</string>\n    <string name=\"error_rendering_markdown\">Randarea markdown-ului a eșuat</string>\n    <string name=\"error_users_search\">Căutarea utilizatorilor a eșuat</string>\n    <!--  -->\n\n\n    <!-- Loading messages -->\n    <string name=\"loading_gist\">Încărcare Gist…</string>\n    <string name=\"loading_more_issues\">Încărcare mai multe probleme…</string>\n    <string name=\"loading_issues\">Încărcare probleme…</string>\n    <string name=\"loading_comments\">Încărcare comentarii…</string>\n    <string name=\"loading_repositories\">Încărcare depozite…</string>\n    <string name=\"loading_issue\">Încărcare problemă…</string>\n    <string name=\"loading_news\">Încărcare noutăți…</string>\n    <string name=\"loading_followers\">Încărcare urmăritori…</string>\n    <string name=\"loading_people\">Încărcare oameni…</string>\n    <string name=\"loading_gists\">Încărcare Gist-uri…</string>\n    <string name=\"loading_collaborators\">Încărcare colaboratori…</string>\n    <string name=\"loading_milestones\">Încărcare borne…</string>\n    <string name=\"loading_labels\">Încărcare etichete…</string>\n    <string name=\"loading_commits\">Încărcare înregistrări…</string>\n    <string name=\"loading_files_and_comments\">Se încarcă fișierele și comentariile…</string>\n    <string name=\"loading_refs\">Încărcare ramuri și etichete…</string>\n    <!--  -->\n\n\n    <!-- Empty messages -->\n    <string name=\"no_bookmarks\">Nu există semne de carte</string>\n    <string name=\"no_repositories\">Nu sunt depozite</string>\n    <string name=\"no_contributors\">Nu există contribuitori</string>\n    <string name=\"no_issues\">Nu sunt probleme</string>\n    <string name=\"no_gists\">Nu sunt Gist-uri</string>\n    <string name=\"no_people\">Nu sunt oameni</string>\n    <string name=\"no_followers\">Nu sunt urmăritori</string>\n    <string name=\"no_members\">Nu există membrii</string>\n    <string name=\"no_news\">Nu sunt noutăți</string>\n    <string name=\"no_commits\">Nu există înregistrări</string>\n    <!--  -->\n\n\n    <!-- Updating messages -->\n    <string name=\"updating_assignee\">Actualizare reprezentant…</string>\n    <string name=\"updating_issue\">Actualizare problemă…</string>\n    <string name=\"updating_labels\">Actualizare etichete…</string>\n    <string name=\"updating_milestone\">Actualizare bornă…</string>\n    <!--  -->\n\n    <string name=\"home\">Acasă</string>\n    <string name=\"news\">Noutăți</string>\n    <string name=\"issues\">Probleme</string>\n    <string name=\"gists\">Gist-uri</string>\n    <string name=\"commits\">Înregistrări</string>\n    <string name=\"global_search\">Căutare pe GitHub</string>\n    <string name=\"find_repositories\">Găsește depozite</string>\n    <string name=\"find_issues\">Găsește probleme</string>\n    <string name=\"search_title\">Caută…</string>\n    <string name=\"clear_search_history\">Șterge istoric</string>\n    <string name=\"search_history_cleared\">Istoricul de căutare a fost șters</string>\n    <string name=\"login_activity_authenticating\">Autentificare…</string>\n    <string name=\"creating_gist\">Se creează Gist…</string>\n    <string name=\"create\">Creează</string>\n    <string name=\"create_gist\">Creează Gist</string>\n    <string name=\"make_public\">Publică acest Gist</string>\n    <string name=\"gist_file_name_hint\">file.rb</string>\n    <string name=\"gist\">Gist</string>\n    <string name=\"comments\">Comentarii</string>\n    <string name=\"files\">Fișiere</string>\n    <string name=\"open\">Deschide</string>\n    <string name=\"random\">Aleator</string>\n    <string name=\"file_name\">Nume fișier</string>\n    <string name=\"file_content\">Conținut fișier</string>\n    <string name=\"new_gist\">Gist nou</string>\n    <string name=\"filter\">Filtru</string>\n    <string name=\"bookmark\">Semn de carte</string>\n    <string name=\"comment\">Comentariu</string>\n    <string name=\"delete\">Șterge</string>\n    <string name=\"delete_cap\">ȘTERGE</string>\n    <string name=\"refresh\">Împrospătează</string>\n    <string name=\"dashboard_issues_title\">Tablou de bord problemă</string>\n    <string name=\"bookmarks\">Semne de carte</string>\n    <string name=\"gists_title\">Gist-uri</string>\n    <string name=\"issue_title\">Problema #</string>\n    <string name=\"pull_request_title\">Cerere #</string>\n    <string name=\"gist_title\">Gist\\u0020</string>\n    <string name=\"filter_issues_title\">Filtrează problemele</string>\n    <string name=\"create_comment_title\">Creează comentariu</string>\n    <string name=\"comment_hint\">Introdu un comentariu</string>\n    <string name=\"show_more\">Arată mai mult…</string>\n    <string name=\"repositories\">Depozite</string>\n    <string name=\"contributors\">Contribuitori</string>\n    <string name=\"issues_title\">Probleme</string>\n    <string name=\"edit_labels\">Editează etichete</string>\n    <string name=\"milestone_prefix\">Borna:</string>\n    <string name=\"edit_milestone\">Editează borna</string>\n    <string name=\"edit_assignee\">Editează reprezentantul</string>\n    <string name=\"description\">Descriere</string>\n    <string name=\"gist_description_hint\">Gist creat de Android</string>\n    <string name=\"title\">Titlu</string>\n    <string name=\"edit\">Editează</string>\n    <string name=\"starring_gist\">Apreciere Gist…</string>\n    <string name=\"unstarring_gist\">Încetare apreciere Gist…</string>\n    <string name=\"accounts_label\">Conturi</string>\n    <string name=\"select_assignee\">Selectează reprezentant</string>\n    <string name=\"select_milestone\">Selectează bornă</string>\n    <string name=\"select_labels\">Selectează etichete</string>\n    <string name=\"select_ref\">Selectează ramura sau eticheta</string>\n    <string name=\"no_milestone\">Nu există bornă</string>\n    <string name=\"unassigned\">Niciun reprezentant</string>\n    <string name=\"assigned\">este desemnat</string>\n    <string name=\"no_gists_found\">Nu s-au găsit Gist-uri</string>\n    <string name=\"confirm_gist_delete_title\">Confirmă ștergerea</string>\n    <string name=\"confirm_gist_delete_message\">Ești sigur că vrei să ștergi acest Gist?</string>\n    <string name=\"deleting_gist\">Ștergere Gist…</string>\n    <string name=\"creating_comment\">Creare comentariu…</string>\n    <string name=\"editing_comment\">Editare comentariu…</string>\n    <string name=\"deleting_comment\">Ștergere comentariu…</string>\n    <string name=\"confirm_comment_delete_title\">Eliminare comentariu</string>\n    <string name=\"confirm_comment_delete_message\">Ești sigur că vrei să ștergi comentariul?</string>\n    <string name=\"confirm_bookmark_delete_message\">Ești sigur că vrei să ștergi semnul de carte?</string>\n    <string name=\"issue_dashboard\">Tablou de bord problemă</string>\n    <string name=\"new_issue\">Deschide Problemă</string>\n    <string name=\"anonymous\">Anonim</string>\n    <string name=\"message_filter_saved\">Filtrul preblemei a fost salvat în semnele de carte</string>\n    <string name=\"recently_viewed\">VIZUALIZATE RECENT</string>\n    <string name=\"recent\">Recent</string>\n    <string name=\"recent_remove\">Ștergere Recent</string>\n    <string name=\"recent_list_remove\">Șterge din utilizate recent</string>\n    <string name=\"section_issue_status\">Status:</string>\n    <string name=\"status_open\">Deschide</string>\n    <string name=\"status_closed\">Închis</string>\n    <string name=\"section_issue_assigned\">Repartizat la:</string>\n    <string name=\"assignee_anyone\">Oricine</string>\n    <string name=\"section_issue_milestone\">Borna:</string>\n    <string name=\"none\">Niciunul</string>\n    <string name=\"section_issue_labels\">Etichete:</string>\n    <string name=\"log_in\">Autentifică-te</string>\n    <string name=\"signup_link\">Ești nou la GitHub? &lt;a href=\\\"https://github.com/join\\\">Click aici&lt;/a> pentru înscriere</string>\n    <string name=\"signup_link_two_factor_auth\">Nu esti sigur ce să faci &lt;a href=\\\"https://help.github.com/articles/about-two-factor-authentication\\\">Obține ajutor.&lt;/a></string>\n    <string name=\"connection_failed\">Conectarea la GitHub a eșuat</string>\n    <string name=\"code_authentication_failed\">Autentificarea a eșuat! Cod de verificare incorect.</string>\n    <string name=\"invalid_login_or_password\">Te rugăm să introduci date valide de autentificare</string>\n    <string name=\"invalid_password\">Te rugăm să introduci o parolă validă.</string>\n    <string name=\"password\">Parolă</string>\n    <string name=\"username_or_email\">Nume de utilizator sau email</string>\n    <string name=\"followers\">Urmăritori</string>\n    <string name=\"following\">Urmărește</string>\n    <string name=\"followers_self\">Urmăritori</string>\n    <string name=\"following_self\">Urmărești</string>\n    <string name=\"follow\">Urmărește</string>\n    <string name=\"unfollow\">Nu mai urmării</string>\n    <string name=\"star\">Apreciază</string>\n    <string name=\"unstar\">Încetare apreciere</string>\n    <string name=\"fork\">Ramifică</string>\n    <string name=\"members\">Membrii</string>\n    <string name=\"closing_issue\">Închidere problemă…</string>\n    <string name=\"reopening_issue\">Redeschidere problemă…</string>\n    <string name=\"avatar\">Avatar</string>\n    <string name=\"creating_issue\">Creare problemă…</string>\n    <string name=\"prefix_created\">creat\\u0020</string>\n    <string name=\"prefix_updated\">actualizat\\u0020</string>\n    <string name=\"prefix_opened\">deschis\\u0020</string>\n    <string name=\"clear\">Curăța</string>\n    <string name=\"pull_request_commits\">Înregistrări: %d</string>\n    <string name=\"open_issues\">Probleme deschise</string>\n    <string name=\"closed_issues\">Probleme închise</string>\n    <string name=\"confirm_bookmark_delete_title\">Înlătură semn de carte</string>\n    <string name=\"save\">Salvează</string>\n    <string name=\"apply\">Aplică</string>\n    <string name=\"labels_prefix\">Etichete:</string>\n    <string name=\"assignee\">Reprezentant</string>\n    <string name=\"milestone\">Bornă</string>\n    <string name=\"labels\">Etichete</string>\n    <string name=\"issue_confirm_close_message\">Ești sigur că vrei să închizi această problemă?</string>\n    <string name=\"issue_confirm_reopen_message\">Ești sigur că vrei să redeschizi această problemă?</string>\n    <string name=\"issue_confirm_close_title\">Închide problemă</string>\n    <string name=\"issue_confirm_reopen_title\">Redeschide problemă</string>\n    <string name=\"closed\">Închis</string>\n    <string name=\"no_description_given\">Fără descriere.</string>\n    <string name=\"close\">Închide</string>\n    <string name=\"reopen\">Redeschide</string>\n    <string name=\"title_invalid_github_url\">URL GitHub invalid</string>\n    <string name=\"message_invalid_github_url\">URL-ul nu a putut fi deschis de aplicație:\\n{0}</string>\n    <string name=\"cancel\">Anulează</string>\n    <string name=\"not_sure\">NU SUNT SIGUR</string>\n    <string name=\"authenticator_conflict_title\">Conflict Aplicație</string>\n    <string name=\"authenticator_conflict_message\">O altă aplicație instalată este deja configurată pentru autentificarea pe GitHub.\\n\\nTrebuie să elimini acea aplicație din setările pentru Conturi și sincronizare și să o dezinstalezi înainte ca aplicația GitHub să poată fi folosită.</string>\n    <string name=\"opening_repository\">Se deschide {0}…</string>\n    <string name=\"commit_compare_title\">Compară înregistrările</string>\n    <string name=\"commit_prefix\">Commit\\u0020</string>\n    <string name=\"parent_prefix\">Parent\\u0020</string>\n    <string name=\"authored\">a scris</string>\n    <string name=\"committed\">committed</string>\n    <string name=\"diff_line_message\">Ce ai dori să faci?</string>\n    <string name=\"comment_on_line\">Comentează această linie</string>\n    <string name=\"view_entire_file\">Vezi întregul fișier</string>\n    <string name=\"comparing_commits\">Se compară {0} înregistrări</string>\n    <string name=\"enable_wrapping\">Activează wrapping</string>\n    <string name=\"disable_wrapping\">Dezactivează wrapping</string>\n    <string name=\"code\">Cod</string>\n    <string name=\"following_user\">Urmărire…</string>\n    <string name=\"unfollowing_user\">Nu mai urmăriți…</string>\n    <string name=\"starring_repository\">Apreciere…</string>\n    <string name=\"unstarring_repository\">Încetare apreciere…</string>\n    <string name=\"forking_repository\">Ramificând…</string>\n    <string name=\"deleting_repository\">Ștergere…</string>\n    <string name=\"navigate_to_user\">Navighează către %s</string>\n    <string name=\"contributions\">%d înregistrări</string>\n\n    <!-- Tab titles, should be as short as possible -->\n    <string name=\"tab_repositories\">depozite</string>\n    <string name=\"tab_users\">utilizatori</string>\n    <string name=\"tab_news\">noutăți</string>\n    <string name=\"tab_following_self\">urmărești</string>\n    <string name=\"tab_followers_self\">urmăritori</string>\n    <string name=\"tab_following\">urmărește</string>\n    <string name=\"tab_followers\">urmăritori</string>\n    <string name=\"tab_members\">membrii</string>\n    <string name=\"tab_code\">cod</string>\n    <string name=\"tab_commits\">înregistrări</string>\n    <string name=\"tab_issues\">probleme</string>\n    <string name=\"tab_watched\">urmărite</string>\n    <string name=\"tab_assigned\">atribuit</string>\n    <string name=\"tab_created\">creat</string>\n    <string name=\"tab_mentioned\">menționat</string>\n    <string name=\"tab_mine\">ale mele</string>\n    <string name=\"tab_starred\">apreciate</string>\n    <string name=\"tab_all\">tot</string>\n    <!--  -->\n    <string name=\"share\">Distribuie</string>\n    <string name=\"show_password\">Arată parola</string>\n    <string name=\"write\">Scrie</string>\n    <string name=\"preview\">Previzualizează</string>\n    <string name=\"show_raw_markdown\">Arată markdown</string>\n    <string name=\"render_markdown\">Randează markdown-ul</string>\n    <string name=\"copy_hash\">Copiază hash</string>\n    <string name=\"toast_msg_copied\">Copiat în clipboard</string>\n\n    <!-- Navigation drawer strings -->\n    <string name=\"navigation_drawer_open\">Deschide navigation drawer</string>\n    <string name=\"navigation_drawer_close\">Închide navigation drawer</string>\n    <string name=\"navigation_drawer_subheader\">Sub antet</string>\n\n    <!-- Deleting repo -->\n    <string name=\"are_you_sure\">Ești sigur?</string>\n    <string name=\"unexpected_bad_things\">Această acțiune NU poate fi anulată. Aceasta va sterge depozitul, wiki, problemele, comentariile și va șterge toate asocierile de colaborare.</string>\n    <string name=\"delete_successful\">Depozitul este șters</string>\n\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-ru/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<resources>\n\n    <!-- Error messages -->\n    <string name=\"error_orgs_load\">Ошибка при загрузке организаций</string>\n    <string name=\"error_issues_load\">Ошибка при загрузке задач</string>\n    <string name=\"error_repos_load\">Ошибка при загрузке репозиториев</string>\n    <string name=\"error_repo_load\">Ошибка при загрузке репозитория</string>\n    <string name=\"error_contributors_load\">Ошибка при загрузке участников</string>\n    <string name=\"error_gist_load\">Ошибка при загрузке Gist</string>\n    <string name=\"error_news_load\">Ошибка при загрузке новостей</string>\n    <string name=\"error_followers_load\">Ошибка при загрузке подписчиков</string>\n    <string name=\"error_people_load\">Ошибка при загрузке профилей</string>\n    <string name=\"error_person_load\">Ошибка при загрузке профиля</string>\n    <string name=\"error_gist_file_load\">Ошибка при загрузке содержимого Gist-файла</string>\n    <string name=\"error_gists_load\">Ошибка при загрузке Gists</string>\n    <string name=\"error_issue_load\">Ошибка при загрузке задачи</string>\n    <string name=\"error_collaborators_load\">Ошибка при загрузке соучастников</string>\n    <string name=\"error_milestones_load\">Ошибка при загрузке целей</string>\n    <string name=\"error_labels_load\">Ошибка при загрузке тегов</string>\n    <string name=\"error_bookmarks_load\">Ошибка при загрузке закладок</string>\n    <string name=\"error_members_load\">Ошибка при загрузке членов</string>\n    <string name=\"error_commits_load\">Ошибка при загрузке коммитов</string>\n    <string name=\"error_commit_load\">Ошибка при загрузке коммита</string>\n    <string name=\"error_file_load\">Ошибка при загрузке файла</string>\n    <string name=\"error_code_load\">Ошибка при загрузке кода</string>\n    <string name=\"error_refs_load\">Ошибка при загрузке веток и меток</string>\n    <string name=\"error_following_person\">Ошибка подписки</string>\n    <string name=\"error_unfollowing_person\">Ошибка отказа от подписки</string>\n    <string name=\"error_checking_following_status\">Ошибка при проверке статуса подписки</string>\n    <string name=\"error_starring_repository\">Ошибка при отмечании</string>\n    <string name=\"error_unstarring_repository\">Ошибка при снятии отметки</string>\n    <string name=\"error_checking_starring_status\">Ошибка при проверке отметки</string>\n    <string name=\"error_rendering_markdown\">Ошибка отображения Markdown</string>\n    <string name=\"error_users_search\">Ошибка поиска пользователей</string>\n    <!--  -->\n\n\n    <!-- Loading messages -->\n    <string name=\"loading_gist\">Загружаем Gist…</string>\n    <string name=\"loading_more_issues\">Загружаем больше задач…</string>\n    <string name=\"loading_issues\">Загружаем задачи…</string>\n    <string name=\"loading_comments\">Загружаем комментарии…</string>\n    <string name=\"loading_repositories\">Загружаем репозитории…</string>\n    <string name=\"loading_issue\">Загружаем задачу…</string>\n    <string name=\"loading_news\">Загружаем новости…</string>\n    <string name=\"loading_followers\">Загружаем подписчиков…</string>\n    <string name=\"loading_people\">Загружаем подписки…</string>\n    <string name=\"loading_gists\">Загружаем Gists…</string>\n    <string name=\"loading_collaborators\">Загружаем соучастников…</string>\n    <string name=\"loading_milestones\">Загружаем цели…</string>\n    <string name=\"loading_labels\">Загружаем теги…</string>\n    <string name=\"loading_commits\">Загружаем коммиты…</string>\n    <string name=\"loading_files_and_comments\">Загружаем файлы и комментарии…</string>\n    <string name=\"loading_refs\">Загружаем ветки и метки…</string>\n    <!--  -->\n\n\n    <!-- Empty messages -->\n    <string name=\"no_bookmarks\">Нет закладок</string>\n    <string name=\"no_repositories\">Нет репозиториев</string>\n    <string name=\"no_contributors\">Нет участников</string>\n    <string name=\"no_issues\">Нет задач</string>\n    <string name=\"no_gists\">Нет Gists</string>\n    <string name=\"no_people\">Нет подписок</string>\n    <string name=\"no_followers\">Нет подписчиков</string>\n    <string name=\"no_members\">Нет членов</string>\n    <string name=\"no_news\">Нет новостей</string>\n    <string name=\"no_commits\">Нет коммитов</string>\n    <!--  -->\n\n\n    <!-- Updating messages -->\n    <string name=\"updating_assignee\">Обновляем ответственного…</string>\n    <string name=\"updating_issue\">Обновляем задачу…</string>\n    <string name=\"updating_labels\">Обновляем теги…</string>\n    <string name=\"updating_milestone\">Обновляем цель…</string>\n    <!--  -->\n\n    <string name=\"news\">Новости</string>\n    <string name=\"issues\">Задачи</string>\n    <string name=\"gists\">Gists</string>\n    <string name=\"commits\">Коммиты</string>\n    <string name=\"global_search\">Поиск по GitHub</string>\n    <string name=\"find_repositories\">Поиск репозиториев</string>\n    <string name=\"find_issues\">Поиск задач</string>\n    <string name=\"search_title\">Поиск…</string>\n    <string name=\"clear_search_history\">Очистить историю</string>\n    <string name=\"search_history_cleared\">История очищена</string>\n    <string name=\"login_activity_authenticating\">Входим…</string>\n    <string name=\"creating_gist\">Создаем Gist…</string>\n    <string name=\"create\">Создать</string>\n    <string name=\"create_gist\">Создать Gist</string>\n    <string name=\"make_public\">Сделать этот Gist публичным</string>\n    <string name=\"gist_file_name_hint\">file.rb</string>\n    <string name=\"gist\">Gist</string>\n    <string name=\"comments\">Комментарии</string>\n    <string name=\"files\">Файлы</string>\n    <string name=\"open\">Открыть</string>\n    <string name=\"random\">Случайный</string>\n    <string name=\"file_name\">Имя файла</string>\n    <string name=\"file_content\">Содержимое файла</string>\n    <string name=\"new_gist\">Новый Gist</string>\n    <string name=\"filter\">Фильтр</string>\n    <string name=\"bookmark\">Закладка</string>\n    <string name=\"comment\">Комментарий</string>\n    <string name=\"delete\">Удалить</string>\n    <string name=\"refresh\">Обновить</string>\n    <string name=\"dashboard_issues_title\">Панель задач</string>\n    <string name=\"bookmarks\">Закладки</string>\n    <string name=\"gists_title\">Gists</string>\n    <string name=\"issue_title\">Задача #</string>\n    <string name=\"pull_request_title\">Pull Request #</string>\n    <string name=\"gist_title\">Gist\\u0020</string>\n    <string name=\"filter_issues_title\">Фильтровать задачи</string>\n    <string name=\"create_comment_title\">Создать комментарий</string>\n    <string name=\"comment_hint\">Введите комментарий</string>\n    <string name=\"show_more\">Больше…</string>\n    <string name=\"repositories\">Репозитории</string>\n    <string name=\"contributors\">Участники</string>\n    <string name=\"issues_title\">Задачи</string>\n    <string name=\"edit_labels\">Редактировать теги</string>\n    <string name=\"milestone_prefix\">Цель:</string>\n    <string name=\"edit_milestone\">Изменить цель</string>\n    <string name=\"edit_assignee\">Назначить ответственного</string>\n    <string name=\"description\">Описание</string>\n    <string name=\"gist_description_hint\">Gist, созданный на Android</string>\n    <string name=\"title\">Заголовок</string>\n    <string name=\"edit\">Редактировать</string>\n    <string name=\"starring_gist\">Отмечаем Gist…</string>\n    <string name=\"unstarring_gist\">Снимаем отметку с Gist…</string>\n    <string name=\"accounts_label\">Аккаунты</string>\n    <string name=\"select_assignee\">Выбрать ответственного</string>\n    <string name=\"select_milestone\">Выбрать цель</string>\n    <string name=\"select_labels\">Выбрать тег</string>\n    <string name=\"select_ref\">Выбрать ветку или метку</string>\n    <string name=\"no_milestone\">Нет целей</string>\n    <string name=\"unassigned\">Никто не ответственен</string>\n    <string name=\"assigned\">ответственен</string>\n    <string name=\"no_gists_found\">Gists не найдены</string>\n    <string name=\"confirm_gist_delete_title\">Подтвердить удаление</string>\n    <string name=\"confirm_gist_delete_message\">Вы действительно хотите удалить этот Gist?</string>\n    <string name=\"deleting_gist\">Удаляем Gist…</string>\n    <string name=\"creating_comment\">Создаем комментарий…</string>\n    <string name=\"confirm_bookmark_delete_message\">Вы действительно хотите удалить эту закладку?</string>\n    <string name=\"issue_dashboard\">Панель задачи</string>\n    <string name=\"new_issue\">Новая задача</string>\n    <string name=\"anonymous\">Анонимно</string>\n    <string name=\"message_filter_saved\">Фильтр сохранен в закладки</string>\n    <string name=\"recently_viewed\">НЕДАВНО ПРОСМОТРЕННЫЕ</string>\n    <string name=\"recent\">Недавние</string>\n    <string name=\"recent_remove\">Удалить недавние</string>\n    <string name=\"recent_list_remove\">Удалить из недавно использованного</string>\n    <string name=\"section_issue_status\">Статус:</string>\n    <string name=\"status_open\">Открыта</string>\n    <string name=\"status_closed\">Закрыта</string>\n    <string name=\"section_issue_assigned\">Ответственный:</string>\n    <string name=\"assignee_anyone\">Кто угодно</string>\n    <string name=\"section_issue_milestone\">Цель:</string>\n    <string name=\"none\">Нет</string>\n    <string name=\"section_issue_labels\">Теги:</string>\n    <string name=\"log_in\">Войти</string>\n    <string name=\"signup_link\">Первый раз на GitHub? &lt;a href=\\\"https://github.com/join\\\">Нажмите здесь&lt;/a>, чтобы зарегистрироваться.</string>\n    <string name=\"signup_link_two_factor_auth\">Не уверены, что делать? &lt;a href=\\\"https://help.github.com/articles/about-two-factor-authentication\\\">Обратитесь за помощью.&lt;/a></string>\n    <string name=\"connection_failed\">Не можем подключиться к GitHub</string>\n    <string name=\"invalid_login_or_password\">Пожалуйста, проверьте ваш логин и пароль.</string>\n    <string name=\"invalid_password\">Пожалуйста, введите правильный пароль.</string>\n    <string name=\"password\">Пароль</string>\n    <string name=\"username_or_email\">Логин или почта</string>\n    <string name=\"followers\">Подписчики</string>\n    <string name=\"following\">Подписки</string>\n    <string name=\"followers_self\">Подписчики</string>\n    <string name=\"following_self\">Подписки</string>\n    <string name=\"follow\">Подписаться</string>\n    <string name=\"unfollow\">Отписаться</string>\n    <string name=\"star\">Отметить</string>\n    <string name=\"unstar\">Снять отметку</string>\n    <string name=\"members\">Члены</string>\n    <string name=\"closing_issue\">Закрываем задачу…</string>\n    <string name=\"reopening_issue\">Переоткрываем задачу…</string>\n    <string name=\"avatar\">Аватар</string>\n    <string name=\"creating_issue\">Создаем задачу…</string>\n    <string name=\"prefix_created\">создан\\u0020</string>\n    <string name=\"prefix_updated\">обновлен\\u0020</string>\n    <string name=\"prefix_opened\">открыта\\u0020</string>\n    <string name=\"clear\">Очистить</string>\n    <string name=\"pull_request_commits\">Коммиты: %d</string>\n    <string name=\"open_issues\">Открытые задачи</string>\n    <string name=\"closed_issues\">Закрытые задачи</string>\n    <string name=\"confirm_bookmark_delete_title\">Удалить закладку</string>\n    <string name=\"save\">Сохранить</string>\n    <string name=\"apply\">ОК</string>\n    <string name=\"labels_prefix\">Теги:</string>\n    <string name=\"assignee\">Ответственный</string>\n    <string name=\"milestone\">Цель</string>\n    <string name=\"labels\">Теги</string>\n    <string name=\"issue_confirm_close_message\">Вы действительно хотите закрыть эту задачу?</string>\n    <string name=\"issue_confirm_reopen_message\">Вы действительно хотите переоткрыть эту задачу?</string>\n    <string name=\"issue_confirm_close_title\">Закрыть задачу</string>\n    <string name=\"issue_confirm_reopen_title\">Переоткрыть задачу</string>\n    <string name=\"closed\">Закрыта</string>\n    <string name=\"no_description_given\">Описание отсутствует.</string>\n    <string name=\"close\">Закрыть</string>\n    <string name=\"reopen\">Переоткрыть</string>\n    <string name=\"title_invalid_github_url\">Неверный URL GitHub</string>\n    <string name=\"message_invalid_github_url\">Следующий URL не мог быть открыт приложением:\\n{0}</string>\n    <string name=\"cancel\">Отменить</string>\n    <string name=\"authenticator_conflict_title\">Конфликт приложений</string>\n    <string name=\"authenticator_conflict_message\">Другое приложение уже настроено для аутентификации на GitHub.\\n\\nВы должны удалить конфликтующее приложение из учетных записей и настроек синхронизации для использования этого приложения.</string>\n    <string name=\"opening_repository\">Загрузка {0}…</string>\n    <string name=\"commit_compare_title\">Сравнить коммиты</string>\n    <string name=\"commit_prefix\">Коммит\\u0020</string>\n    <string name=\"parent_prefix\">Родитель\\u0020</string>\n    <string name=\"authored\">автор</string>\n    <string name=\"committed\">закоммичен</string>\n    <string name=\"diff_line_message\">Что вы собираетесь сделать?</string>\n    <string name=\"comment_on_line\">Комментировать строку</string>\n    <string name=\"view_entire_file\">Просмотреть весь файл</string>\n    <string name=\"comparing_commits\">Сравнение {0} коммитов</string>\n    <string name=\"enable_wrapping\">Переносить строки</string>\n    <string name=\"disable_wrapping\">Не переносить строки</string>\n    <string name=\"code\">Код</string>\n    <string name=\"following_user\">Подписываюсь…</string>\n    <string name=\"unfollowing_user\">Отписываюсь…</string>\n    <string name=\"starring_repository\">Отмечаем репозиторий…</string>\n    <string name=\"unstarring_repository\">Снимаем отметку с репозитория…</string>\n    <string name=\"navigate_to_user\">Перейти к %s</string>\n    <string name=\"contributions\">%d коммитов</string>\n\n    <!-- Tab titles, should be as short as possible -->\n    <string name=\"tab_repositories\">репозитории</string>\n    <string name=\"tab_users\">пользователи</string>\n    <string name=\"tab_news\">новости</string>\n    <string name=\"tab_following_self\">подписки</string>\n    <string name=\"tab_followers_self\">подписанные</string>\n    <string name=\"tab_following\">подписки</string>\n    <string name=\"tab_followers\">подписанные</string>\n    <string name=\"tab_members\">члены</string>\n    <string name=\"tab_code\">код</string>\n    <string name=\"tab_commits\">коммиты</string>\n    <string name=\"tab_issues\">задачи</string>\n    <string name=\"tab_watched\">наблюдаемые</string>\n    <string name=\"tab_assigned\">назначенные</string>\n    <string name=\"tab_created\">созданные</string>\n    <string name=\"tab_mentioned\">упоминания</string>\n    <string name=\"tab_mine\">мои</string>\n    <string name=\"tab_starred\">отмеченные</string>\n    <string name=\"tab_all\">все</string>\n    <!--  -->\n    <string name=\"share\">Поделиться</string>\n    <string name=\"show_password\">Показать пароль</string>\n    <string name=\"write\">Написать</string>\n    <string name=\"preview\">Предпросмотр</string>\n    <string name=\"show_raw_markdown\">Показать исходный Markdown</string>\n    <string name=\"render_markdown\">Отобразить Markdown</string>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-sk/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<resources>\n\n    <!-- Error messages -->\n    <string name=\"error_orgs_load\">Načítavanie účtu &amp; organizácií zlyhalo</string>\n    <string name=\"error_issues_load\">Načítavanie issues zlyhalo</string>\n    <string name=\"error_repos_load\">Načítavanie repozitárov zlyhalo</string>\n    <string name=\"error_repo_load\">Načítavanie repozitára zlyhalo</string>\n    <string name=\"error_contributors_load\">Načítavanie prispievateľov zlyhalo</string>\n    <string name=\"error_gist_load\">Načítavanie Gistu zlyhalo</string>\n    <string name=\"error_news_load\">Načítavanie noviniek zlyhalo</string>\n    <string name=\"error_followers_load\">Načítavanie sledujúcich zlyhalo</string>\n    <string name=\"error_people_load\">Načítavanie ľudí zlyhalo</string>\n    <string name=\"error_person_load\">Načítavanie osoby zlyhalo</string>\n    <string name=\"error_gist_file_load\">Načítavanie obsahu Gistu zlyhalo</string>\n    <string name=\"error_gists_load\">Načítavanie Gistov zlyhalo</string>\n    <string name=\"error_issue_load\">Načítavanie issue zlyhalo</string>\n    <string name=\"error_collaborators_load\">Načítavanie spolupracovníkov zlyhalo</string>\n    <string name=\"error_milestones_load\">Načítavanie míľnikov zlyhalo</string>\n    <string name=\"error_labels_load\">Načítavanie štítkov zlyhalo</string>\n    <string name=\"error_bookmarks_load\">Načítavanie záložiek zlyhalo</string>\n    <string name=\"error_members_load\">Načítavanie členov zlyhalo</string>\n    <string name=\"error_commits_load\">Načítavanie commitov zlyhalo</string>\n    <string name=\"error_commit_load\">Načítavanie commitu zlyhalo</string>\n    <string name=\"error_file_load\">Načítavanie súboru zlyhalo</string>\n    <string name=\"error_code_load\">Načítavanie kódu zlyhalo</string>\n    <string name=\"error_refs_load\">Načítavanie vetiev &amp; značiek zlyhalo</string>\n    <string name=\"error_following_person\">Následovanie zlyhalo</string>\n    <string name=\"error_unfollowing_person\">Prestávanie sledovania zlyhalo</string>\n    <string name=\"error_checking_following_status\">Nepodarilo sa zistiť stav sledovania</string>\n    <string name=\"error_starring_repository\">Označovanie obľúbeného zlyhalo</string>\n    <string name=\"error_unstarring_repository\">Zrušenie obľúbeného zlyhalo</string>\n    <string name=\"error_forking_repository\">Forkovanie zlyhalo</string>\n    <string name=\"error_checking_starring_status\">Kontrola stavu obľubeného zlyhala</string>\n    <string name=\"error_rendering_markdown\">Renderovanie markdownu zlyhalo</string>\n    <string name=\"error_users_search\">Vyhľadávanie užívateľov zlyhalo</string>\n    <!--  -->\n\n\n    <!-- Loading messages -->\n    <string name=\"loading_gist\">Načítavam Gist…</string>\n    <string name=\"loading_more_issues\">Načítavam viac issues…</string>\n    <string name=\"loading_issues\">Načítavam issues…</string>\n    <string name=\"loading_comments\">Načítavam komentáre…</string>\n    <string name=\"loading_repositories\">Načítavam repozitáre…</string>\n    <string name=\"loading_issue\">Načítavam issue…</string>\n    <string name=\"loading_news\">Načítavam novinky…</string>\n    <string name=\"loading_followers\">Načítavam sledujúcich…</string>\n    <string name=\"loading_people\">Načítavam ľudí…</string>\n    <string name=\"loading_gists\">Načítavam Gisty…</string>\n    <string name=\"loading_collaborators\">Načítavam spolupracovníkov…</string>\n    <string name=\"loading_milestones\">Načítavam míľniky…</string>\n    <string name=\"loading_labels\">Načítavam štítky…</string>\n    <string name=\"loading_commits\">Načítavam commity…</string>\n    <string name=\"loading_files_and_comments\">Načítavam súbory &amp; komentáre…</string>\n    <string name=\"loading_refs\">Načítavam vetvy &amp; značky…</string>\n    <!--  -->\n\n\n    <!-- Empty messages -->\n    <string name=\"no_bookmarks\">Žiadne záložky</string>\n    <string name=\"no_repositories\">Žiadne repozitáre</string>\n    <string name=\"no_contributors\">Žiadny prispievatelia</string>\n    <string name=\"no_issues\">Žiadne issues</string>\n    <string name=\"no_gists\">Žiadne gisty</string>\n    <string name=\"no_people\">Žiadny ľudia</string>\n    <string name=\"no_followers\">Žiadny sledujúci</string>\n    <string name=\"no_members\">Žiadny členovia</string>\n    <string name=\"no_news\">Žiadne novinky</string>\n    <string name=\"no_commits\">Žiadne commity</string>\n    <!--  -->\n\n\n    <!-- Updating messages -->\n    <string name=\"updating_assignee\">Aktualizujem priradených…</string>\n    <string name=\"updating_issue\">Aktualizujem issue…</string>\n    <string name=\"updating_labels\">Aktualizujem štítky…</string>\n    <string name=\"updating_milestone\">Aktualizujem míľnik…</string>\n    <!--  -->\n\n    <string name=\"news\">Novinky</string>\n    <string name=\"issues\">Issues</string>\n    <string name=\"gists\">Gisty</string>\n    <string name=\"commits\">Commity</string>\n    <string name=\"global_search\">GitHub vyhľadávanie</string>\n    <string name=\"find_repositories\">Nájsť repozitáre</string>\n    <string name=\"find_issues\">Nájsť issue</string>\n    <string name=\"search_title\">Hľadať…</string>\n    <string name=\"clear_search_history\">Vymazať históriu</string>\n    <string name=\"search_history_cleared\">Hľadať v premazanej histórii</string>\n    <string name=\"login_activity_authenticating\">Prihlásenie…</string>\n    <string name=\"creating_gist\">Vytváram Gist…</string>\n    <string name=\"create\">Vytvoriť</string>\n    <string name=\"create_gist\">Vytvoriť gist</string>\n    <string name=\"make_public\">Zverejniť tento gist</string>\n    <string name=\"gist_file_name_hint\">file.rb</string>\n    <string name=\"gist\">Gist</string>\n    <string name=\"comments\">Komentáre</string>\n    <string name=\"files\">Súbory</string>\n    <string name=\"open\">Otvoriť</string>\n    <string name=\"random\">Náhodný</string>\n    <string name=\"file_name\">Meno súboru</string>\n    <string name=\"file_content\">Obsah súboru</string>\n    <string name=\"new_gist\">Nový Gist</string>\n    <string name=\"filter\">Filter</string>\n    <string name=\"bookmark\">Záložka</string>\n    <string name=\"comment\">Komentár</string>\n    <string name=\"delete\">Zmazať</string>\n    <string name=\"refresh\">Obnoviť</string>\n    <string name=\"dashboard_issues_title\">Prehľad issues</string>\n    <string name=\"bookmarks\">Záložky</string>\n    <string name=\"gists_title\">Gisty</string>\n    <string name=\"issue_title\">Issue #</string>\n    <string name=\"pull_request_title\">Žiadosť o potiahnutie #</string>\n    <string name=\"gist_title\">Gist\\u0020</string>\n    <string name=\"filter_issues_title\">Filtrovať issues</string>\n    <string name=\"create_comment_title\">Vytvoriť komentár</string>\n    <string name=\"comment_hint\">Potvrdiť komentár</string>\n    <string name=\"show_more\">Ukázať viac…</string>\n    <string name=\"repositories\">Repozitáre</string>\n    <string name=\"contributors\">Prispievatelia</string>\n    <string name=\"issues_title\">Issues</string>\n    <string name=\"edit_labels\">Upraviť štítky</string>\n    <string name=\"milestone_prefix\">Míľnik:</string>\n    <string name=\"edit_milestone\">Upraviť míľnik</string>\n    <string name=\"edit_assignee\">Upraviť priradenie</string>\n    <string name=\"description\">Popis</string>\n    <string name=\"gist_description_hint\">Android vytvoril gist</string>\n    <string name=\"title\">Nadpis</string>\n    <string name=\"edit\">Upraviť</string>\n    <string name=\"starring_gist\">Označujem ako obľúbený gist…</string>\n    <string name=\"unstarring_gist\">Ruším obľúbenie…</string>\n    <string name=\"accounts_label\">Účty</string>\n    <string name=\"select_assignee\">Zvoliť priradenie</string>\n    <string name=\"select_milestone\">Zvoliť míľnik</string>\n    <string name=\"select_labels\">Zvoliť štítky</string>\n    <string name=\"select_ref\">Zvoliť vetvu alebo značku</string>\n    <string name=\"no_milestone\">Žiadny míľnik</string>\n    <string name=\"unassigned\">Nikto nie je priradený</string>\n    <string name=\"assigned\">je priradený</string>\n    <string name=\"no_gists_found\">Nenašli sa žiadne Gisty</string>\n    <string name=\"confirm_gist_delete_title\">Potvrdiť vymazanie</string>\n    <string name=\"confirm_gist_delete_message\">Ste si istý vymazať tento Gist?</string>\n    <string name=\"deleting_gist\">Mažem Gist…</string>\n    <string name=\"creating_comment\">Vytváram komentár…</string>\n    <string name=\"editing_comment\">Upravujem komentár…</string>\n    <string name=\"deleting_comment\">Mažem komentár…</string>\n    <string name=\"confirm_comment_delete_title\">Zmazať komentár</string>\n    <string name=\"confirm_comment_delete_message\">Ste si istý vymazať tento komentár?</string>\n    <string name=\"confirm_bookmark_delete_message\">Ste si istý vymazať túto záložku?</string>\n    <string name=\"issue_dashboard\">Issue panel</string>\n    <string name=\"new_issue\">Nová issue</string>\n    <string name=\"anonymous\">Anonymný</string>\n    <string name=\"message_filter_saved\">Filter issues uložený do záložiek</string>\n    <string name=\"recently_viewed\">Nedávno prezreté</string>\n    <string name=\"recent\">Nedávne</string>\n    <string name=\"recent_remove\">Vymazať nedávne</string>\n    <string name=\"recent_list_remove\">Vymazať z nedávno použitých</string>\n    <string name=\"section_issue_status\">Stav:</string>\n    <string name=\"status_open\">Otvoriť</string>\n    <string name=\"status_closed\">Zatvoriť</string>\n    <string name=\"section_issue_assigned\">Priradené k:</string>\n    <string name=\"assignee_anyone\">Ktokoľvek</string>\n    <string name=\"section_issue_milestone\">Míľnik:</string>\n    <string name=\"none\">Žiadny</string>\n    <string name=\"section_issue_labels\">Štítky:</string>\n    <string name=\"log_in\">Prihlásiť sa</string>\n    <string name=\"signup_link\">Ste nový na GitHube? &lt;a href=\\\"https://github.com/join\\\">Kliknite sem&lt;/a> a zaregistrujte sa</string>\n    <string name=\"signup_link_two_factor_auth\">Nie ste si istý čo robiť? &lt;a href=\\\"https://help.github.com/articles/about-two-factor-authentication\\\">Nájsť pomoc.&lt;/a></string>\n    <string name=\"connection_failed\">Nie je možné pripojiť sa na GitHub</string>\n    <string name=\"invalid_login_or_password\">Prosím, vložte platné užívateľské meno &amp; heslo</string>\n    <string name=\"invalid_password\">Prosím, vložte platné heslo.</string>\n    <string name=\"password\">Heslo</string>\n    <string name=\"username_or_email\">Užívateľské meno alebo E-mail</string>\n    <string name=\"followers\">Sledujúci</string>\n    <string name=\"following\">Sleduje</string>\n    <string name=\"followers_self\">Sledujúci</string>\n    <string name=\"following_self\">Sledujem</string>\n    <string name=\"follow\">Sledovať</string>\n    <string name=\"unfollow\">Prestať sledovať</string>\n    <string name=\"star\">Označiť obľúbený</string>\n    <string name=\"unstar\">Zrušiť obľúbený</string>\n    <string name=\"fork\">Forknúť</string>\n    <string name=\"members\">Členovia</string>\n    <string name=\"closing_issue\">Zatváram issue…</string>\n    <string name=\"reopening_issue\">Znovu otváram issue…</string>\n    <string name=\"avatar\">Avatar</string>\n    <string name=\"creating_issue\">Vytváram issue…</string>\n    <string name=\"prefix_created\">vytvorená\\u0020</string>\n    <string name=\"prefix_updated\">aktualizovaná\\u0020</string>\n    <string name=\"prefix_opened\">otvorená\\u0020</string>\n    <string name=\"clear\">Vyčistiť</string>\n    <string name=\"pull_request_commits\">Commity: %d</string>\n    <string name=\"open_issues\">Otvoriť issues</string>\n    <string name=\"closed_issues\">Uzavreté issues</string>\n    <string name=\"confirm_bookmark_delete_title\">Odstrániť záložku</string>\n    <string name=\"save\">Uložiť</string>\n    <string name=\"apply\">Použiť</string>\n    <string name=\"labels_prefix\">Štítky:</string>\n    <string name=\"assignee\">Priradiť</string>\n    <string name=\"milestone\">Míľnik</string>\n    <string name=\"labels\">Štítky</string>\n    <string name=\"issue_confirm_close_message\">Ste si istý uzavrieť túto issue?</string>\n    <string name=\"issue_confirm_reopen_message\">Ste si istý znovu otvoriť túto issue?</string>\n    <string name=\"issue_confirm_close_title\">Uzavrieť issue</string>\n    <string name=\"issue_confirm_reopen_title\">Znovu otvoriť issue</string>\n    <string name=\"closed\">Uzavretý</string>\n    <string name=\"no_description_given\">Žiadny dostupný popis.</string>\n    <string name=\"close\">Zatvoriť</string>\n    <string name=\"reopen\">Znovu otvoriť</string>\n    <string name=\"title_invalid_github_url\">Nelatná GitHub URL</string>\n    <string name=\"message_invalid_github_url\">Nasledujúca URL nemohla byť otvorená touto aplikáciou:\\n{0}</string>\n    <string name=\"cancel\">Zrušiť</string>\n    <string name=\"authenticator_conflict_title\">App konflikt</string>\n    <string name=\"authenticator_conflict_message\">Ďalšia nainštalovaná aplikácia už používa GitHub overenie.\\n\\nMusíte túto aplikáciu odstrániť z Účtov &amp; synchronizovať nastavenia a odinštalovať ju predtým než môže byť aplikácia GitHub použitá.</string>\n    <string name=\"opening_repository\">Otváram {0}…</string>\n    <string name=\"commit_compare_title\">Porovnanie commitov</string>\n    <string name=\"commit_prefix\">Commit\\u0020</string>\n    <string name=\"parent_prefix\">Rodič\\u0020</string>\n    <string name=\"authored\">pridal</string>\n    <string name=\"committed\">commitované</string>\n    <string name=\"diff_line_message\">Čo by ste chceli spraviť?</string>\n    <string name=\"comment_on_line\">Komentár na riadku</string>\n    <string name=\"view_entire_file\">Pozrieť celý súbor</string>\n    <string name=\"comparing_commits\">Porovnávanie {0} commitov</string>\n    <string name=\"enable_wrapping\">Zapnúť zalamovanie riadkov</string>\n    <string name=\"disable_wrapping\">Vypnúť zalamovanie riadkov</string>\n    <string name=\"code\">Kód</string>\n    <string name=\"following_user\">Začínam sledovať…</string>\n    <string name=\"unfollowing_user\">Prestávam sledovať…</string>\n    <string name=\"starring_repository\">Označujem ako obľúbený…</string>\n    <string name=\"unstarring_repository\">Ruším obľúbený…</string>\n    <string name=\"forking_repository\">Forkujem…</string>\n    <string name=\"navigate_to_user\">Navigovať na %s</string>\n    <string name=\"contributions\">%d commitov</string>\n\n    <!-- Tab titles, should be as short as possible -->\n    <string name=\"tab_repositories\">Repozitáre</string>\n    <string name=\"tab_users\">užívatelia</string>\n    <string name=\"tab_news\">Novinky</string>\n    <string name=\"tab_following_self\">Sledujem</string>\n    <string name=\"tab_followers_self\">Sledujúci</string>\n    <string name=\"tab_following\">Sleduje</string>\n    <string name=\"tab_followers\">Sledujúci</string>\n    <string name=\"tab_members\">Členovia</string>\n    <string name=\"tab_code\">Kód</string>\n    <string name=\"tab_commits\">Commity</string>\n    <string name=\"tab_issues\">Issues</string>\n    <string name=\"tab_watched\">Sledovaný</string>\n    <string name=\"tab_assigned\">Priradený</string>\n    <string name=\"tab_created\">Vytvorený</string>\n    <string name=\"tab_mentioned\">Spomenutý</string>\n    <string name=\"tab_mine\">Moje</string>\n    <string name=\"tab_starred\">Obľúbené</string>\n    <string name=\"tab_all\">Všetky</string>\n    <!--  -->\n    <string name=\"share\">Zdieľať</string>\n    <string name=\"show_password\">Ukázať heslo</string>\n    <string name=\"write\">Napísať</string>\n    <string name=\"preview\">Náhľad</string>\n    <string name=\"show_raw_markdown\">Zobraziť surový markdown</string>\n    <string name=\"render_markdown\">Renderovať markdown</string>\n    <string name=\"copy_hash\">Kopírovať hash</string>\n    <string name=\"toast_msg_copied\">Skopírovaná do clipboardu</string>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-sv/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<resources>\n\n    <!-- Error messages -->\n    <string name=\"error_orgs_load\">Inläsning av konto &amp; organisationer misslyckades</string>\n    <string name=\"error_issues_load\">Inläsning av ärenden misslyckades</string>\n    <string name=\"error_repos_load\">Inläsning av repon misslyckades</string>\n    <string name=\"error_repo_load\">Inläsning av repot misslyckades</string>\n    <string name=\"error_contributors_load\">Inläsning av medverkande misslyckades</string>\n    <string name=\"error_gist_load\">Inläsning av gist misslyckades</string>\n    <string name=\"error_news_load\">Inläsning av nyheter misslyckades</string>\n    <string name=\"error_followers_load\">Inläsning av prenumeranter misslyckades</string>\n    <string name=\"error_people_load\">Inläsning av personer misslyckades</string>\n    <string name=\"error_person_load\">Inläsning av personen misslyckades</string>\n    <string name=\"error_gist_file_load\">Inläsning av gistfilens innehåll misslyckades</string>\n    <string name=\"error_gists_load\">Inläsning av gists misslyckades</string>\n    <string name=\"error_issue_load\">Inläsning av ärendet misslyckades</string>\n    <string name=\"error_collaborators_load\">Inläsning av medarbetare misslyckades</string>\n    <string name=\"error_milestones_load\">Inläsningen av milstolpar misslyckades</string>\n    <string name=\"error_labels_load\">Inläsning av etiketter misslyckades</string>\n    <string name=\"error_bookmarks_load\">Inläsning av bokmärken misslyckades</string>\n    <string name=\"error_members_load\">Inläsning av medlemmar misslyckades</string>\n    <string name=\"error_commits_load\">Inläsning av commits misslyckades</string>\n    <string name=\"error_commit_load\">Inläsning av commiten misslyckades</string>\n    <string name=\"error_file_load\">Inläsning av filen misslyckades</string>\n    <string name=\"error_code_load\">Inläsning av kod misslyckades</string>\n    <string name=\"error_refs_load\">Inläsning av brancher &amp; taggar misslyckades</string>\n    <string name=\"error_following_person\">Misslyckades att följa personen</string>\n    <string name=\"error_unfollowing_person\">Misslyckades att avfölja personen</string>\n    <string name=\"error_checking_following_status\">Misslyckades att avläsa följar-status</string>\n    <string name=\"error_starring_repository\">Stjärnmärkning misslyckades</string>\n    <string name=\"error_unstarring_repository\">Borttagning av stjärnmärkning misslyckades</string>\n    <string name=\"error_forking_repository\">Forkningen misslyckades</string>\n    <string name=\"error_deleting_repository\">Borttagningen misslyckades</string>\n    <string name=\"error_checking_starring_status\">Misslyckades att avläsa stjärnmärkning</string>\n    <string name=\"error_rendering_markdown\">Misslyckades med att rendera markdown</string>\n    <string name=\"error_users_search\">Misslyckades med sökning efter användare</string>\n    <!--  -->\n\n\n    <!-- Loading messages -->\n    <string name=\"loading_gist\">Laddar gist&#8230;</string>\n    <string name=\"loading_more_issues\">Laddar fler ärenden&#8230;</string>\n    <string name=\"loading_issues\">Laddar ärenden&#8230;</string>\n    <string name=\"loading_comments\">Laddar kommentarer&#8230;</string>\n    <string name=\"loading_repositories\">Laddar repot&#8230;</string>\n    <string name=\"loading_issue\">Laddar ärendet&#8230;</string>\n    <string name=\"loading_news\">Laddar nyheter&#8230;</string>\n    <string name=\"loading_followers\">Laddar prenumeranter&#8230;</string>\n    <string name=\"loading_people\">Laddar personer&#8230;</string>\n    <string name=\"loading_gists\">Laddar gists&#8230;</string>\n    <string name=\"loading_collaborators\">Laddar medarbetare&#8230;</string>\n    <string name=\"loading_milestones\">Laddar milstolpar&#8230;</string>\n    <string name=\"loading_labels\">Laddar etiketter&#8230;</string>\n    <string name=\"loading_commits\">Laddar commits&#8230;</string>\n    <string name=\"loading_files_and_comments\">Läser in filer &amp; commits&#8230;</string>\n    <string name=\"loading_refs\">Läser in brancher &amp; taggar&#8230;</string>\n    <!--  -->\n\n\n    <!-- Empty messages -->\n    <string name=\"no_bookmarks\">Inga bokmärken</string>\n    <string name=\"no_repositories\">Inga repon</string>\n    <string name=\"no_contributors\">Inga medverkande</string>\n    <string name=\"no_issues\">Inga ärenden</string>\n    <string name=\"no_gists\">Inga gists</string>\n    <string name=\"no_people\">Inga personer</string>\n    <string name=\"no_followers\">Inga prenumeranter</string>\n    <string name=\"no_members\">Inga medlemmar</string>\n    <string name=\"no_news\">Inga nyheter</string>\n    <string name=\"no_commits\">Inga commits</string>\n    <!--  -->\n\n\n    <!-- Updating messages -->\n    <string name=\"updating_assignee\">Uppdaterar ansvarig&#8230;</string>\n    <string name=\"updating_issue\">Uppdaterar ärenden&#8230;</string>\n    <string name=\"updating_labels\">Uppdaterar etiketter&#8230;</string>\n    <string name=\"updating_milestone\">Uppdaterar milstolpar&#8230;</string>\n    <!--  -->\n\n    <string name=\"home\">Hem</string>\n    <string name=\"news\">Nyheter</string>\n    <string name=\"issues\">Ärenden</string>\n    <string name=\"gists\">Gists</string>\n    <string name=\"commits\">Commits</string>\n    <string name=\"global_search\">GitHub sök</string>\n    <string name=\"find_repositories\">Hitta repon</string>\n    <string name=\"find_issues\">Hitta ärenden</string>\n    <string name=\"search_title\">Sök&#8230;</string>\n    <string name=\"pull_request_title\">Pull request #</string>\n    <string name=\"clear_search_history\">Rensa sökhistorik</string>\n    <string name=\"search_history_cleared\">Sökhistorik rensad</string>\n    <string name=\"login_activity_authenticating\">Loggar in&#8230;</string>\n    <string name=\"loading_user\">Laddar användarprofil&#8230;</string>\n    <string name=\"creating_gist\">Skapar gist&#8230;</string>\n    <string name=\"create\">Skapa</string>\n    <string name=\"create_gist\">Skapa gist</string>\n    <string name=\"make_public\">Gör den här gisten publik</string>\n    <string name=\"contributors\">Medverkande</string>\n    <string name=\"gist_file_name_hint\">fil.rb</string>\n    <string name=\"gist\">Gist</string>\n    <string name=\"comments\">Kommentarer</string>\n    <string name=\"files\">Filer</string>\n    <string name=\"open\">Öppna</string>\n    <string name=\"random\">Slumpad</string>\n    <string name=\"file_name\">Filnamn</string>\n    <string name=\"file_content\">Filinnehållet</string>\n    <string name=\"new_gist\">Ny gist</string>\n    <string name=\"filter\">Filtrera</string>\n    <string name=\"bookmark\">Bokmärka</string>\n    <string name=\"comment\">Kommentera</string>\n    <string name=\"delete\">Ta bort</string>\n    <string name=\"delete_cap\">TA BORT</string>\n    <string name=\"refresh\">Uppdatera</string>\n    <string name=\"dashboard_issues_title\">Ärenden</string> <!-- Dashboard -->\n    <string name=\"bookmarks\">Bokmärken</string>\n    <string name=\"gists_title\">Gists</string>\n    <string name=\"issue_title\">Ärende #</string>\n    <string name=\"gist_title\">Gist\\u0020</string>\n    <string name=\"filter_issues_title\">Filtrera ärenden</string>\n    <string name=\"create_comment_title\">Skapa kommentar</string>\n    <string name=\"comment_hint\">Skriv en kommentar</string>\n    <string name=\"show_more\">Visa mer&#8230;</string>\n    <string name=\"repositories\">Repon</string>\n    <string name=\"issues_title\">Ärenden</string>\n    <string name=\"edit_labels\">Ändra etiketter</string>\n    <string name=\"milestone_prefix\">Milstolpe:</string>\n    <string name=\"edit_milestone\">Ändra milstolpe</string>\n    <string name=\"edit_assignee\">Ändra ansvarig</string>\n    <string name=\"description\">Beskrivning</string>\n    <string name=\"gist_description_hint\">Gist skapad i Android</string>\n    <string name=\"title\">Titel</string>\n    <string name=\"edit\">Ändra</string>\n    <string name=\"star\">Stjärnmärk</string>\n    <string name=\"starring_gist\">Stjärnmärker gist&#8230;</string>\n    <string name=\"unstar\">Ta bort stjärmärkning</string>\n    <string name=\"fork\">Forka</string>\n    <string name=\"unstarring_gist\">Tar bort stjärmärkning av gist&#8230;</string>\n    <string name=\"accounts_label\">Konton</string>\n    <string name=\"select_assignee\">Välj ansvarig</string>\n    <string name=\"select_milestone\">Välj milstolpe</string>\n    <string name=\"select_labels\">Välj etiketter</string>\n    <string name=\"select_ref\">Välj branch eller tag</string>\n    <string name=\"no_milestone\">Inga milstolpar</string>\n    <string name=\"unassigned\">Ingen har tilldelats detta</string>\n    <string name=\"assigned\">är tilldelad</string>\n    <string name=\"no_gists_found\">Inga gists hittades</string>\n    <string name=\"confirm_gist_delete_title\">Bekräfta borttagning</string>\n    <string name=\"confirm_gist_delete_message\">Är du säker på att du vill ta bort den här gisten?</string>\n    <string name=\"deleting_gist\">Tar bort gist&#8230;</string>\n    <string name=\"confirm_comment_delete_message\">Är du säker på att du vill radera denna kommentar?</string>\n    <string name=\"confirm_comment_delete_title\">Radera kommentar</string>\n    <string name=\"creating_comment\">Skapar kommentar&#8230;</string>\n    <string name=\"editing_comment\">Uppdaterar kommentar&#8230;</string>\n    <string name=\"deleting_comment\">Raderar kommentar&#8230;</string>\n    <string name=\"confirm_bookmark_delete_message\">Är du säker på att du vill ta bort det här bokmärket?</string>\n    <string name=\"issue_dashboard\">Ärendeöversikt</string>\n    <string name=\"new_issue\">Nytt ärende</string>\n    <string name=\"anonymous\">Anonym</string>\n    <string name=\"message_filter_saved\">Ärendefilter sparat till bokmärken</string>\n    <string name=\"recently_viewed\">NYLIGEN VISADE</string>\n    <string name=\"recent\">Senaste</string>\n    <string name=\"recent_remove\">Ta bort senaste</string>\n    <string name=\"recent_list_remove\">Ta bort från senast använt</string>\n    <string name=\"section_issue_status\">Status:</string>\n    <string name=\"status_open\">Öppen</string>\n    <string name=\"status_closed\">Stängd</string>\n    <string name=\"section_issue_assigned\">Tilldelad:</string>\n    <string name=\"assignee_anyone\">Vem som helst</string>\n    <string name=\"section_issue_milestone\">Milstolpe:</string>\n    <string name=\"none\">Inga</string>\n    <string name=\"section_issue_labels\">Ettiketter:</string>\n    <string name=\"log_in\">Logga in</string>\n    <string name=\"signup_link\">Ny på GitHub? &lt;a href=\\\"https://github.com/join\\\">Klicka här&lt;/a> för att registrera dig</string>\n    <string name=\"signup_link_two_factor_auth\">Osäker på vad du ska göra? &lt;a href=\\\"https://help.github.com/articles/about-two-factor-authentication\\\">Få hjälp.&lt;/a></string>\n    <string name=\"connection_failed\">Kan inte ansluta till GitHub</string>\n    <string name=\"invalid_login_or_password\">Ange ett giltigt användarnamn &amp; lösenord</string>\n    <string name=\"invalid_password\">Ange ett giltigt lösenord.</string>\n    <string name=\"password\">Lösenord</string>\n    <string name=\"username_or_email\">Användarnamn eller epost</string>\n    <string name=\"login_or_email\">Användarnamn eller epost</string>\n    <string name=\"followers\">Prenumeranter</string>\n    <string name=\"following\">Prenumererar på</string>\n    <string name=\"follow\">Följ</string>\n    <string name=\"unfollow\">Avfölj</string>\n    <string name=\"followers_self\">Prenumeranter</string>\n    <string name=\"following_self\">Prenumererar</string>\n    <string name=\"members\">Medlemmar</string>\n    <string name=\"closing_issue\">Stänger ärende&#8230;</string>\n    <string name=\"reopening_issue\">Öppnar ärendet igen&#8230;</string>\n    <string name=\"avatar\">Avatar</string>\n    <string name=\"creating_issue\">Skapar ärende&#8230;</string>\n    <string name=\"prefix_created\">skapad\\u0020</string>\n    <string name=\"prefix_updated\">updaterad\\u0020</string>\n    <string name=\"prefix_opened\">öppnad\\u0020</string>\n    <string name=\"clear\">Rensa</string>\n    <string name=\"pull_request_commits\">Commits: %d</string>\n    <string name=\"open_issues\">Öppna ärenden</string>\n    <string name=\"closed_issues\">Stängda ärenden</string>\n    <string name=\"confirm_bookmark_delete_title\">Radera bokmärke</string>\n    <string name=\"save\">Spara</string>\n    <string name=\"apply\">Tillämpa</string>\n    <string name=\"labels_prefix\">Etiketter:</string>\n    <string name=\"assignee\">Ansvarig</string>\n    <string name=\"milestone\">Milstolpe</string>\n    <string name=\"labels\">Etiketter</string>\n    <string name=\"issue_confirm_close_message\">Är du säker på att du vill stänga det här ärendet?</string>\n    <string name=\"issue_confirm_reopen_message\">Är du säker på att du vill öppna det här ärendet igen?</string>\n    <string name=\"issue_confirm_close_title\">Stäng ärende</string>\n    <string name=\"issue_confirm_reopen_title\">Öppna ärende igen</string>\n    <string name=\"closed\">Stängd</string>\n    <string name=\"no_description_given\">Ingen beskrivning given.</string>\n    <string name=\"close\">Stäng</string>\n    <string name=\"reopen\">Öppna Igen</string>\n    <string name=\"title_invalid_github_url\">Ogiltlig GitHub-adress</string>\n    <string name=\"message_invalid_github_url\">Den följande adressen kunde inte öppnas av den här applikationen:\\n{0}</string>\n    <string name=\"cancel\">Avbryt</string>\n    <string name=\"not_sure\">OSÄKER</string>\n    <string name=\"authenticator_conflict_title\">App-konflikt</string>\n    <string name=\"authenticator_conflict_message\">En annan installerad app är redan konfigurerad för GitHub-autentisering. \\n\\nDu måste ta bort den andra appen från konto- och synkinställningarna och avinstallera den innan GitHub-appen kan användas.</string>\n    <string name=\"opening_repository\">Öppnar {0}&#8230;</string>\n    <string name=\"commit_compare_title\">Jämför commit</string>\n    <string name=\"commit_prefix\">Commit\\u0020</string>\n    <string name=\"parent_prefix\">Förälder\\u0020</string>\n    <string name=\"authored\">skrev detta den</string>\n    <string name=\"committed\">committed</string>\n    <string name=\"diff_line_message\">Vad vill du göra?</string>\n    <string name=\"comment_on_line\">Kommentera raden</string>\n    <string name=\"view_entire_file\">Visa hela filen</string>\n    <string name=\"comparing_commits\">Jämför {0} commits</string>\n    <string name=\"enable_wrapping\">Aktivera wrapping</string>\n    <string name=\"disable_wrapping\">Inaktivera wrapping</string>\n    <string name=\"code\">Kod</string>\n    <string name=\"following_user\">Följer användare&#8230;</string>\n    <string name=\"unfollowing_user\">Avföljer användare&#8230;</string>\n    <string name=\"starring_repository\">Stjärnmärker&#8230;</string>\n    <string name=\"unstarring_repository\">Tar bort stjärnmärkning&#8230;</string>\n    <string name=\"forking_repository\">Forkar repot&#8230;</string>\n    <string name=\"deleting_repository\">Raderar repot&#8230;</string>\n    <string name=\"navigate_to_user\">Navigera till %s</string>\n    <string name=\"contributions\">%d commits</string>\n\n    <!-- Tab titles, should be as short as possible -->\n    <string name=\"tab_repositories\">repon</string>\n    <string name=\"tab_users\">användare</string>\n    <string name=\"tab_news\">nyheter</string>\n    <string name=\"tab_following_self\">följer</string>\n    <string name=\"tab_followers_self\">följare</string>\n    <string name=\"tab_following\">följer</string>\n    <string name=\"tab_followers\">följare</string>\n    <string name=\"tab_members\">medlemmar</string>\n    <string name=\"tab_code\">kod</string>\n    <string name=\"tab_commits\">commits</string>\n    <string name=\"tab_issues\">ärenden</string>\n    <string name=\"tab_watched\">visat</string>\n    <string name=\"tab_assigned\">tilldelat</string>\n    <string name=\"tab_created\">skapat</string>\n    <string name=\"tab_mentioned\">nämnt</string>\n    <string name=\"tab_mine\">mina</string>\n    <string name=\"tab_starred\">stjärnmärkt</string>\n    <string name=\"tab_all\">alla</string>\n    <!-- -->\n    <string name=\"share\">Dela</string>\n    <string name=\"show_password\">Visa lösenord</string>\n    <string name=\"write\">Skriv</string>\n    <string name=\"preview\">Förhandsvisa</string>\n    <string name=\"show_raw_markdown\">Visa rå markdown</string>\n    <string name=\"render_markdown\">Rendera markdown</string>\n    <string name=\"copy_hash\">Kopiera hash</string>\n    <string name=\"toast_msg_copied\">Kopierad till clipboard</string>\n\n    <!-- Navigation drawer strings -->\n    <string name=\"navigation_drawer_close\">Stäng navigationsvyn</string>\n    <string name=\"navigation_drawer_open\">Öppna navigationsvyn</string>\n    <string name=\"navigation_drawer_subheader\">Underrubrik</string>\n\n    <!-- Deleting repo -->\n    <string name=\"are_you_sure\">Är du helt säker?</string>\n    <string name=\"unexpected_bad_things\">Du kan INTE ångra detta.\n        Detta kommer att radera repot, wiki, ärenden, kommentarer och\n        alla medverkarkopplingar permanent.\n    </string>\n    <string name=\"delete_successful\">Repot har raderats</string>\n    <string name=\"temporary_login_message\"><b>Autentisering görs nu via hemsidan,\n        tryck nu på knappen för att fortsätta.</b>\n        \\n\\n I och med att Github har infört restriktioner mot tredjepartsapplikationer är det\n        inte längre möjligt att verkställa ändringar mot vissa organisationer. Du kan läsa mer här: \\n\n        https://help.github.com/articles/about-third-party-application-restrictions/</string>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-tr/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?><!--\n  ~ Copyright (c) 2015 PocketHub\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<resources>\n\n    <!-- Error messages -->\n    <string name=\"error_orgs_load\">Hesap ve organizasyonlar yüklenemedi</string>\n    <string name=\"error_issues_load\">Sorunlar yüklenemedi</string>\n    <string name=\"error_repos_load\">Projeler yüklenemedi</string>\n    <string name=\"error_repo_load\">Proje yüklenemedi</string>\n    <string name=\"error_contributors_load\">Destekçiler yüklenemedi</string>\n    <string name=\"error_gist_load\">Gist yüklenemedi</string>\n    <string name=\"error_news_load\">Haberler yüklenemedi</string>\n    <string name=\"error_followers_load\">Takipçiler yüklenemedi</string>\n    <string name=\"error_people_load\">Kişiler yüklenemedi</string>\n    <string name=\"error_person_load\">Kişi yüklenemedi</string>\n    <string name=\"error_gist_file_load\">Gist dosya içeriği yüklenemedi</string>\n    <string name=\"error_gists_load\">Gist\\'ler yüklenemedi</string>\n    <string name=\"error_issue_load\">Sorun yüklenemedi</string>\n    <string name=\"error_collaborators_load\">Birlikte çalışılanlar yüklenemedi</string>\n    <string name=\"error_milestones_load\">Dönüm noktaları yüklenemedi</string>\n    <string name=\"error_labels_load\">Etiketler yüklenemedi</string>\n    <string name=\"error_bookmarks_load\">Yer imleri yüklenemedi</string>\n    <string name=\"error_members_load\">Üyeler yüklenemedi</string>\n    <string name=\"error_commits_load\">Gönderimler yüklenemedi</string>\n    <string name=\"error_commit_load\">Gönderim yüklenemedi</string>\n    <string name=\"error_file_load\">Dosya yüklenemedi</string>\n    <string name=\"error_code_load\">Kod yüklenemedi</string>\n    <string name=\"error_refs_load\">Etiket ve ayrımlar yüklenemedi</string>\n    <string name=\"error_following_person\">Takip etme başarısız</string>\n    <string name=\"error_unfollowing_person\">Takibi bırakma başarısız</string>\n    <string name=\"error_checking_following_status\">Takip durumunu kontrolü başarısız</string>\n    <string name=\"error_starring_repository\">Favorilere ekleme başarısız</string>\n    <string name=\"error_unstarring_repository\">Favorilerden kaldırma başarısız</string>\n    <string name=\"error_forking_repository\">Kopyalama başarısız</string>\n    <string name=\"error_deleting_repository\">Silme başarısız</string>\n    <string name=\"error_checking_starring_status\">Favorileme durumunu kontrol etme başarısız</string>\n    <string name=\"error_rendering_markdown\">Markdown görüntüleme başarısız</string>\n    <string name=\"error_users_search\">Kullanıcı arama başarısız</string>\n    <!--  -->\n\n\n    <!-- Loading messages -->\n    <string name=\"loading_gist\">Gist yükleniyor…</string>\n    <string name=\"loading_more_issues\">Daha fazla sorun yükleniyor…</string>\n    <string name=\"loading_issues\">Sorunlar yükleniyor…</string>\n    <string name=\"loading_comments\">Yorumlar yükleniyor…</string>\n    <string name=\"loading_repositories\">Projeler yükleniyor…</string>\n    <string name=\"loading_issue\">Sorun yükleniyor…</string>\n    <string name=\"loading_news\">Haberler yükleniyor…</string>\n    <string name=\"loading_followers\">Takipçiler yükleniyor…</string>\n    <string name=\"loading_people\">Kişiler yükleniyor…</string>\n    <string name=\"loading_gists\">Gist\\'ler yükleniyor…</string>\n    <string name=\"loading_collaborators\">Birlikte çalışılanlar yükleniyor…</string>\n    <string name=\"loading_milestones\">Dönüm noktaları yükleniyor…</string>\n    <string name=\"loading_labels\">Etiketler yükleniyor…</string>\n    <string name=\"loading_commits\">Gönderimler yükleniyor…</string>\n    <string name=\"loading_files_and_comments\">Dosyalar ve yorumlar yükleniyor…</string>\n    <string name=\"loading_refs\">Ayrımlar ve etiketler yükleniyor…</string>\n    <!--  -->\n\n\n     <!-- Empty messages -->\n    <string name=\"no_bookmarks\">Yer imi yok</string>\n    <string name=\"no_repositories\">Proje yok</string>\n    <string name=\"no_issues\">Sorun yok</string>\n    <string name=\"no_gists\">Gist yok</string>\n    <string name=\"no_people\">Kişi yok</string>\n    <string name=\"no_followers\">Takipçi yok</string>\n    <string name=\"no_members\">Üye yok</string>\n    <string name=\"no_news\">Haber yok</string>\n    <string name=\"no_commits\">Gönderim yok</string>\n    <!--  -->\n\n\n\n    <!-- Updating messages -->\n    <string name=\"updating_assignee\">Atanan güncelleniyor…</string>\n    <string name=\"updating_issue\">Sorun güncelleniyor…</string>\n    <string name=\"updating_labels\">Etiketler güncelleniyor…</string>\n    <string name=\"updating_milestone\">Dönüm noktası güncelleniyor…</string>\n    <!--  -->\n\n    <string name=\"home\">Ana sayfa</string>\n    <string name=\"news\">Haberler</string>\n    <string name=\"issues\">Sorunlar</string>\n    <string name=\"gists\">Gist\\'ler</string>\n    <string name=\"commits\">Gönderimler</string>\n    <string name=\"global_search\">GitHub arama</string>\n    <string name=\"find_repositories\">Proje Bul</string>\n    <string name=\"find_issues\">Sorun Bul</string>\n    <string name=\"search_title\">Ara…</string>\n    <string name=\"clear_search_history\">Geçmişi Sil</string>\n    <string name=\"search_history_cleared\">Arama geçmişi silindi</string>\n    <string name=\"login_activity_authenticating\">Giriş yapılıyor …</string>\n    <string name=\"creating_gist\">Gist oluşturuluyor…</string>\n    <string name=\"create\">Oluştur</string>\n    <string name=\"create_gist\">Gist Oluştur</string>\n    <string name=\"make_public\">Bu Gist\\'i herkese açık yap</string>\n    <string name=\"gist_file_name_hint\">file.rb</string>\n    <string name=\"gist\">Gist</string>\n    <string name=\"comments\">Yorumlar</string>\n    <string name=\"files\">Dosyalar</string>\n    <string name=\"open\">Aç</string>\n    <string name=\"random\">Rastgele</string>\n    <string name=\"file_name\">Dosya Adı</string>\n    <string name=\"file_content\">Dosya İçeriği</string>\n    <string name=\"new_gist\">Yeni Gist</string>\n    <string name=\"filter\">Filtrele</string>\n    <string name=\"bookmark\">Yer imlerine ekle</string>\n    <string name=\"comment\">Yorum yaz</string>\n    <string name=\"delete\">Sil</string>\n    <string name=\"delete_cap\">SİL</string>\n    <string name=\"refresh\">Yenile</string>\n    <string name=\"dashboard_issues_title\">Sorun Paneli</string>\n    <string name=\"bookmarks\">Yer imleri</string>\n    <string name=\"gists_title\">Gist\\’ler</string>\n    <string name=\"issue_title\">Sorun #</string>\n    <string name=\"pull_request_title\">Çekme Talebi #</string>\n    <string name=\"gist_title\">Gist\\u0020</string>\n    <string name=\"filter_issues_title\">Sorunları Filtrele</string>\n    <string name=\"create_comment_title\">Yorum yaz</string>\n    <string name=\"comment_hint\">Bir yorum yazın</string>\n    <string name=\"show_more\">Daha fazla…</string>\n    <string name=\"repositories\">Projeler</string>\n    <string name=\"contributors\">Katkı verenler</string>\n    <string name=\"issues_title\">Sorunlar</string>\n    <string name=\"edit_labels\">Etiketleri düzenle</string>\n    <string name=\"milestone_prefix\">Dönüm Noktası:</string>\n    <string name=\"edit_milestone\">Dönüm Noktası Düzenle</string>\n    <string name=\"edit_assignee\">Atanan Düzenle</string>\n    <string name=\"description\">Tanım</string>\n    <string name=\"gist_description_hint\">Android Gist oluşturdu</string>\n    <string name=\"title\">Başlık</string>\n    <string name=\"edit\">Düzenle</string>\n    <string name=\"starring_gist\">Gist Favorilere Ekleniyor…</string>\n    <string name=\"unstarring_gist\">Gist Favorilerden Kaldırılıyor…</string>\n    <string name=\"accounts_label\">Hesaplar</string>\n    <string name=\"select_assignee\">Atanan Seç</string>\n    <string name=\"select_milestone\">Dönüm Noktası Seç</string>\n    <string name=\"select_labels\">Etiketleri Seç</string>\n    <string name=\"select_ref\">Etiket ya da Ayrım Seç</string>\n    <string name=\"no_milestone\">Dönüm noktası yok</string>\n    <string name=\"unassigned\">Kimse atanmadı</string>\n    <string name=\"assigned\"> atandı</string>\n    <string name=\"no_gists_found\">Gist bulunamadı</string>\n    <string name=\"confirm_gist_delete_title\">Silmeyi onayla</string>\n    <string name=\"confirm_gist_delete_message\">Bu Gist\\'i silmek istediğinizden emin misiniz?</string>\n    <string name=\"deleting_gist\">Gist Siliniyor…</string>\n    <string name=\"creating_comment\">Yorum oluşturuluyor…</string>\n    <string name=\"editing_comment\">Yorum düzenleniyor…</string>\n    <string name=\"deleting_comment\">Yorum siliniyor…</string>\n    <string name=\"confirm_comment_delete_title\">Yorumu kaldır</string>\n    <string name=\"confirm_comment_delete_message\">ABu yorumu silmek istediğinizden emin misiniz?</string>\n    <string name=\"confirm_bookmark_delete_message\">Bu yer imini silmek istediğinizden emin misiniz?</string>\n    <string name=\"issue_dashboard\">Sorun Paneli</string>\n    <string name=\"new_issue\">Yeni Sorun</string>\n    <string name=\"anonymous\">Anonim</string>\n    <string name=\"message_filter_saved\">Sorun filtresi yer imlerine eklendi</string>\n    <string name=\"recently_viewed\">SON GÖRÜNTÜLENENLER</string>\n    <string name=\"recent\">En Son</string>\n    <string name=\"recent_remove\">En Sonu Kaldır</string>\n    <string name=\"recent_list_remove\">Son görüntülenlerden kaldır</string>\n    <string name=\"section_issue_status\">Durum:</string>\n    <string name=\"status_open\">Açık</string>\n    <string name=\"status_closed\">Kapalı</string>\n    <string name=\"section_issue_assigned\">Atandı:</string>\n    <string name=\"assignee_anyone\">Herhangi biri</string>\n    <string name=\"section_issue_milestone\">Dönüm Noktası:</string>\n    <string name=\"none\">Hiç</string>\n    <string name=\"section_issue_labels\">Etiketler:</string>\n    <string name=\"log_in\">Giriş yap</string>\n    <string name=\"signup_link\">GitHub\\'a yeni misin? &lt;a href=\\\"https://github.com/join\\\">Buraya tıkla&lt;/a> kayıt olmak için</string>\n    <string name=\"signup_link_two_factor_auth\">Emin değil misin? &lt;a href=\\\"https://help.github.com/articles/about-two-factor-authentication\\\">Yardım al.&lt;/a></string>\n    <string name=\"connection_failed\">GitHub\\’a bağlanılamadı</string>\n    <string name=\"code_authentication_failed\">Onay başarısız. Hatalı kod</string>\n    <string name=\"invalid_login_or_password\">Lütfen geçerli bir kullanıcı adı &amp; şifre girin</string>\n    <string name=\"invalid_password\">Lütfen geçerli bir şifre girin.</string>\n    <string name=\"password\">Şifre</string>\n    <string name=\"username_or_email\">Kullanıcı adı veya eposta</string>\n    <string name=\"followers\">Takipçiler</string>\n    <string name=\"following\">Takip Ettikleri</string>\n    <string name=\"followers_self\">Takipçilerim</string>\n    <string name=\"following_self\">Takip Ettiklerim</string>\n    <string name=\"follow\">Takip Et</string>\n    <string name=\"unfollow\">Takip Etmeyi Bırak</string>\n    <string name=\"star\">Favorilere ekle</string>\n    <string name=\"unstar\">Favorilerden çıkar</string>\n    <string name=\"fork\">Kopyala</string>\n    <string name=\"members\">Üyeler</string>\n    <string name=\"closing_issue\">Sorun Kapatılıyor…</string>\n    <string name=\"reopening_issue\">Sorun Tekrar Açılıyor…</string>\n    <string name=\"avatar\">Avatar</string>\n    <string name=\"creating_issue\">Sorun Oluşturuluyor…</string>\n    <string name=\"prefix_created\">oluşturuldu\\u0020</string>\n    <string name=\"prefix_updated\">güncellendi\\u0020</string>\n    <string name=\"prefix_opened\">açıldı\\u0020</string>\n    <string name=\"clear\">Temizle</string>\n    <string name=\"pull_request_commits\">Gönderimler: %d</string>\n    <string name=\"open_issues\">Açık Sorunlar</string>\n    <string name=\"closed_issues\">Kapanmış Sorunlar</string>\n    <string name=\"confirm_bookmark_delete_title\">Yer İmini Kaldır</string>\n    <string name=\"save\">Kaydet</string>\n    <string name=\"apply\">Uygula</string>\n    <string name=\"labels_prefix\">Etiketler:</string>\n    <string name=\"assignee\">Atanmış</string>\n    <string name=\"milestone\">Dönüm Noktası</string>\n    <string name=\"labels\">Etiketler</string>\n    <string name=\"issue_confirm_close_message\">Bu sorunu kapatmak istediğinizden emin misiniz?</string>\n    <string name=\"issue_confirm_reopen_message\">Bu sorunu tekrar açmak istediğinizden emin misiniz?</string>\n    <string name=\"issue_confirm_close_title\">Sorunu Kapat</string>\n    <string name=\"issue_confirm_reopen_title\">Sorunu Tekrar Aç</string>\n    <string name=\"closed\">Kapatıldı</string>\n    <string name=\"no_description_given\">Tanım belirtilmemiş.</string>\n    <string name=\"close\">Kapat</string>\n    <string name=\"reopen\">Tekrar Aç</string>\n    <string name=\"title_invalid_github_url\">Geçersiz GitHub URL\\'i</string>\n    <string name=\"message_invalid_github_url\">Belirtilen URL bu uygulama ile açılamadı:\\n{0}</string>\n    <string name=\"cancel\">İptal</string>\n    <string name=\"not_sure\">EMİN DEĞİLİM</string>\n    <string name=\"authenticator_conflict_title\">Uygulama Çakışması</string>\n    <string name=\"authenticator_conflict_message\">Kurulu olan başka bir uygulama GitHub kimlik doğrulaması için ayarlanmış.\\n\\nGitHub uygulamasının tekrar kullanılabilmesi için diğer uygulamayı Hesaplardan &amp; eş zamanlama ayarlarından kaldırmanız gerekmekte.</string>\n    <string name=\"opening_repository\">Açılıyor {0}…</string>\n    <string name=\"commit_compare_title\">Onaylama Karşılaştır</string>\n    <string name=\"commit_prefix\">Onay\\u0020</string>\n    <string name=\"parent_prefix\">Ana Onay\\u0020</string>\n    <string name=\"authored\">yazılmış</string>\n    <string name=\"committed\">onaylanmış</string>\n    <string name=\"diff_line_message\">Ne yapmak istiyorsun?</string>\n    <string name=\"comment_on_line\">Satıra yorum ekle</string>\n    <string name=\"view_entire_file\">Tüm dosyayı görüntüle</string>\n    <string name=\"comparing_commits\">{0} onay karşılaştırılıyor</string>\n    <string name=\"enable_wrapping\">Sözcük Kaydır</string>\n    <string name=\"disable_wrapping\">Sözcük Kaydırmayı Kapat</string>\n    <string name=\"code\">Kod</string>\n    <string name=\"following_user\">Takip ediliyor…</string>\n    <string name=\"unfollowing_user\">Takiptek çıkartılıyor…</string>\n    <string name=\"starring_repository\">Favorilere ekleniyor…</string>\n    <string name=\"unstarring_repository\">Favorilerden çıkartılıyor…</string>\n    <string name=\"forking_repository\">Kopyalanıyor…</string>\n    <string name=\"deleting_repository\">Siliniyor…</string>\n    <string name=\"navigate_to_user\">Ziyaret et %s</string>\n    <string name=\"contributions\">%d gönderim</string>\n\n    <!-- Tab titles, should be as short as possible -->\n    <string name=\"tab_repositories\">projeler</string>\n    <string name=\"tab_users\">kullanıcılar</string>\n    <string name=\"tab_news\">haberler</string>\n    <string name=\"tab_following_self\">takip edilenler</string>\n    <string name=\"tab_followers_self\">takipçiler</string>\n    <string name=\"tab_following\">takip edilenler</string>\n    <string name=\"tab_followers\">takipçiler</string>\n    <string name=\"tab_members\">üyeler</string>\n    <string name=\"tab_code\">kod</string>\n    <string name=\"tab_commits\">gönderim</string>\n    <string name=\"tab_issues\">sorunlar</string>\n    <string name=\"tab_watched\">izlenenler</string>\n    <string name=\"tab_assigned\">atananlar</string>\n    <string name=\"tab_created\">oluşturuldu</string>\n    <string name=\"tab_mentioned\">bahsedildi</string>\n    <string name=\"tab_mine\">benim</string>\n    <string name=\"tab_starred\">favoriler</string>\n    <string name=\"tab_all\">hepsi</string>\n    <!--  -->\n    <string name=\"share\">Paylaş</string>\n    <string name=\"show_password\">Şifreyi göster</string>\n    <string name=\"write\">Yaz</string>\n    <string name=\"preview\">Önizle</string>\n    <string name=\"show_raw_markdown\">Orjinal markdown göster</string>\n    <string name=\"render_markdown\">Markdown görüntüle</string>\n    <string name=\"copy_hash\">Hash\\’i kopyala</string>\n    <string name=\"toast_msg_copied\">Hafızaya kopyala</string>\n\n    <!-- Navigation drawer strings -->\n    <string name=\"navigation_drawer_open\">Navigasyon çekmecesini aç</string>\n    <string name=\"navigation_drawer_close\">Navigasyon çekmecesini kapat</string>\n    <string name=\"navigation_drawer_subheader\">Alt başlık</string>\n\n    <!-- Deleting repo -->\n    <string name=\"are_you_sure\">Kesinlikle emin misiniz?</string>\n    <string name=\"unexpected_bad_things\">Bu hareket geri ALINAMAZ.\n        Bu projeniz, wiki, sorunlar,\n        and yorumlar, ve tüm katkı sağlayanlar ile bağınızı silecek.</string>\n    <string name=\"delete_successful\">Proje silindi</string>\n    <string name=\"login_or_email\">Giriş ya da Eposta</string>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-uk/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<resources>\n\n    <!-- Error messages -->\n    <string name=\"error_orgs_load\">Помилка при завантаженні профіля та організацій</string>\n    <string name=\"error_issues_load\">Помилка при завантаженні завдань</string>\n    <string name=\"error_repos_load\">Помилка при завантаженні репозиторіїв</string>\n    <string name=\"error_repo_load\">Помилка при завантаженні репозиторія</string>\n    <string name=\"error_gist_load\">Помилка при завантаженні Gist</string>\n    <string name=\"error_news_load\">Помилка при завантаженні новин</string>\n    <string name=\"error_followers_load\">Помилка при завантаженні читачів</string>\n    <string name=\"error_people_load\">Помилка при завантаженні профілів</string>\n    <string name=\"error_person_load\">Помилка при завантаженні профіля</string>\n    <string name=\"error_gist_file_load\">Помилка при завантаженні вмісту Gist файла</string>\n    <string name=\"error_gists_load\">Помилка при завантаженні Gist-ів</string>\n    <string name=\"error_issue_load\">Помилка при завантаженні задачі</string>\n    <string name=\"error_collaborators_load\">Помилка при завантаженні учасників</string>\n    <string name=\"error_milestones_load\">Помилка при завантаженні етапів</string>\n    <string name=\"error_labels_load\">Помилка при завантаженні тегів</string>\n    <string name=\"error_bookmarks_load\">Помилка при завантаженні закладок</string>\n    <string name=\"error_members_load\">Помилка при завантаженні учасників</string>\n    <string name=\"error_commits_load\">Помилка при завантаженні комітів</string>\n    <string name=\"error_commit_load\">Помилка при завантаженні коміта</string>\n    <string name=\"error_file_load\">Помилка при завантаженні файла</string>\n    <string name=\"error_code_load\">Помилка при завантаженні коду</string>\n    <string name=\"error_refs_load\">Помилка при завантаженні гілок та тегів</string>\n    <string name=\"error_following_person\">Помилка при підписці</string>\n    <string name=\"error_unfollowing_person\">Помилка при відписці</string>\n    <string name=\"error_checking_following_status\">Помилка при перевірці підписки</string>\n    <string name=\"error_starring_repository\">Помилка при додаванні до улюблених</string>\n    <string name=\"error_unstarring_repository\">Помилка при видаленні із улюблених</string>\n    <string name=\"error_checking_starring_status\">Помилка при перевірці статуса</string>\n    <string name=\"error_rendering_markdown\">Помилка при рендерингу markdown</string>\n    <!--  -->\n\n\n    <!-- Loading messages -->\n    <string name=\"loading_gist\">Завантаження Gist…</string>\n    <string name=\"loading_more_issues\">Завантаження завдань…</string>\n    <string name=\"loading_issues\">Завантаження завдань…</string>\n    <string name=\"loading_comments\">Завантаження коментарів…</string>\n    <string name=\"loading_repositories\">Завантаження репозиторіїв…</string>\n    <string name=\"loading_issue\">Завантаження задачі…</string>\n    <string name=\"loading_news\">Завантаження новин…</string>\n    <string name=\"loading_followers\">Завантаження читачів…</string>\n    <string name=\"loading_people\">Завантаження профілів…</string>\n    <string name=\"loading_gists\">Завантаження Gist-ів…</string>\n    <string name=\"loading_collaborators\">Завантаження учасників…</string>\n    <string name=\"loading_milestones\">Завантаження етапів…</string>\n    <string name=\"loading_labels\">Завантаження тегів…</string>\n    <string name=\"loading_commits\">Завантаження комітів…</string>\n    <string name=\"loading_files_and_comments\">Завантаження файлів та коментарів…</string>\n    <string name=\"loading_refs\">Завантаження гілок та тегів…</string>\n    <!--  -->\n\n\n    <!-- Empty messages -->\n    <string name=\"no_bookmarks\">Немає закладок</string>\n    <string name=\"no_repositories\">Немає репозиторіїв</string>\n    <string name=\"no_issues\">Немає завдань</string>\n    <string name=\"no_gists\">Немає Gist-ів</string>\n    <string name=\"no_people\">Немає профілів</string>\n    <string name=\"no_followers\">Немає читачів</string>\n    <string name=\"no_members\">Немає учасників</string>\n    <string name=\"no_news\">Немає новин</string>\n    <string name=\"no_commits\">Немає комітів</string>\n    <!--  -->\n\n\n    <!-- Updating messages -->\n    <string name=\"updating_assignee\">Оновлення відповідального…</string>\n    <string name=\"updating_issue\">Оновлення задач…</string>\n    <string name=\"updating_labels\">Оновлення тегів…</string>\n    <string name=\"updating_milestone\">Оновлення етапу…</string>\n    <!--  -->\n\n    <string name=\"news\">Новини</string>\n    <string name=\"issues\">Задачі</string>\n    <string name=\"gists\">Gists</string>\n    <string name=\"commits\">Коміти</string>\n    <string name=\"find_repositories\">Знайти репозиторії</string>\n    <string name=\"find_issues\">Знайти задачі</string>\n    <string name=\"search_title\">Пошук…</string>\n    <string name=\"clear_search_history\">Очистити історію</string>\n    <string name=\"search_history_cleared\">Історія пошуку очищена</string>\n    <string name=\"login_activity_authenticating\">Автентифікація…</string>\n    <string name=\"creating_gist\">Створення Gist…</string>\n    <string name=\"create\">Створити</string>\n    <string name=\"create_gist\">Створити Gist</string>\n    <string name=\"make_public\">Зробити цей Gist публічним</string>\n    <string name=\"gist_file_name_hint\">file.rb</string>\n    <string name=\"gist\">Gist</string>\n    <string name=\"comments\">Коментарі</string>\n    <string name=\"files\">Файли</string>\n    <string name=\"open\">Відкрити</string>\n    <string name=\"random\">Випадковий</string>\n    <string name=\"file_name\">Назва файла</string>\n    <string name=\"file_content\">Вміст файла</string>\n    <string name=\"new_gist\">Новий Gist</string>\n    <string name=\"filter\">Фільтр</string>\n    <string name=\"bookmark\">Закладка</string>\n    <string name=\"comment\">Коментар</string>\n    <string name=\"delete\">Видалити</string>\n    <string name=\"refresh\">Оновити</string>\n    <string name=\"dashboard_issues_title\">Дошка завдань</string>\n    <string name=\"bookmarks\">Закладки</string>\n    <string name=\"gists_title\">Gists</string>\n    <string name=\"issue_title\">Завдання #</string>\n    <string name=\"pull_request_title\">Pull Request #</string>\n    <string name=\"gist_title\">Gist\\u0020</string>\n    <string name=\"filter_issues_title\">Фільтр завдань</string>\n    <string name=\"create_comment_title\">Створити коментар</string>\n    <string name=\"comment_hint\">Введіть коментар</string>\n    <string name=\"show_more\">Показати більше…</string>\n    <string name=\"repositories\">Репозиторії</string>\n    <string name=\"issues_title\">Завдання</string>\n    <string name=\"edit_labels\">Редагувати теги</string>\n    <string name=\"milestone_prefix\">Етап:</string>\n    <string name=\"edit_milestone\">Редагувати етап</string>\n    <string name=\"edit_assignee\">Редагувати відповідального</string>\n    <string name=\"description\">Опис</string>\n    <string name=\"gist_description_hint\">Gist створений на Android</string>\n    <string name=\"title\">Заголовок</string>\n    <string name=\"edit\">Редагувати</string>\n    <string name=\"starring_gist\">Відмічаємо Gist як улюблений…</string>\n    <string name=\"unstarring_gist\">Видалення Gist із улюблених…</string>\n    <string name=\"accounts_label\">Профілі</string>\n    <string name=\"select_assignee\">Відповідальний</string>\n    <string name=\"select_milestone\">Етап</string>\n    <string name=\"select_labels\">Теги</string>\n    <string name=\"select_ref\">Гілка або тег</string>\n    <string name=\"no_milestone\">Не входить до жодного із етапів</string>\n    <string name=\"unassigned\">Немає відповідального</string>\n    <string name=\"assigned\">відповідальний</string>\n    <string name=\"no_gists_found\">Gist-и не знайдені</string>\n    <string name=\"confirm_gist_delete_title\">Підтвердити видалення</string>\n    <string name=\"confirm_gist_delete_message\">Ви впевнені, що хочете видалити цей Gist?</string>\n    <string name=\"deleting_gist\">Видалення Gist…</string>\n    <string name=\"creating_comment\">Створення коментаря…</string>\n    <string name=\"confirm_bookmark_delete_message\">Ви впевнені, що хочете видалити цю закладку?</string>\n    <string name=\"issue_dashboard\">Дошка завдань</string>\n    <string name=\"new_issue\">Нове завдання</string>\n    <string name=\"anonymous\">Анонім</string>\n    <string name=\"message_filter_saved\">Фільтр завдань збережено до закладок</string>\n    <string name=\"recent\">Нещодавні</string>\n    <string name=\"section_issue_status\">Статус:</string>\n    <string name=\"status_open\">Відкритий</string>\n    <string name=\"status_closed\">Закритий</string>\n    <string name=\"section_issue_assigned\">Відповідальний:</string>\n    <string name=\"assignee_anyone\">Будь-хто</string>\n    <string name=\"section_issue_milestone\">Етап:</string>\n    <string name=\"none\">Немає</string>\n    <string name=\"section_issue_labels\">Теги:</string>\n    <string name=\"log_in\">Увійти</string>\n    <string name=\"signup_link\">Вперше на GitHub? &lt;a href=\\\"https://github.com/join\\\">Натисніть сюди&lt;/a>, щоб зареєструватись</string>\n    <string name=\"connection_failed\">Неможливо з\\'єднатись із GitHub</string>\n    <string name=\"invalid_login_or_password\">Введіть правильні логін та пароль</string>\n    <string name=\"invalid_password\">Введіть правильний пароль.</string>\n    <string name=\"password\">Пароль</string>\n    <string name=\"login_or_email\">Логін або пошта</string>\n    <string name=\"followers\">Читачі</string>\n    <string name=\"following\">Підписки</string>\n    <string name=\"followers_self\">Читачі</string>\n    <string name=\"following_self\">Підписки</string>\n    <string name=\"follow\">Підписатись</string>\n    <string name=\"unfollow\">Відписатись</string>\n    <string name=\"star\">Додати до улюблених</string>\n    <string name=\"unstar\">Видалити із улюблених</string>\n    <string name=\"members\">Учасники</string>\n    <string name=\"closing_issue\">Закриття завдання…</string>\n    <string name=\"reopening_issue\">Відкриття завдання…</string>\n    <string name=\"avatar\">Аватар</string>\n    <string name=\"creating_issue\">Створення завдання…</string>\n    <string name=\"prefix_created\">створено\\u0020</string>\n    <string name=\"prefix_updated\">оновлено\\u0020</string>\n    <string name=\"prefix_opened\">відкрито\\u0020</string>\n    <string name=\"clear\">Очистити</string>\n    <string name=\"open_issues\">Відкриті завдання</string>\n    <string name=\"closed_issues\">Закриті завдання</string>\n    <string name=\"confirm_bookmark_delete_title\">Видалити закладку</string>\n    <string name=\"save\">Зберегти</string>\n    <string name=\"apply\">Ок</string>\n    <string name=\"labels_prefix\">Теги:</string>\n    <string name=\"assignee\">Відповідальний</string>\n    <string name=\"milestone\">Етап</string>\n    <string name=\"labels\">Теги</string>\n    <string name=\"issue_confirm_close_message\">Ви впевнені, що хочете закрити це завдання?</string>\n    <string name=\"issue_confirm_reopen_message\">Ви впевнені, що хочете відкрити це завдання?</string>\n    <string name=\"issue_confirm_close_title\">Закрити завдання</string>\n    <string name=\"issue_confirm_reopen_title\">Відкрити завдання</string>\n    <string name=\"closed\">Закрито</string>\n    <string name=\"no_description_given\">Немає опису.</string>\n    <string name=\"close\">Закрити</string>\n    <string name=\"reopen\">Відкрити</string>\n    <string name=\"title_invalid_github_url\">Неправильний URL GitHub</string>\n    <string name=\"message_invalid_github_url\">Цей URL неможливо відкрити додатком:\\n{0}</string>\n    <string name=\"recently_viewed\">НЕЩОДАВНО ПЕРЕГЛЯНУТІ</string>\n    <string name=\"cancel\">Скасувати</string>\n    <string name=\"authenticator_conflict_title\">Конфлікт додатка</string>\n    <string name=\"authenticator_conflict_message\">Інший додаток вже налаштовано для автентифікації на GitHub.\\n\\nВи повинні видалити його із налаштувань \"Облікові записи й синхронізація\" та видалити його з телефону, щоб використовувати додаток GitHub.</string>\n    <string name=\"opening_repository\">Відкриття {0}…</string>\n    <string name=\"commit_compare_title\">Порівняння комітів</string>\n    <string name=\"commit_prefix\">Коміт\\u0020</string>\n    <string name=\"parent_prefix\">Попередній\\u0020</string>\n    <string name=\"authored\">автор</string>\n    <string name=\"committed\">закомічено</string>\n    <string name=\"diff_line_message\">Що ви хочете зробити?</string>\n    <string name=\"comment_on_line\">Коментувати рядок</string>\n    <string name=\"view_entire_file\">Переглянути весь файл</string>\n    <string name=\"comparing_commits\">Порівняння {0} комітів</string>\n    <string name=\"enable_wrapping\">Увімкнути перенесення рядків</string>\n    <string name=\"disable_wrapping\">Вимкнути перенесення рядків</string>\n    <string name=\"code\">Код</string>\n    <string name=\"following_user\">Підписка…</string>\n    <string name=\"unfollowing_user\">Відписка…</string>\n    <string name=\"starring_repository\">Додавання до улюблених…</string>\n    <string name=\"unstarring_repository\">Видалення із улюблених…</string>\n\n    <!-- Tab titles, should be as short as possible -->\n    <string name=\"tab_repositories\">репозиторії</string>\n    <string name=\"tab_news\">новини</string>\n    <string name=\"tab_following_self\">підписки</string>\n    <string name=\"tab_followers_self\">читачі</string>\n    <string name=\"tab_following\">підписки</string>\n    <string name=\"tab_followers\">читачі</string>\n    <string name=\"tab_members\">учасники</string>\n    <string name=\"tab_code\">код</string>\n    <string name=\"tab_commits\">коміти</string>\n    <string name=\"tab_issues\">завдання</string>\n    <string name=\"tab_watched\">слідкую</string>\n    <string name=\"tab_assigned\">призначені</string>\n    <string name=\"tab_created\">створені</string>\n    <string name=\"tab_mentioned\">згаданий</string>\n    <string name=\"tab_mine\">мої</string>\n    <string name=\"tab_starred\">улюблені</string>\n    <string name=\"tab_all\">всі</string>\n    <!--  -->\n    <string name=\"share\">Поділитись</string>\n    <string name=\"show_password\">Показати пароль</string>\n    <string name=\"write\">Написати</string>\n    <string name=\"preview\">Переглянути</string>\n    <string name=\"show_raw_markdown\">Показати код markdown</string>\n    <string name=\"render_markdown\">Відмалювати markdown</string>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-v21/dimens.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     http://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<resources>\n    <dimen name=\"toolbar_top_padding\">24dp</dimen>\n    <dimen name=\"nav_drawer_header_height\">178dp</dimen>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-v23/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     http://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<resources>\n\n    <style name=\"ListIcon\" parent=\"TextIcon\">\n        <item name=\"android:textSize\">14sp</item>\n        <item name=\"android:layout_marginTop\">0dp</item>\n        <item name=\"android:maxHeight\">18dp</item>\n    </style>\n\n    <style name=\"EventIcon\" parent=\"TextIcon\">\n        <item name=\"android:textSize\">22sp</item>\n        <item name=\"android:layout_marginTop\">0dp</item>\n        <item name=\"android:maxHeight\">28dp</item>\n    </style>\n\n    <style name=\"PrimaryIcon\" parent=\"TextIcon\">\n        <item name=\"android:layout_marginTop\">0dp</item>\n        <item name=\"android:textSize\">28sp</item>\n        <item name=\"android:maxHeight\">35dp</item>\n    </style>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-zh-rCN/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<resources>\n\n    <!-- Error messages -->\n    <string name=\"error_orgs_load\">账户和组织信息加载失败</string>\n    <string name=\"error_issues_load\">Issue 列表加载失败</string>\n    <string name=\"error_repos_load\">版本库列表加载失败</string>\n    <string name=\"error_repo_load\">版本库加载失败</string>\n    <string name=\"error_contributors_load\">贡献者列表加载失败</string>\n    <string name=\"error_gist_load\">Gist 加载失败</string>\n    <string name=\"error_news_load\">新鲜事加载失败</string>\n    <string name=\"error_followers_load\">关注我的用户列表加载失败</string>\n    <string name=\"error_people_load\">用户列表加载失败</string>\n    <string name=\"error_person_load\">用户信息加载失败</string>\n    <string name=\"error_gist_file_load\">Gist 文件内容加载失败</string>\n    <string name=\"error_gists_load\">Gist 列表加载失败</string>\n    <string name=\"error_issue_load\">Issue 信息加载失败</string>\n    <string name=\"error_collaborators_load\">协作者加载失败</string>\n    <string name=\"error_milestones_load\">里程碑加载失败</string>\n    <string name=\"error_labels_load\">Issue 标签加载失败</string>\n    <string name=\"error_bookmarks_load\">书签加载失败</string>\n    <string name=\"error_members_load\">成员加载失败</string>\n    <string name=\"error_commits_load\">提交列表加载失败</string>\n    <string name=\"error_commit_load\">提交加载失败</string>\n    <string name=\"error_file_load\">文件加载失败</string>\n    <string name=\"error_code_load\">代码加载失败</string>\n    <string name=\"error_refs_load\">分支与标签加载失败</string>\n    <string name=\"error_following_person\">关注失败</string>\n    <string name=\"error_unfollowing_person\">取消关注失败</string>\n    <string name=\"error_checking_following_status\">关注状态检查失败</string>\n    <string name=\"error_starring_repository\">星标加注失败</string>\n    <string name=\"error_unstarring_repository\">星标移除失败</string>\n    <string name=\"error_forking_repository\">Fork失败</string>\n    <string name=\"error_deleting_repository\">删除失败</string>\n    <string name=\"error_checking_starring_status\">加注星标状态检查失败</string>\n    <string name=\"error_rendering_markdown\">Markdown 渲染失败</string>\n    <string name=\"error_users_search\">搜索用户失败</string>\n    <!--  -->\n\n\n    <!-- Loading messages -->\n    <string name=\"loading_gist\">加载 Gist…</string>\n    <string name=\"loading_more_issues\">加载更多 Issue…</string>\n    <string name=\"loading_issues\">加载 Issue 列表…</string>\n    <string name=\"loading_comments\">加载评论…</string>\n    <string name=\"loading_repositories\">加载版本库列表…</string>\n    <string name=\"loading_issue\">加载 Issue…</string>\n    <string name=\"loading_news\">加载新鲜事…</string>\n    <string name=\"loading_followers\">加载用户列表…</string>\n    <string name=\"loading_people\">加载用户列表…</string>\n    <string name=\"loading_gists\">加载 Gist 列表…</string>\n    <string name=\"loading_collaborators\">加载协作者…</string>\n    <string name=\"loading_milestones\">加载里程碑…</string>\n    <string name=\"loading_labels\">加载 Issue 标签…</string>\n    <string name=\"loading_commits\">加载提交…</string>\n    <string name=\"loading_files_and_comments\">加载文件与评论…</string>\n    <string name=\"loading_refs\">加载分支与标签…</string>\n    <!--  -->\n\n\n    <!-- Empty messages -->\n    <string name=\"no_bookmarks\">暂无书签</string>\n    <string name=\"no_repositories\">暂无版本库</string>\n    <string name=\"no_contributors\">暂无贡献者</string>\n    <string name=\"no_issues\">暂无 Issue</string>\n    <string name=\"no_gists\">暂无 Gist</string>\n    <string name=\"no_people\">暂无用户</string>\n    <string name=\"no_followers\">暂无关注我的用户</string>\n    <string name=\"no_members\">暂无成员</string>\n    <string name=\"no_news\">暂无新鲜事</string>\n    <string name=\"no_commits\">暂无提交</string>\n    <!--  -->\n\n\n    <!-- Updating messages -->\n    <string name=\"updating_assignee\">被指派人信息更新中…</string>\n    <string name=\"updating_issue\">Issue 更新中…</string>\n    <string name=\"updating_labels\">Issue 标签信息更新中…</string>\n    <string name=\"updating_milestone\">里程碑信息更新中…</string>\n    <!--  -->\n    <string name=\"home\">主页</string>\n    <string name=\"log_out\">注销</string>\n    <string name=\"news\">新鲜事</string>\n    <string name=\"issues\">Issues</string>\n    <string name=\"gists\">Gists</string>\n    <string name=\"commits\">提交</string>\n    <string name=\"global_search\">搜索 GitHub</string>\n    <string name=\"find_repositories\">查询版本库</string>\n    <string name=\"find_issues\">查询 Issue </string>\n    <string name=\"search_title\">搜索…</string>\n    <string name=\"clear_search_history\">清空搜索历史</string>\n    <string name=\"search_history_cleared\">搜索历史已清空</string>\n    <string name=\"login_activity_authenticating\">登录中…</string>\n    <string name=\"loading_user\">加载用户信息中…</string>\n    <string name=\"creating_gist\">Gist 创建中…</string>\n    <string name=\"create\">创建</string>\n    <string name=\"create_gist\">创建 Gist</string>\n    <string name=\"make_public\">公开这个 Gist</string>\n    <string name=\"gist_file_name_hint\">file.rb</string>\n    <string name=\"gist\">Gist</string>\n    <string name=\"comments\">评论</string>\n    <string name=\"files\">文件</string>\n    <string name=\"open\">打开</string>\n    <string name=\"random\">随机</string>\n    <string name=\"file_name\">文件名</string>\n    <string name=\"file_content\">文件内容</string>\n    <string name=\"new_gist\">新 Gist</string>\n    <string name=\"filter\">过滤器</string>\n    <string name=\"bookmark\">书签</string>\n    <string name=\"comment\">评论</string>\n    <string name=\"delete\">删除</string>\n    <string name=\"delete_cap\">删除</string>\n    <string name=\"refresh\">刷新</string>\n    <string name=\"dashboard_issues_title\">Issue 面板</string>\n    <string name=\"bookmarks\">书签</string>\n    <string name=\"gists_title\">Gist 列表</string>\n    <string name=\"issue_title\">Issue #</string>\n    <string name=\"pull_request_title\">Pull Request #</string>\n    <string name=\"gist_title\">Gist\\u0020</string>\n    <string name=\"filter_issues_title\">过滤 Issue</string>\n    <string name=\"create_comment_title\">发表评论</string>\n    <string name=\"comment_hint\">输入评论</string>\n    <string name=\"show_more\">显示更多…</string>\n    <string name=\"repositories\">版本库</string>\n    <string name=\"contributors\">贡献者</string>\n    <string name=\"issues_title\">Issue</string>\n    <string name=\"edit_labels\">编辑 Issue 标签</string>\n    <string name=\"milestone_prefix\">里程碑:</string>\n    <string name=\"edit_milestone\">编辑里程碑</string>\n    <string name=\"edit_assignee\">编辑被指派人</string>\n    <string name=\"description\">描述</string>\n    <string name=\"gist_description_hint\">从 Android 创建的 Gist</string>\n    <string name=\"title\">标题</string>\n    <string name=\"edit\">编辑</string>\n    <string name=\"starring_gist\">为 Gist 加注星标…</string>\n    <string name=\"unstarring_gist\">为 Gist 移除星标…</string>\n    <string name=\"accounts_label\">账户</string>\n    <string name=\"select_assignee\">选择被指派人</string>\n    <string name=\"select_milestone\">选择里程碑</string>\n    <string name=\"select_labels\">选择 Issue 标签</string>\n    <string name=\"select_ref\">选择分支或标签</string>\n    <string name=\"no_milestone\">暂无里程碑</string>\n    <string name=\"unassigned\">无人被指派</string>\n    <string name=\"assigned\">被指派</string>\n    <string name=\"no_gists_found\">找不到 Gist</string>\n    <string name=\"confirm_gist_delete_title\">确认删除</string>\n    <string name=\"confirm_gist_delete_message\">确定要删除这条 Gist 吗?</string>\n    <string name=\"deleting_gist\">正在删除 Gist…</string>\n    <string name=\"creating_comment\">评论发表中…</string>\n    <string name=\"editing_comment\">编辑评论…</string>\n    <string name=\"deleting_comment\">删除评论中…</string>\n    <string name=\"confirm_comment_delete_title\">删除评论</string>\n    <string name=\"confirm_comment_delete_message\">你确定删除这条评论吗？</string>\n    <string name=\"confirm_bookmark_delete_message\">确定要移除这个书签吗?</string>\n    <string name=\"issue_dashboard\"> Issue 面板</string>\n    <string name=\"new_issue\">新 Issue</string>\n    <string name=\"anonymous\">匿名</string>\n    <string name=\"message_filter_saved\">Issue 过滤器已保存至书签</string>\n    <string name=\"recently_viewed\">近期浏览过的</string>\n    <string name=\"recent\">最近的</string>\n    <string name=\"recent_remove\">删除最近</string>\n    <string name=\"recent_list_remove\">删除最近使用</string>\n    <string name=\"section_issue_status\">状态:</string>\n    <string name=\"status_open\">开放</string>\n    <string name=\"status_closed\">关闭</string>\n    <string name=\"section_issue_assigned\">指派给:</string>\n    <string name=\"assignee_anyone\">任何人</string>\n    <string name=\"section_issue_milestone\">里程碑:</string>\n    <string name=\"none\">无</string>\n    <string name=\"section_issue_labels\">Issue 标签:</string>\n    <string name=\"log_in\">登录</string>\n    <string name=\"signup_link\">刚刚接触 GitHub? &lt;a href=\\\"https://github.com/plans\\\">点这里&lt;/a>注册</string>\n    <string name=\"signup_link_two_factor_auth\">不知道该怎么办？ &lt;a href=\\\"https://help.github.com/articles/about-two-factor-authentication\\\">获取帮助。&lt;/a></string>\n    <string name=\"connection_failed\">无法连接到 GitHub</string>\n    <string name=\"code_authentication_failed\">授权失败！错误的验证码</string>\n    <string name=\"invalid_login_or_password\">请输入正确的登录名和密码。</string>\n    <string name=\"invalid_password\">请输入正确的密码。</string>\n    <string name=\"password\">密码</string>\n    <string name=\"username_or_email\">登录名 / 电子邮件</string>\n    <string name=\"followers\">关注Ta的</string>\n    <string name=\"following\">Ta关注的</string>\n    <string name=\"followers_self\">关注我的</string>\n    <string name=\"following_self\">我关注的</string>\n    <string name=\"follow\">关注</string>\n    <string name=\"unfollow\">取消关注</string>\n    <string name=\"star\">加注星标</string>\n    <string name=\"unstar\">移除星标</string>\n    <string name=\"members\">成员</string>\n    <string name=\"closing_issue\">正在关闭 Issue…</string>\n    <string name=\"reopening_issue\">正在重新开放 Issue…</string>\n    <string name=\"avatar\">头像</string>\n    <string name=\"creating_issue\">正在创建 Issue…</string>\n    <string name=\"prefix_created\">创建了\\u0020</string>\n    <string name=\"prefix_updated\">更新了\\u0020</string>\n    <string name=\"prefix_opened\">开放了\\u0020</string>\n    <string name=\"clear\">清除</string>\n    <string name=\"pull_request_commits\">提交: %d</string>\n    <string name=\"open_issues\">开放中的 Issue</string>\n    <string name=\"closed_issues\">已关闭的 Issue</string>\n    <string name=\"confirm_bookmark_delete_title\">删除书签</string>\n    <string name=\"save\">保存</string>\n    <string name=\"apply\">应用</string>\n    <string name=\"labels_prefix\">Issue 标签:</string>\n    <string name=\"assignee\">被指派人</string>\n    <string name=\"milestone\">里程碑</string>\n    <string name=\"labels\">Issue 标签</string>\n    <string name=\"issue_confirm_close_message\">确定要关闭这个 Issue 吗?</string>\n    <string name=\"issue_confirm_reopen_message\">确定要重新开启这个 Issue 吗?</string>\n    <string name=\"issue_confirm_close_title\">关闭 Issue</string>\n    <string name=\"issue_confirm_reopen_title\">重新开放 Issue</string>\n    <string name=\"closed\">关闭的</string>\n    <string name=\"no_description_given\">暂无描述。</string>\n    <string name=\"close\">关闭</string>\n    <string name=\"reopen\">重新开放</string>\n    <string name=\"title_invalid_github_url\">无效的 GitHub URL</string>\n    <string name=\"message_invalid_github_url\">无法打开以下 URL:\\n{0}</string>\n    <string name=\"cancel\">取消</string>\n    <string name=\"not_sure\">不确定</string>\n    <string name=\"authenticator_conflict_title\">应用冲突</string>\n    <string name=\"authenticator_conflict_message\">GitHub 认证已配置为安装的另一个应用使用。\\n\\n您必须从“账户与同步”设置中移除那个应用并将其卸载，才能使用本应用。</string>\n    <string name=\"opening_repository\">正在打开 {0}…</string>\n    <string name=\"commit_compare_title\">提交比较</string>\n    <string name=\"commit_prefix\">提交\\u0020</string>\n    <string name=\"parent_prefix\">先导\\u0020</string>\n    <string name=\"authored\">作于</string>\n    <string name=\"committed\">提交于</string>\n    <string name=\"diff_line_message\">您想做什么？</string>\n    <string name=\"comment_on_line\">评论此行</string>\n    <string name=\"view_entire_file\">查看整个文件</string>\n    <string name=\"comparing_commits\">比较 {0} 个提交</string>\n    <string name=\"enable_wrapping\">启用自动折行</string>\n    <string name=\"disable_wrapping\">禁用自动折行</string>\n    <string name=\"code\">代码</string>\n    <string name=\"following_user\">正在关注…</string>\n    <string name=\"unfollowing_user\">正在取消关注…</string>\n    <string name=\"starring_repository\">正在加注星标…</string>\n    <string name=\"unstarring_repository\">正在移除星标…</string>\n    <string name=\"deleting_repository\">删除中…</string>\n    <string name=\"contributions\">%d 提交</string>\n\n    <!-- Tab titles, should be as short as possible -->\n    <string name=\"tab_repositories\">版本库</string>\n    <string name=\"tab_users\">用户</string>\n    <string name=\"tab_news\">新鲜事</string>\n    <string name=\"tab_following_self\">我关注的</string>\n    <string name=\"tab_followers_self\">关注我的</string>\n    <string name=\"tab_following\">Ta关注的</string>\n    <string name=\"tab_followers\">关注Ta的</string>\n    <string name=\"tab_members\">成员</string>\n    <string name=\"tab_code\">代码</string>\n    <string name=\"tab_commits\">提交</string>\n    <string name=\"tab_issues\">issues</string>\n    <string name=\"tab_watched\">我关注的</string>\n    <string name=\"tab_assigned\">指派给我的</string>\n    <string name=\"tab_created\">我创建的</string>\n    <string name=\"tab_mentioned\">提到我的</string>\n    <string name=\"tab_mine\">我的</string>\n    <string name=\"tab_starred\">已加星标</string>\n    <string name=\"tab_all\">所有</string>\n    <!--  -->\n    <string name=\"share\">分享</string>\n    <string name=\"show_password\">显示密码</string>\n    <string name=\"write\">书写</string>\n    <string name=\"preview\">预览</string>\n    <string name=\"show_raw_markdown\">显示 markdown 源码</string>\n    <string name=\"render_markdown\">渲染 markdown</string>\n    <string name=\"copy_hash\">复制哈希</string>\n    <string name=\"toast_msg_copied\">已复制到剪贴板</string>\n\n    <!-- Deleting repo -->\n    <string name=\"are_you_sure\">真的确定要删除吗？</string>\n    <string name=\"unexpected_bad_things\">repository、wiki、issue以及comment都将被永久地删除，并且无法恢复。同时，也会移除所有的协作关系。</string>\n    <string name=\"delete_successful\">版本库已删除</string>\n    <string name=\"login_or_email\">账号或电子邮箱</string>\n\n    <string name=\"temporary_login_message\"><b>现在的授权过程是通过网页方式进行的，点击登录按钮以继续。</b>\n        \\n\\n 由于Github添加了对第三方应用的限制，所以我们不能写成明确的组织。你可以从这里获取更多信息：\\n\n        https://help.github.com/articles/about-third-party-application-restrictions/</string>\n    <string name=\"organizations\">组织</string>\n    <string name=\"error_oauth_not_configured\">你无法登陆，因为还没有设置认证客户端和秘钥\n阅读README.md: https://github.com/pockethub/PocketHub#setup-environment</string>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-zh-rTW/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<resources>\n    <!-- Error messages -->\n    <string name=\"error_orgs_load\">帳戶與組織載入失敗</string>\n    <string name=\"error_issues_load\">Issue 列表載入失敗</string>\n    <string name=\"error_repos_load\">檔案庫列表載入失敗</string>\n    <string name=\"error_repo_load\">檔案庫載入失敗</string>\n    <string name=\"error_gist_load\">Gist 載入失敗</string>\n    <string name=\"error_news_load\">新聞載入失敗</string>\n    <string name=\"error_followers_load\">追隨我的用戶列表載入失敗</string>\n    <string name=\"error_people_load\">我追隨的用戶列表載入失敗</string>\n    <string name=\"error_person_load\">個人資訊載入失敗</string>\n    <string name=\"error_gist_file_load\">Gist 檔案內容載入失敗</string>\n    <string name=\"error_gists_load\">Gist 列表載入失敗</string>\n    <string name=\"error_issue_load\">Issue 載入失敗</string>\n    <string name=\"error_collaborators_load\">協作者載入失敗</string>\n    <string name=\"error_milestones_load\">里程碑載入失敗</string>\n    <string name=\"error_labels_load\">標籤載入失敗</string>\n    <string name=\"error_bookmarks_load\">書籤載入失敗</string>\n    <string name=\"error_members_load\">成員載入失敗</string>\n    <string name=\"error_commits_load\">提交列表載入失敗</string>\n    <string name=\"error_commit_load\">提交載入失敗</string>\n    <string name=\"error_file_load\">檔案載入失敗</string>\n    <string name=\"error_code_load\">原始碼載入失敗</string>\n    <string name=\"error_refs_load\">分支與標記載入失敗</string>\n    <!--  -->\n    <!-- Loading messages -->\n    <string name=\"loading_gist\">正在載入 Gist…</string>\n    <string name=\"loading_more_issues\">正在載入更多的 Issue…</string>\n    <string name=\"loading_issues\">正在載入 Issue 列表…</string>\n    <string name=\"loading_comments\">正在載入評論…</string>\n    <string name=\"loading_repositories\">正在載入檔案庫…</string>\n    <string name=\"loading_issue\">正在載入 Issue…</string>\n    <string name=\"loading_news\">正在載入新聞…</string>\n    <string name=\"loading_followers\">正在載入追隨我的用戶列表…</string>\n    <string name=\"loading_people\">正在載入我追隨的用戶列表…</string>\n    <string name=\"loading_gists\">正在載入 Gist 列表…</string>\n    <string name=\"loading_collaborators\">正在載入協作者…</string>\n    <string name=\"loading_milestones\">正在載入里程碑…</string>\n    <string name=\"loading_labels\">正在載入標籤…</string>\n    <string name=\"loading_commits\">正在載入提交…</string>\n    <string name=\"loading_files_and_comments\">正在載入檔案與評論…</string>\n    <string name=\"loading_refs\">正在載入分支與標記…</string>\n    <!--  -->\n    <!-- Empty messages -->\n    <string name=\"no_bookmarks\">沒有書籤</string>\n    <string name=\"no_repositories\">沒有檔案庫</string>\n    <string name=\"no_issues\">沒有 Issue</string>\n    <string name=\"no_gists\">沒有 Gist</string>\n    <string name=\"no_people\">沒有追隨任何用戶</string>\n    <string name=\"no_followers\">沒有追隨我的用戶</string>\n    <string name=\"no_members\">沒有成員</string>\n    <string name=\"no_news\">沒有新聞</string>\n    <string name=\"no_commits\">沒有提交</string>\n    <!--  -->\n    <!-- Updating messages -->\n    <string name=\"updating_assignee\">正在更新被指派人…</string>\n    <string name=\"updating_issue\">正在更新 Issue…</string>\n    <string name=\"updating_labels\">正在更新標籤…</string>\n    <string name=\"updating_milestone\">正在更新里程碑…</string>\n    <!--  -->\n    <string name=\"news\">新聞</string>\n    <string name=\"issues\">Issues</string>\n    <string name=\"gists\">Gists</string>\n    <string name=\"commits\">提交</string>\n    <string name=\"find_repositories\">尋找檔案庫</string>\n    <string name=\"find_issues\">尋找 Issues</string>\n    <string name=\"search_title\">搜尋…</string>\n    <string name=\"clear_search_history\">清除搜尋歷程</string>\n    <string name=\"search_history_cleared\">搜尋歷程已清空</string>\n    <string name=\"login_activity_authenticating\">正在登入…</string>\n    <string name=\"creating_gist\">正在建立 Gist…</string>\n    <string name=\"create\">建立</string>\n    <string name=\"create_gist\">建立 Gist</string>\n    <string name=\"make_public\">公開這個 Gist</string>\n    <string name=\"gist_file_name_hint\">file.rb</string>\n    <string name=\"gist\">Gist</string>\n    <string name=\"comments\">評論</string>\n    <string name=\"files\">檔案</string>\n    <string name=\"open\">打開</string>\n    <string name=\"random\">隨機</string>\n    <string name=\"file_name\">檔案名稱</string>\n    <string name=\"file_content\">檔案內容</string>\n    <string name=\"new_gist\">新 Gist</string>\n    <string name=\"filter\">篩選器</string>\n    <string name=\"bookmark\">書籤</string>\n    <string name=\"comment\">評論</string>\n    <string name=\"delete\">刪除</string>\n    <string name=\"refresh\">重新整理</string>\n    <string name=\"dashboard_issues_title\">Issue 儀表板</string>\n    <string name=\"bookmarks\">書籤</string>\n    <string name=\"gists_title\">Gist 列表</string>\n    <string name=\"issue_title\">Issue #</string>\n    <string name=\"pull_request_title\">Pull Request #</string>\n    <string name=\"gist_title\">Gist\\u0020</string>\n    <string name=\"filter_issues_title\">篩選 Issues</string>\n    <string name=\"create_comment_title\">建立評論</string>\n    <string name=\"comment_hint\">輸入評論</string>\n    <string name=\"show_more\">顯示更多…</string>\n    <string name=\"repositories\">檔案庫</string>\n    <string name=\"issues_title\">Issues</string>\n    <string name=\"edit_labels\">編輯標簽</string>\n    <string name=\"milestone_prefix\">里程碑:</string>\n    <string name=\"edit_milestone\">編輯里程碑</string>\n    <string name=\"edit_assignee\">編輯被指派人</string>\n    <string name=\"description\">描述</string>\n    <string name=\"gist_description_hint\">從 Android 建立的 Gist</string>\n    <string name=\"title\">標題</string>\n    <string name=\"edit\">編輯</string>\n    <string name=\"star\">加星號</string>\n    <string name=\"starring_gist\">正在為 Gist 加星號…</string>\n    <string name=\"unstar\">移除星號</string>\n    <string name=\"unstarring_gist\">正在移除 Gist 的星號…</string>\n    <string name=\"accounts_label\">帳戶</string>\n    <string name=\"select_assignee\">選擇被指派人</string>\n    <string name=\"select_milestone\">選擇里程碑</string>\n    <string name=\"select_labels\">選擇標簽</string>\n    <string name=\"select_ref\">選擇分支或標記</string>\n    <string name=\"no_milestone\">沒有里程碑</string>\n    <string name=\"unassigned\">沒有人被指派</string>\n    <string name=\"assigned\">被指派</string>\n    <string name=\"no_gists_found\">找不到 Gist</string>\n    <string name=\"confirm_gist_delete_title\">確認刪除</string>\n    <string name=\"confirm_gist_delete_message\">您確定要刪除這條 Gist 嗎?</string>\n    <string name=\"deleting_gist\">正在刪除 Gist…</string>\n    <string name=\"creating_comment\">正在建立評論…</string>\n    <string name=\"confirm_bookmark_delete_message\">您確定要刪除這個書籤嗎?</string>\n    <string name=\"issue_dashboard\">Issue 儀表板</string>\n    <string name=\"new_issue\">新 Issue</string>\n    <string name=\"anonymous\">匿名</string>\n    <string name=\"message_filter_saved\">Issue 篩選器已存至書籤</string>\n    <string name=\"recent\">最近的</string>\n    <string name=\"section_issue_status\">狀態:</string>\n    <string name=\"status_open\">開放</string>\n    <string name=\"status_closed\">關閉</string>\n    <string name=\"section_issue_assigned\">指派給:</string>\n    <string name=\"assignee_anyone\">任何人</string>\n    <string name=\"section_issue_milestone\">里程碑:</string>\n    <string name=\"none\">無</string>\n    <string name=\"section_issue_labels\">標籤:</string>\n    <string name=\"log_in\">登入</string>\n    <string name=\"signup_link\">剛接觸 GitHub? &lt;a href=\\\"https://github.com/join\\\">點這裡&lt;/a>註冊</string>\n    <string name=\"connection_failed\">無法連接到 GitHub</string>\n    <string name=\"invalid_login_or_password\">請輸入正確的帳號與密碼</string>\n    <string name=\"invalid_password\">請輸入正確的密碼.</string>\n    <string name=\"password\">密碼</string>\n    <string name=\"login_or_email\">帳號或電子郵件</string>\n    <string name=\"followers\">追隨我的</string>\n    <string name=\"following\">我追隨的</string>\n    <string name=\"followers_self\">追隨我的</string>\n    <string name=\"following_self\">我追隨的</string>\n    <string name=\"members\">成員</string>\n    <string name=\"closing_issue\">正在關閉 Issue…</string>\n    <string name=\"reopening_issue\">正在重新打開 Issue…</string>\n    <string name=\"avatar\">頭像</string>\n    <string name=\"creating_issue\">正在建立 Issue…</string>\n    <string name=\"prefix_created\">建立於\\u0020</string>\n    <string name=\"prefix_updated\">已更新於\\u0020</string>\n    <string name=\"prefix_opened\">已打開於\\u0020</string>\n    <string name=\"clear\">清除</string>\n    <string name=\"open_issues\">開放中的 Issue</string>\n    <string name=\"closed_issues\">已關閉的 Issue</string>\n    <string name=\"confirm_bookmark_delete_title\">刪除書籤</string>\n    <string name=\"save\">儲存</string>\n    <string name=\"apply\">套用</string>\n    <string name=\"labels_prefix\">標籤:</string>\n    <string name=\"assignee\">被指派人</string>\n    <string name=\"milestone\">里程碑:</string>\n    <string name=\"labels\">標籤</string>\n    <string name=\"issue_confirm_close_message\">您確定要關閉這個 Issue?</string>\n    <string name=\"issue_confirm_reopen_message\">您確定要重新開啓這個 Issue?</string>\n    <string name=\"issue_confirm_close_title\">關閉 Issue</string>\n    <string name=\"issue_confirm_reopen_title\">重新打開的 Issue</string>\n    <string name=\"closed\">已關閉於</string>\n    <string name=\"no_description_given\">沒有描述.</string>\n    <string name=\"close\">關閉</string>\n    <string name=\"reopen\">重新打開</string>\n    <string name=\"title_invalid_github_url\">無效的 GitHub URL</string>\n    <string name=\"message_invalid_github_url\">無法打開下列的 URL:\\n{0}</string>\n    <string name=\"recently_viewed\">最近檢視過的</string>\n    <string name=\"cancel\">取消</string>\n    <string name=\"authenticator_conflict_title\">App衝突</string>\n    <string name=\"authenticator_conflict_message\">已有另一個已安裝的App配置了GitHub的認證.\\n\\n您必須從 帳號與同步處理 中移除認證並反安裝該APP，才能使用GitHub.</string>\n    <string name=\"opening_repository\">正在打開 {0}…</string>\n    <string name=\"commit_compare_title\">提交比較</string>\n    <string name=\"commit_prefix\">提交\\u0020</string>\n    <string name=\"parent_prefix\">Parent\\u0020</string>\n    <string name=\"authored\">撰寫於</string>\n    <string name=\"committed\">提交於</string>\n    <string name=\"diff_line_message\">您想要怎麼做?</string>\n    <string name=\"comment_on_line\">評論此行</string>\n    <string name=\"view_entire_file\">檢視整個檔案</string>\n    <string name=\"comparing_commits\">比較 {0} 個提交</string>\n    <string name=\"enable_wrapping\">啟用自動換行</string>\n    <string name=\"disable_wrapping\">停用自動換行</string>\n    <string name=\"code\">原始碼</string>\n    <!-- Tab titles, should be as short as possible -->\n    <string name=\"tab_repositories\">檔案庫</string>\n    <string name=\"tab_news\">新聞</string>\n    <string name=\"tab_following_self\">我追隨的</string>\n    <string name=\"tab_followers_self\">追隨我的</string>\n    <string name=\"tab_following\">我追隨的</string>\n    <string name=\"tab_followers\">追隨我的</string>\n    <string name=\"tab_members\">成員</string>\n    <string name=\"tab_code\">原始碼</string>\n    <string name=\"tab_commits\">提交</string>\n    <string name=\"tab_issues\">issues</string>\n    <string name=\"tab_watched\">我關注的</string>\n    <string name=\"tab_assigned\">指派給我的</string>\n    <string name=\"tab_created\">我建立的</string>\n    <string name=\"tab_mentioned\">提到我的</string>\n    <string name=\"tab_mine\">我的</string>\n    <string name=\"tab_starred\">已加星號</string>\n    <string name=\"tab_all\">全部</string>\n    <!--  -->\n</resources>\n"
  },
  {
    "path": "app/src/main/res/xml/authenticator.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<account-authenticator xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:accountType=\"@string/account_type\"\n    android:icon=\"@drawable/app_icon\"\n    android:label=\"@string/app_name\"\n    android:smallIcon=\"@drawable/app_icon\" />\n"
  },
  {
    "path": "app/src/main/res/xml/searchable_issues.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<searchable xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:hint=\"@string/find_issues\"\n    android:label=\"@string/app_name\"\n    android:searchSuggestAuthority=\"@string/provider_authority_search_suggest_issues\"\n    android:searchSuggestSelection=\" ?\"\n    android:voiceSearchMode=\"showVoiceSearchButton|launchRecognizer\" />\n"
  },
  {
    "path": "app/src/main/res/xml/searchable_repos_users.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<searchable xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:hint=\"@string/global_search\"\n    android:label=\"@string/app_name\"\n    android:searchSuggestAuthority=\"@string/provider_authority_search_suggest_repos\"\n    android:searchSuggestSelection=\" ?\"\n    android:voiceSearchMode=\"showVoiceSearchButton|launchRecognizer\" />\n"
  },
  {
    "path": "app/src/main/res/xml/sync_adapter.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ~ Copyright (c) 2015 PocketHub\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<sync-adapter xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:accountType=\"@string/account_type\"\n    android:contentAuthority=\"@string/provider_authority_sync\"\n    android:supportsUploading=\"false\" />\n"
  },
  {
    "path": "app/src/main/sqldelight/com.github.pockethub.android/10.sqm",
    "content": "ALTER TABLE repos RENAME TO repositories;"
  },
  {
    "path": "app/src/main/sqldelight/com.github.pockethub.android/11.sqm",
    "content": "PRAGMA foreign_keys=off;\n\nBEGIN TRANSACTION;\n\nDROP TABLE IF EXISTS repositories;\n\nCREATE TABLE repositories\n(\n    id INTEGER PRIMARY KEY,\n    repoId INTEGER UNIQUE,\n    orgId INTEGER,\n    name TEXT,\n    ownerId INTEGER,\n    private INTEGER,\n    fork INTEGER,\n    description TEXT,\n    forks INTEGER,\n    watchers INTEGER,\n    language TEXT,\n    hasIssues INTEGER,\n    mirrorUrl TEXT,\n    permissions_admin INTEGER,\n    permissions_pull INTEGER,\n    permissions_push INTEGER\n);\n\nCOMMIT;\n\nPRAGMA foreign_keys=on;"
  },
  {
    "path": "app/src/main/sqldelight/com.github.pockethub.android/12.sqm",
    "content": "CREATE TABLE labels (\n    repo_id INTEGER,\n    name TEXT,\n    color TEXT,\n    PRIMARY KEY (repo_id, name)\n);\n\nCREATE TABLE milestones (\n    repo_id INTEGER,\n    title TEXT,\n    state TEXT,\n    milestone_id INTEGER,\n    number INTEGER,\n    PRIMARY KEY (repo_id, milestone_id)\n);\n\nCREATE TABLE issue_filters (\n    id TEXT PRIMARY KEY,\n    repo_id INTEGER,\n    milestone_id INTEGER,\n    assignee_id INTEGER,\n    open INTEGER,\n    direction TEXT,\n    sort_type TEXT,\n\n    FOREIGN KEY (repo_id) REFERENCES repositories(repoId),\n    FOREIGN KEY (repo_id, milestone_id) REFERENCES milestones(repo_id, milestone_id),\n    FOREIGN KEY (assignee_id) REFERENCES users(id)\n);\n\nCREATE TABLE issue_filter_labels (\n    issue_filter_id TEXT,\n    repo_id INTEGER,\n    name TEXT,\n\n    FOREIGN KEY (issue_filter_id) REFERENCES issue_filters(id),\n    FOREIGN KEY (repo_id, name) REFERENCES labels(repo_id, name)\n);"
  },
  {
    "path": "app/src/main/sqldelight/com.github.pockethub.android/9.sqm",
    "content": "ALTER TABLE orgs RENAME TO organizations;\nALTER TABLE users ADD COLUMN login TEXT;\nUPDATE users SET login = name;\nUPDATE users SET name = NULL;"
  },
  {
    "path": "app/src/main/sqldelight/com.github.pockethub.android/issue_filter.sq",
    "content": "import java.lang.Boolean;\nimport com.meisolsson.githubsdk.model.IssueState;\n\nCREATE TABLE labels (\n    repo_id INTEGER,\n    name TEXT,\n    color TEXT,\n    PRIMARY KEY (repo_id, name)\n);\n\nCREATE TABLE milestones (\n    repo_id INTEGER,\n    title TEXT,\n    state TEXT AS IssueState,\n    milestone_id INTEGER,\n    number INTEGER,\n    PRIMARY KEY (repo_id, milestone_id)\n);\n\nCREATE TABLE issue_filters (\n    id TEXT PRIMARY KEY,\n    repo_id INTEGER,\n    milestone_id INTEGER,\n    assignee_id INTEGER,\n    open INTEGER AS Boolean,\n    direction TEXT,\n    sort_type TEXT,\n\n    FOREIGN KEY (repo_id) REFERENCES repositories(repoId),\n    FOREIGN KEY (repo_id, milestone_id) REFERENCES milestones(repo_id, milestone_id),\n    FOREIGN KEY (assignee_id) REFERENCES users(id)\n);\n\nCREATE TABLE issue_filter_labels (\n    issue_filter_id TEXT,\n    repo_id INTEGER,\n    name TEXT,\n\n    FOREIGN KEY (issue_filter_id) REFERENCES issue_filters(id),\n    FOREIGN KEY (repo_id, name) REFERENCES labels(repo_id, name)\n);\n\ninsertOrReplaceIssueFilter:\nINSERT OR REPLACE\nINTO issue_filters(id, repo_id, milestone_id, assignee_id, open, direction, sort_type)\nVALUES (?, ?, ?, ?, ?, ?, ?);\n\ninsertOrReplaceLabel:\nINSERT OR REPLACE\nINTO labels(repo_id, name, color)\nVALUES (?, ?, ?);\n\ninsertOrReplaceIssueFilterLabel:\nINSERT OR REPLACE\nINTO issue_filter_labels(issue_filter_id, repo_id, name)\nVALUES (?, ?, ?);\n\ninsertOrReplaceMilestone:\nINSERT OR REPLACE\nINTO milestones(repo_id, title, state, milestone_id, number)\nVALUES (?, ?, ?, ?, ?);\n\nremoveIssueFilter:\nDELETE FROM issue_filters WHERE id = ?;\n\nremoveIssueFilterLabel:\nDELETE FROM issue_filter_labels WHERE issue_filter_id = ? AND repo_id = ? AND name = ?;\n\nclearIssueFilters:\nDELETE FROM issue_filter_labels;\n\nclearMilestones:\nDELETE FROM issue_filters;\n\nclearLabels:\nDELETE FROM labels;\n\nclearIssueFilterLabels:\nDELETE FROM issue_filter_labels;\n\ngetFilters:\nSELECT *\nFROM issue_filters\nLEFT JOIN milestones\nUSING (repo_id, milestone_id)\nLEFT JOIN repositories\nON repositories.repoId = issue_filters.repo_id\nLEFT JOIN users\nON users.id = issue_filters.assignee_id;\n\ngetFilterLabels:\nSELECT *\nFROM issue_filter_labels\nJOIN labels\nON issue_filter_labels.repo_id = labels.repo_id AND issue_filter_labels.name = labels.name\nWHERE issue_filter_id = ?;\n\n"
  },
  {
    "path": "app/src/main/sqldelight/com.github.pockethub.android/organizations.sq",
    "content": "-- This contains Users and Organizations\nCREATE TABLE organizations (\n    id INTEGER PRIMARY KEY\n);\n\nCREATE TABLE users (\n    id INTEGER PRIMARY KEY,\n    login TEXT,\n    name TEXT,\n    avatarurl TEXT\n);\n\nselectUserAndOrgs:\nSELECT users.id, login, name, avatarurl\nFROM organizations\nJOIN users\nUSING (id);\n\nselectUser:\nSELECT *\nFROM users\nWHERE id = ?;\n\nclearOrgs:\nDELETE FROM organizations;\n\nclearUsers:\nDELETE FROM users;\n\nreplaceUser:\nREPLACE INTO users(id, login, name, avatarurl)\nVALUES (?, ?, ?, ?);\n\ninsertOrg:\nINSERT INTO organizations(id)\nVALUES (?);"
  },
  {
    "path": "app/src/main/sqldelight/com.github.pockethub.android/repositories.sq",
    "content": "CREATE TABLE repositories (\n    id INTEGER PRIMARY KEY,\n    repoId INTEGER UNIQUE,\n    orgId INTEGER,\n    name TEXT,\n    ownerId INTEGER,\n    private INTEGER as Boolean,\n    fork INTEGER as Boolean,\n    description TEXT,\n    forks INTEGER as Int,\n    watchers INTEGER as Int,\n    language TEXT,\n    hasIssues INTEGER as Boolean,\n    mirrorUrl TEXT,\n    permissions_admin INTEGER as Boolean,\n    permissions_pull INTEGER as Boolean,\n    permissions_push INTEGER as Boolean\n);\n\nselectUserRepositories:\nSELECT repoId, repositories.name, users.id, users.login, users.name, users.avatarurl, repositories.private, repositories.fork, repositories.description, repositories.forks, repositories.watchers, repositories.language, repositories.hasIssues, repositories.mirrorUrl, repositories.permissions_admin, repositories.permissions_pull, repositories.permissions_push\nFROM repositories\nLEFT JOIN users\nON repositories.ownerId = users.id\nWHERE repositories.orgId = ?;\n\nclearUserRepositories:\nDELETE FROM repositories WHERE orgId = ?;\n\nclearRepositories:\nDELETE FROM repositories;\n\nreplaceRepo:\nREPLACE\nINTO repositories(repoId, name, orgId, ownerId, private, fork, description, forks, watchers, language, hasIssues, mirrorUrl, permissions_admin, permissions_pull, permissions_push)\nVALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);\n"
  },
  {
    "path": "app/src/test/java/com/github/pockethub/android/AccountManagerShadow.java",
    "content": "package com.github.pockethub.android;\n\nimport android.accounts.Account;\nimport android.accounts.AccountManager;\nimport android.content.Context;\nimport androidx.test.core.app.ApplicationProvider;\nimport org.robolectric.annotation.Implementation;\nimport org.robolectric.annotation.Implements;\nimport org.robolectric.shadows.ShadowAccountManager;\n\nimport static org.mockito.Mockito.mock;\nimport static org.mockito.Mockito.when;\n\n@Implements(AccountManager.class)\npublic class AccountManagerShadow extends ShadowAccountManager {\n\n    public static AccountManager mockManager;\n    public static Account[] accounts;\n\n    static {\n        String accountType = ApplicationProvider.getApplicationContext().getString(R.string.account_type);\n        Account firstGitHubAccount = new Account(\"GitHubAccount\", accountType);\n        Account secondGitHubAccount = new Account(\"GitHubAccount2\", accountType);\n        accounts = new Account[]{firstGitHubAccount, secondGitHubAccount};\n        mockManager = mock(AccountManager.class);\n\n        when(mockManager.getAccountsByType(accountType)).thenReturn(accounts);\n    }\n\n    @Implementation\n    public static AccountManager get(Context context) {\n        return mockManager;\n    }\n}"
  },
  {
    "path": "app/src/test/java/com/github/pockethub/android/ui/MainActivityTest.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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\npackage com.github.pockethub.android.ui;\n\nimport android.accounts.Account;\nimport android.os.Build;\nimport android.view.MenuItem;\nimport androidx.test.core.app.ApplicationProvider;\nimport com.github.pockethub.android.AccountManagerShadow;\nimport com.github.pockethub.android.R;\nimport com.github.pockethub.android.ui.gist.GistsPagerFragment;\nimport com.github.pockethub.android.ui.issue.FilterListFragment;\nimport com.github.pockethub.android.ui.issue.IssueDashboardPagerFragment;\nimport com.github.pockethub.android.ui.user.HomePagerFragment;\nimport com.meisolsson.githubsdk.model.User;\nimport org.junit.Before;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.mockito.ArgumentCaptor;\nimport org.robolectric.Robolectric;\nimport org.robolectric.RobolectricTestRunner;\nimport org.robolectric.annotation.Config;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport static org.hamcrest.CoreMatchers.*;\nimport static org.junit.Assert.assertThat;\nimport static org.mockito.Mockito.any;\nimport static org.mockito.Mockito.*;\n\n@RunWith(RobolectricTestRunner.class)\n@Config(shadows = AccountManagerShadow.class)\npublic class MainActivityTest {\n\n    private MainActivity mainActivity;\n    private ArgumentCaptor<Account> argumentCaptor;\n\n    @Before\n    public void setup() {\n        mainActivity = Robolectric.buildActivity(MainActivity.class).create().get();\n\n        List<User> org = new ArrayList<>();\n        org.add(User.builder().build());\n\n        mainActivity.onOrgsLoaded(org);\n        argumentCaptor = ArgumentCaptor.forClass(Account.class);\n    }\n\n    private MenuItem getMockMenuItem(int id, String title) {\n        MenuItem mockedMenuItem = mock(MenuItem.class);\n        when(mockedMenuItem.getItemId()).thenReturn(id);\n        when(mockedMenuItem.getTitle()).thenReturn(title);\n        return mockedMenuItem;\n    }\n\n    @Test\n    public void testNavigationDrawerClickListenerPos1_ShouldReplaceHomePagerFragmentToContainer() {\n        mainActivity.onNavigationItemSelected(getMockMenuItem(R.id.navigation_home, \"HomeTitle\"));\n\n        String expectedString = ApplicationProvider.getApplicationContext().getString(R.string.app_name);\n        assertFragmentInstanceAndSupportActionBarTitle(HomePagerFragment.class, expectedString);\n    }\n\n    @Test\n    public void testNavigationDrawerClickListenerPos2_ShouldReplaceGistsPagerFragmentToContainer() {\n        mainActivity.onNavigationItemSelected(getMockMenuItem(R.id.navigation_gists, \"GistTitle\"));\n\n        assertFragmentInstanceAndSupportActionBarTitle(GistsPagerFragment.class, \"GistTitle\");\n    }\n\n    @Test\n    public void testNavigationDrawerClickListenerPos3_ShouldReplaceIssueDashboardPagerFragmentToContainer() {\n        mainActivity.onNavigationItemSelected(getMockMenuItem(R.id.navigation_issue_dashboard, \"IssueDashboard\"));\n\n        assertFragmentInstanceAndSupportActionBarTitle(IssueDashboardPagerFragment.class, \"IssueDashboard\");\n    }\n\n    @Test\n    public void testNavigationDrawerClickListenerPos4_ShouldReplaceFilterListFragmentToContainer() {\n        mainActivity.onNavigationItemSelected(getMockMenuItem(R.id.navigation_bookmarks, \"Bookmarks\"));\n\n        assertFragmentInstanceAndSupportActionBarTitle(FilterListFragment.class, \"Bookmarks\");\n    }\n\n    @Test\n    public void testNavigationDrawerClickListenerPos5_ShouldLogoutUser() {\n        mainActivity.onNavigationItemSelected(getMockMenuItem(R.id.navigation_log_out, \"Logout\"));\n\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {\n            verify(AccountManagerShadow.mockManager, times(2)).removeAccountExplicitly(argumentCaptor.capture());\n        } else {\n            verify(AccountManagerShadow.mockManager, times(2)).removeAccount(argumentCaptor.capture(),\n                    any(), any());\n        }\n\n        List<Account> values = argumentCaptor.getAllValues();\n        assertThat(values.get(0), is(equalTo(AccountManagerShadow.accounts[0])));\n        assertThat(values.get(1), is(equalTo(AccountManagerShadow.accounts[1])));\n    }\n\n    private void assertFragmentInstanceAndSupportActionBarTitle(Class expectedInstance, String expectedSupportActionBarTitle) {\n        assertThat(mainActivity.getCurrentFragment(), is(instanceOf(expectedInstance)));\n        assertThat(mainActivity.getSupportActionBar().getTitle().toString(), is(equalTo(expectedSupportActionBarTitle)));\n    }\n\n}\n"
  },
  {
    "path": "app/src/test/java/com/github/pockethub/android/util/ConvertUtilsTest.java",
    "content": "/*\n * Copyright (c) 2015 PocketHub\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\npackage com.github.pockethub.android.util;\n\nimport com.meisolsson.githubsdk.model.GitHubEvent;\nimport com.meisolsson.githubsdk.model.Repository;\n\nimport org.junit.Before;\nimport org.junit.Test;\n\nimport static org.hamcrest.CoreMatchers.equalTo;\nimport static org.junit.Assert.assertThat;\n\npublic class ConvertUtilsTest {\n\n\tprivate static final String REPO_NAME_FIRST_PART = \"first\";\n\tprivate static final String REPO_NAME_SECOND_PART = \"second\";\n\tprivate static final String REPO_NAME = REPO_NAME_FIRST_PART + \"/\" + REPO_NAME_SECOND_PART;\n\n\tprivate GitHubEvent event;\n\n\t@Before\n\tpublic void setup() {\n\t\tGitHubEvent.RepoIdentifier repo = GitHubEvent.RepoIdentifier.builder()\n\t\t\t\t.repoWithUserName(REPO_NAME)\n\t\t\t\t.build();\n\n\t\tevent = GitHubEvent.builder()\n                .repo(repo)\n                .build();\n\t}\n\n\t@Test\n\tpublic void testOriginalRepoIsNotChanged() {\n\t\tConvertUtils.eventRepoToRepo(event.repo());\n\t\tassertThat(event.repo().repoWithUserName(), equalTo(REPO_NAME));\n\t}\n\n\t@Test\n\tpublic void testNewRepoIsCreated() {\n\t\tRepository newRepo = ConvertUtils.eventRepoToRepo(event.repo());\n\t\tassertThat(newRepo.owner().login(), equalTo(REPO_NAME_FIRST_PART));\n\t\tassertThat(newRepo.name(), equalTo(REPO_NAME_SECOND_PART));\n\t}\n\n}\n"
  },
  {
    "path": "build.gradle",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    ext.kotlin_version = '1.3.61'\n    repositories {\n        jcenter()\n        google()\n    }\n    dependencies {\n        classpath 'com.android.tools.build:gradle:3.6.1'\n        classpath \"org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version\"\n        classpath 'com.github.ben-manes:gradle-versions-plugin:0.17.0'\n        classpath 'com.squareup.sqldelight:gradle-plugin:1.2.2'\n    }\n}\n\nallprojects {\n    repositories {\n        jcenter()\n        google()\n        mavenLocal()\n        maven { url \"https://oss.sonatype.org/content/repositories/snapshots\" }\n    }\n}\n"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "#Sat Mar 28 20:07:55 CET 2020\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-5.6.4-all.zip\n"
  },
  {
    "path": "gradle.properties",
    "content": "android.useAndroidX=true\nandroid.enableJetifier=true\nandroid.enableUnitTestBinaryResources=true"
  },
  {
    "path": "gradlew",
    "content": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\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=\"\"\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn ( ) {\n    echo \"$*\"\n}\n\ndie ( ) {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\nesac\n\n# For Cygwin, ensure paths are in UNIX format before anything is touched.\nif $cygwin ; then\n    [ -n \"$JAVA_HOME\" ] && JAVA_HOME=`cygpath --unix \"$JAVA_HOME\"`\nfi\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >&-\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >&-\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\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    which java >/dev/null 2>&1 || 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.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules\nfunction splitJvmOpts() {\n    JVM_OPTS=(\"$@\")\n}\neval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\nJVM_OPTS[${#JVM_OPTS[*]}]=\"-Dorg.gradle.appname=$APP_BASE_NAME\"\n\nexec \"$JAVACMD\" \"${JVM_OPTS[@]}\" -classpath \"$CLASSPATH\" org.gradle.wrapper.GradleWrapperMain \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem  Gradle startup script for Windows\n@rem\n@rem ##########################################################################\n\n@rem Set local scope for the variables with windows NT shell\nif \"%OS%\"==\"Windows_NT\" setlocal\n\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nset DEFAULT_JVM_OPTS=\n\nset DIRNAME=%~dp0\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\nset APP_BASE_NAME=%~n0\nset APP_HOME=%DIRNAME%\n\n@rem Find java.exe\nif defined JAVA_HOME goto findJavaFromJavaHome\n\nset JAVA_EXE=java.exe\n%JAVA_EXE% -version >NUL 2>&1\nif \"%ERRORLEVEL%\" == \"0\" goto init\n\necho.\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:findJavaFromJavaHome\nset JAVA_HOME=%JAVA_HOME:\"=%\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\n\nif exist \"%JAVA_EXE%\" goto init\n\necho.\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:init\n@rem Get command-line arguments, handling Windowz variants\n\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\nif \"%@eval[2+2]\" == \"4\" goto 4NT_args\n\n:win9xME_args\n@rem Slurp the command line arguments.\nset CMD_LINE_ARGS=\nset _SKIP=2\n\n:win9xME_args_slurp\nif \"x%~1\" == \"x\" goto execute\n\nset CMD_LINE_ARGS=%*\ngoto execute\n\n:4NT_args\n@rem Get arguments from the 4NT Shell from JP Software\nset CMD_LINE_ARGS=%$\n\n:execute\n@rem Setup the command line\n\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\n\n@rem Execute Gradle\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\n\n:end\n@rem End local scope for the variables with windows NT shell\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\n\n:fail\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\nrem the _cmd.exe /c_ return code!\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\nexit /b 1\n\n:mainEnd\nif \"%OS%\"==\"Windows_NT\" endlocal\n\n:omega\n"
  },
  {
    "path": "proguard.cfg",
    "content": "-ignorewarnings\n-dontoptimize\n-dontobfuscate\n-dontskipnonpubliclibraryclasses\n\n-ignorewarnings\n\n-renamesourcefileattribute SourceFile\n\n-keepattributes SourceFile,LineNumberTable,*Annotation*\n\n-printmapping map.txt\n-printseeds seed.txt\n\n-keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); }\n\n-keep public class * extends android.app.Activity\n-keep public class * extends android.app.Application\n-keep public class * extends android.app.Service\n-keep public class * extends android.content.BroadcastReceiver\n-keep public class * extends android.content.ContentProvider\n-keep public class * extends android.view.View { public <init>(android.content.Context); public <init>(android.content.Context, android.util.AttributeSet); public <init>(android.content.Context, android.util.AttributeSet, int); public void set*(...); }\n\n-keepclassmembers class * extends android.app.Activity { public void *(android.view.View); }\n-keepclassmembers class android.support.v4.app.Fragment { *** getActivity(); public *** onCreate(); public *** onCreateOptionsMenu(...); }\n\n-keepclassmembers class * { @com.google.inject.Provides *; @android.test.suitebuilder.annotation.* *; void test*(...); }\n\n-keep class com.google.inject.Binder\n-keep class com.google.inject.Key\n-keep class com.google.inject.Provider\n-keep class com.google.inject.TypeLiteral\n\n-keepclassmembers class * { @com.google.inject.Inject <init>(...); }\n-keepclassmembers class com.google.inject.assistedinject.FactoryProvider2 { *; }\n-keepclassmembers class com.google.** {\n    private void finalizeReferent();\n    protected void finalizeReferent();\n    public void finalizeReferent();\n    void finalizeReferent();\n\n    private *** startFinalizer(java.lang.Class,java.lang.Object);\n    protected *** startFinalizer(java.lang.Class,java.lang.Object);\n    public *** startFinalizer(java.lang.Class,java.lang.Object);\n    *** startFinalizer(java.lang.Class,java.lang.Object);\n}\n\n-keep class com.github.pockethub.**\n-keepclassmembers class com.github.pockethub.** { *; }\n-keepclassmembers class com.github.pockethub.** { public <init>(...); }\n-keep class org.eclipse.egit.github.**\n-keepclassmembers class com.github.pockethub.** { public <init>(...); }\n-keepclassmembers class org.eclipse.egit.github.** { *; }\n\n-keep class !android.support.v7.internal.view.menu.**,** {*;}\n"
  },
  {
    "path": "script/style/checkstyle.xml",
    "content": "<?xml version=\"1.0\"?>\n<!DOCTYPE module PUBLIC\n    \"-//Puppy Crawl//DTD Check Configuration 1.3//EN\"\n    \"http://www.puppycrawl.com/dtds/configuration_1_3.dtd\">\n\n<!--\n    Modified from https://github.com/checkstyle/checkstyle/blob/master/src/main/resources/google_checks.xml.\n    Modifications are:\n    - doubled each value in Indentation\n\n    Checkstyle configuration that checks the Google coding conventions from Google Java Style\n    that can be found at https://google.github.io/styleguide/javaguide.html.\n\n    Checkstyle is very configurable. Be sure to read the documentation at\n    http://checkstyle.sf.net (or in your downloaded distribution).\n\n    To completely disable a check, just comment it out or delete it from the file.\n\n    Authors: Max Vetrenko, Ruslan Diachenko, Roman Ivanov.\n -->\n\n<module name = \"Checker\">\n    <property name=\"charset\" value=\"UTF-8\"/>\n\n    <property name=\"severity\" value=\"warning\"/>\n\n    <property name=\"fileExtensions\" value=\"java, properties, xml\"/>\n    <!-- Checks for whitespace                               -->\n    <!-- See http://checkstyle.sf.net/config_whitespace.html -->\n    <module name=\"FileTabCharacter\">\n        <property name=\"eachLine\" value=\"true\"/>\n    </module>\n\n    <module name=\"TreeWalker\">\n        <module name=\"OuterTypeFilename\"/>\n        <module name=\"IllegalTokenText\">\n            <property name=\"tokens\" value=\"STRING_LITERAL, CHAR_LITERAL\"/>\n            <property name=\"format\" value=\"\\\\u00(09|0(a|A)|0(c|C)|0(d|D)|22|27|5(C|c))|\\\\(0(10|11|12|14|15|42|47)|134)\"/>\n            <property name=\"message\" value=\"Consider using special escape sequence instead of octal value or Unicode escaped value.\"/>\n        </module>\n        <module name=\"AvoidEscapedUnicodeCharacters\">\n            <property name=\"allowEscapesForControlCharacters\" value=\"true\"/>\n            <property name=\"allowByTailComment\" value=\"true\"/>\n            <property name=\"allowNonPrintableEscapes\" value=\"true\"/>\n        </module>\n        <module name=\"LineLength\">\n            <property name=\"max\" value=\"100\"/>\n            <property name=\"ignorePattern\" value=\"^package.*|^import.*|a href|href|http://|https://|ftp://\"/>\n        </module>\n        <module name=\"AvoidStarImport\"/>\n        <module name=\"OneTopLevelClass\"/>\n        <module name=\"NoLineWrap\"/>\n        <module name=\"EmptyBlock\">\n            <property name=\"option\" value=\"TEXT\"/>\n            <property name=\"tokens\" value=\"LITERAL_TRY, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE, LITERAL_SWITCH\"/>\n        </module>\n        <module name=\"NeedBraces\"/>\n        <module name=\"LeftCurly\">\n            <property name=\"maxLineLength\" value=\"100\"/>\n        </module>\n        <module name=\"RightCurly\">\n            <property name=\"id\" value=\"RightCurlySame\"/>\n            <property name=\"tokens\" value=\"LITERAL_TRY, LITERAL_CATCH, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE, LITERAL_DO\"/>\n        </module>\n        <module name=\"RightCurly\">\n            <property name=\"id\" value=\"RightCurlyAlone\"/>\n            <property name=\"option\" value=\"alone\"/>\n            <property name=\"tokens\" value=\"CLASS_DEF, METHOD_DEF, CTOR_DEF, LITERAL_FOR, LITERAL_WHILE, STATIC_INIT, INSTANCE_INIT\"/>\n        </module>\n        <module name=\"WhitespaceAround\">\n            <property name=\"allowEmptyConstructors\" value=\"true\"/>\n            <property name=\"allowEmptyMethods\" value=\"true\"/>\n            <property name=\"allowEmptyTypes\" value=\"true\"/>\n            <property name=\"allowEmptyLoops\" value=\"true\"/>\n            <message key=\"ws.notFollowed\"\n                     value=\"WhitespaceAround: ''{0}'' is not followed by whitespace. Empty blocks may only be represented as '{}' when not part of a multi-block statement (4.1.3)\"/>\n            <message key=\"ws.notPreceded\"\n                     value=\"WhitespaceAround: ''{0}'' is not preceded with whitespace.\"/>\n        </module>\n        <module name=\"OneStatementPerLine\"/>\n        <module name=\"MultipleVariableDeclarations\"/>\n        <module name=\"ArrayTypeStyle\"/>\n        <module name=\"MissingSwitchDefault\"/>\n        <module name=\"FallThrough\"/>\n        <module name=\"UpperEll\"/>\n        <module name=\"ModifierOrder\"/>\n        <module name=\"EmptyLineSeparator\">\n            <property name=\"allowNoEmptyLineBetweenFields\" value=\"true\"/>\n        </module>\n        <module name=\"SeparatorWrap\">\n            <property name=\"id\" value=\"SeparatorWrapDot\"/>\n            <property name=\"tokens\" value=\"DOT\"/>\n            <property name=\"option\" value=\"nl\"/>\n        </module>\n        <module name=\"SeparatorWrap\">\n            <property name=\"id\" value=\"SeparatorWrapComma\"/>\n            <property name=\"tokens\" value=\"COMMA\"/>\n            <property name=\"option\" value=\"EOL\"/>\n        </module>\n        <module name=\"PackageName\">\n            <property name=\"format\" value=\"^[a-z]+(\\.[a-z][a-z0-9]*)*$\"/>\n            <message key=\"name.invalidPattern\"\n                     value=\"Package name ''{0}'' must match pattern ''{1}''.\"/>\n        </module>\n        <module name=\"TypeName\">\n            <message key=\"name.invalidPattern\"\n                     value=\"Type name ''{0}'' must match pattern ''{1}''.\"/>\n        </module>\n        <module name=\"MemberName\">\n            <property name=\"format\" value=\"^[a-z][a-z0-9][a-zA-Z0-9]*$\"/>\n            <message key=\"name.invalidPattern\"\n                     value=\"Member name ''{0}'' must match pattern ''{1}''.\"/>\n        </module>\n        <module name=\"ParameterName\">\n            <property name=\"format\" value=\"^[a-z]([a-z0-9][a-zA-Z0-9]*)?$\"/>\n            <message key=\"name.invalidPattern\"\n                     value=\"Parameter name ''{0}'' must match pattern ''{1}''.\"/>\n        </module>\n        <module name=\"CatchParameterName\">\n            <property name=\"format\" value=\"^[a-z]([a-z0-9][a-zA-Z0-9]*)?$\"/>\n            <message key=\"name.invalidPattern\"\n                     value=\"Catch parameter name ''{0}'' must match pattern ''{1}''.\"/>\n        </module>\n        <module name=\"LocalVariableName\">\n            <property name=\"tokens\" value=\"VARIABLE_DEF\"/>\n            <property name=\"format\" value=\"^[a-z]([a-z0-9][a-zA-Z0-9]*)?$\"/>\n            <message key=\"name.invalidPattern\"\n                     value=\"Local variable name ''{0}'' must match pattern ''{1}''.\"/>\n        </module>\n        <module name=\"ClassTypeParameterName\">\n            <property name=\"format\" value=\"(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)\"/>\n            <message key=\"name.invalidPattern\"\n                     value=\"Class type name ''{0}'' must match pattern ''{1}''.\"/>\n        </module>\n        <module name=\"MethodTypeParameterName\">\n            <property name=\"format\" value=\"(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)\"/>\n            <message key=\"name.invalidPattern\"\n                     value=\"Method type name ''{0}'' must match pattern ''{1}''.\"/>\n        </module>\n        <module name=\"InterfaceTypeParameterName\">\n            <property name=\"format\" value=\"(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)\"/>\n            <message key=\"name.invalidPattern\"\n                     value=\"Interface type name ''{0}'' must match pattern ''{1}''.\"/>\n        </module>\n        <module name=\"NoFinalizer\"/>\n        <module name=\"GenericWhitespace\">\n            <message key=\"ws.followed\"\n                     value=\"GenericWhitespace ''{0}'' is followed by whitespace.\"/>\n            <message key=\"ws.preceded\"\n                     value=\"GenericWhitespace ''{0}'' is preceded with whitespace.\"/>\n            <message key=\"ws.illegalFollow\"\n                     value=\"GenericWhitespace ''{0}'' should followed by whitespace.\"/>\n            <message key=\"ws.notPreceded\"\n                     value=\"GenericWhitespace ''{0}'' is not preceded with whitespace.\"/>\n        </module>\n        <module name=\"Indentation\">\n            <property name=\"basicOffset\" value=\"4\"/>\n            <property name=\"braceAdjustment\" value=\"0\"/>\n            <property name=\"caseIndent\" value=\"4\"/>\n            <property name=\"throwsIndent\" value=\"8\"/>\n            <property name=\"lineWrappingIndentation\" value=\"8\"/>\n            <property name=\"arrayInitIndent\" value=\"4\"/>\n        </module>\n        <module name=\"AbbreviationAsWordInName\">\n            <property name=\"ignoreFinal\" value=\"false\"/>\n            <property name=\"allowedAbbreviationLength\" value=\"1\"/>\n        </module>\n        <module name=\"OverloadMethodsDeclarationOrder\"/>\n        <module name=\"VariableDeclarationUsageDistance\"/>\n        <module name=\"CustomImportOrder\">\n            <property name=\"sortImportsInGroupAlphabetically\" value=\"true\"/>\n            <property name=\"separateLineBetweenGroups\" value=\"true\"/>\n            <property name=\"customImportOrderRules\" value=\"STATIC###THIRD_PARTY_PACKAGE\"/>\n        </module>\n        <module name=\"MethodParamPad\"/>\n        <module name=\"ParenPad\"/>\n        <module name=\"OperatorWrap\">\n            <property name=\"option\" value=\"NL\"/>\n            <property name=\"tokens\" value=\"BAND, BOR, BSR, BXOR, DIV, EQUAL, GE, GT, LAND, LE, LITERAL_INSTANCEOF, LOR, LT, MINUS, MOD, NOT_EQUAL, PLUS, QUESTION, SL, SR, STAR, METHOD_REF \"/>\n        </module>\n        <module name=\"AnnotationLocation\">\n            <property name=\"id\" value=\"AnnotationLocationMostCases\"/>\n            <property name=\"tokens\" value=\"CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF\"/>\n        </module>\n        <module name=\"AnnotationLocation\">\n            <property name=\"id\" value=\"AnnotationLocationVariables\"/>\n            <property name=\"tokens\" value=\"VARIABLE_DEF\"/>\n            <property name=\"allowSamelineMultipleAnnotations\" value=\"true\"/>\n        </module>\n        <module name=\"NonEmptyAtclauseDescription\"/>\n        <module name=\"JavadocTagContinuationIndentation\"/>\n        <module name=\"SummaryJavadoc\">\n            <property name=\"forbiddenSummaryFragments\" value=\"^@return the *|^This method returns |^A [{]@code [a-zA-Z0-9]+[}]( is a )\"/>\n        </module>\n        <module name=\"JavadocParagraph\"/>\n        <module name=\"AtclauseOrder\">\n            <property name=\"tagOrder\" value=\"@param, @return, @throws, @deprecated\"/>\n            <property name=\"target\" value=\"CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF, VARIABLE_DEF\"/>\n        </module>\n        <module name=\"JavadocMethod\">\n            <property name=\"scope\" value=\"public\"/>\n            <property name=\"allowMissingParamTags\" value=\"true\"/>\n            <property name=\"allowMissingThrowsTags\" value=\"true\"/>\n            <property name=\"allowMissingReturnTag\" value=\"true\"/>\n            <property name=\"minLineCount\" value=\"2\"/>\n            <property name=\"allowedAnnotations\" value=\"Override, Test\"/>\n            <property name=\"allowThrowsTagsForSubclasses\" value=\"true\"/>\n        </module>\n        <module name=\"MethodName\">\n            <property name=\"format\" value=\"^[a-z][a-z0-9][a-zA-Z0-9_]*$\"/>\n            <message key=\"name.invalidPattern\"\n                     value=\"Method name ''{0}'' must match pattern ''{1}''.\"/>\n        </module>\n        <module name=\"SingleLineJavadoc\">\n            <property name=\"ignoreInlineTags\" value=\"false\"/>\n        </module>\n        <module name=\"EmptyCatchBlock\">\n            <property name=\"exceptionVariableName\" value=\"expected\"/>\n        </module>\n        <module name=\"CommentsIndentation\"/>\n    </module>\n</module>\n"
  },
  {
    "path": "settings.gradle",
    "content": "include ':app'\n"
  }
]